1.準備
這段時間學習了Spring和Mybatis的知識,咱們知道持久層的 mapper,dao都須要spring進行管理, 須要spring經過單例的方式管理SqlSessionFactory,spring和mybatis整合生成代理對象使用sqlsessionFactory建立sqlsession;html
練習所有jar (Spring+Mybatis+Spring-mybatis整合包)下載 :java
http://download.csdn.net/detail/lablenet/9385114spring
demo數據準備 :sql
(1) 建立一個客戶表 :數據庫
-
- CREATE TABLE F_CLIENT(
- ID NUMBER(12) PRIMARY KEY,
- USERNAME VARCHAR2(20) NOT NULL,
- CLIENT_CERTIFICATE_NO VARCHAR2(20) NOT NULL UNIQUE,
- BORN_DATE DATE,
- FAMILY_REGISTER_ADDRESS VARCHAR2(200),
- NOW_ADDRESS VARCHAR2(200) NOT NULL,
- CONTACT_MODE VARCHAR2(50) NOT NULL,
- URGENCY_CONTACT_MODE VARCHAR2(50) NOT NULL,
- CREATE_DATE DATE NOT NULL
- );
--客戶表
CREATE TABLE F_CLIENT(
ID NUMBER(12) PRIMARY KEY,--用戶編號
USERNAME VARCHAR2(20) NOT NULL,--用戶姓名
CLIENT_CERTIFICATE_NO VARCHAR2(20) NOT NULL UNIQUE,--證件號碼
BORN_DATE DATE,--出生日期
FAMILY_REGISTER_ADDRESS VARCHAR2(200),--家庭住址
NOW_ADDRESS VARCHAR2(200) NOT NULL,--如今住址
CONTACT_MODE VARCHAR2(50) NOT NULL,--聯繫方式
URGENCY_CONTACT_MODE VARCHAR2(50) NOT NULL,--緊急聯繫方式
CREATE_DATE DATE NOT NULL--建立時間
);
(2) 初始化數據 :apache
- insert into f_client(id,username,client_certificate_no,born_date,family_register_address,now_address,contact_mode,urgency_contact_mode,create_date) values (14,
- 'yuan','311209070127',to_date('1993-03-12','yyyy-mm-dd'),'河南省焦做市','河南省河南理工大學','150000000','110',sysdate);
- insert into f_client(id,username,client_certificate_no,born_date,family_register_address,now_address,contact_mode,urgency_contact_mode,create_date) values(
- 15,'yang','311209070126',to_date('1993-04-12','yyyy-mm-dd'),'河南溫縣','河南理工大學','3987321','110',sysdate);
- insert into f_client values(
- 16,'yang','311209070129',to_date('1997-04-12','yyyy-mm-dd'),'河南新鄉','河南理工大學','3987321','110',sysdate);
-
insert into f_client(id,username,client_certificate_no,born_date,family_register_address,now_address,contact_mode,urgency_contact_mode,create_date) values (14,
'yuan','311209070127',to_date('1993-03-12','yyyy-mm-dd'),'河南省焦做市','河南省河南理工大學','150000000','110',sysdate);
insert into f_client(id,username,client_certificate_no,born_date,family_register_address,now_address,contact_mode,urgency_contact_mode,create_date) values(
15,'yang','311209070126',to_date('1993-04-12','yyyy-mm-dd'),'河南溫縣','河南理工大學','3987321','110',sysdate);
insert into f_client values(
16,'yang','311209070129',to_date('1997-04-12','yyyy-mm-dd'),'河南新鄉','河南理工大學','3987321','110',sysdate);
(3) 客戶表 po
- public class FClient {
- private Integer id;
- private String username;
- private String client_certificate_no;
- private Date born_date;
- private String family_register_address;
- private String now_address;
- private String contact_mode;
- private String urgency_contact_mode;
- private Date create_data;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getClient_certificate_no() {
- return client_certificate_no;
- }
- public void setClient_certificate_no(String client_certificate_no) {
- this.client_certificate_no = client_certificate_no;
- }
- public Date getBorn_date() {
- return born_date;
- }
- public void setBorn_date(Date born_date) {
- this.born_date = born_date;
- }
- public String getFamily_register_address() {
- return family_register_address;
- }
- public void setFamily_register_address(String family_register_address) {
- this.family_register_address = family_register_address;
- }
- public String getNow_address() {
- return now_address;
- }
- public void setNow_address(String now_address) {
- this.now_address = now_address;
- }
- public String getContact_mode() {
- return contact_mode;
- }
- public void setContact_mode(String contact_mode) {
- this.contact_mode = contact_mode;
- }
- public String getUrgency_contact_mode() {
- return urgency_contact_mode;
- }
- public void setUrgency_contact_mode(String urgency_contact_mode) {
- this.urgency_contact_mode = urgency_contact_mode;
- }
- public Date getCreate_data() {
- return create_data;
- }
- public void setCreate_data(Date create_data) {
- this.create_data = create_data;
- }
- }
public class FClient {
private Integer id;
private String username;
private String client_certificate_no;
private Date born_date;
private String family_register_address;
private String now_address;
private String contact_mode;
private String urgency_contact_mode;
private Date create_data;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getClient_certificate_no() {
return client_certificate_no;
}
public void setClient_certificate_no(String client_certificate_no) {
this.client_certificate_no = client_certificate_no;
}
public Date getBorn_date() {
return born_date;
}
public void setBorn_date(Date born_date) {
this.born_date = born_date;
}
public String getFamily_register_address() {
return family_register_address;
}
public void setFamily_register_address(String family_register_address) {
this.family_register_address = family_register_address;
}
public String getNow_address() {
return now_address;
}
public void setNow_address(String now_address) {
this.now_address = now_address;
}
public String getContact_mode() {
return contact_mode;
}
public void setContact_mode(String contact_mode) {
this.contact_mode = contact_mode;
}
public String getUrgency_contact_mode() {
return urgency_contact_mode;
}
public void setUrgency_contact_mode(String urgency_contact_mode) {
this.urgency_contact_mode = urgency_contact_mode;
}
public Date getCreate_data() {
return create_data;
}
public void setCreate_data(Date create_data) {
this.create_data = create_data;
}
}
2.原始dao整合
整合圖解 :api
![](http://static.javashuo.com/static/loading.gif)
下面咱們使用一個例子來講明 :微信
場景描述 : 經過客戶id查詢客戶信息 ;
(1)dao層
dao接口
- public interface ClientDao {
-
- FClient findClientById(int id);
- }
public interface ClientDao {
FClient findClientById(int id);
}
dao接口實現 :
注意 : 在這裏咱們讓dao實現接口繼承SqlSessionDaoSupport (在spring-mybatis整合包中 org.mybatis.spring.support.SqlSessionDaoSupport),則在dao接口實現中不須要sqlsessionFactory屬性了;就不用了在注入sqlSessionFactory了;
- public class ClinetDapimpl extends SqlSessionDaoSupport implements ClientDao {
-
-
-
-
-
-
-
-
-
-
-
- @Override
- public FClient findClientById(int id) {
- SqlSession session = this.getSqlSession();
- FClient client = (FClient) session.selectOne("cn.labelnet.dao.ClientDao.findClientById",id);
- return client;
- }
-
- }
public class ClinetDapimpl extends SqlSessionDaoSupport implements ClientDao {
/*
* 原始的sqlSessionFactory的注入方式
* private SqlSessionFactory sqlSessionFactory;
public ClinetDapimpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}*/
@Override
public FClient findClientById(int id) {
SqlSession session = this.getSqlSession();
FClient client = (FClient) session.selectOne("cn.labelnet.dao.ClientDao.findClientById",id);
return client;
}
}
(2)Clientmap.xml
操做數據庫;
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="cn.labelnet.dao.ClientDao">
-
-
- <select id="findClientById" parameterType="int" resultType="cn.labelnet.po.FClient">
- select * from f_client where id=#{value}
- </select>
-
-
- </mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.labelnet.dao.ClientDao">
<select id="findClientById" parameterType="int" resultType="cn.labelnet.po.FClient">
select * from f_client where id=#{value}
</select>
</mapper>
(3)SqlMapConfig.xml
在以前的練習中,咱們在這裏加載數據源,可是在整合中咱們將數據源加載交給了spring的ApplicationContext.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
-
- <mappers>
-
- <mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/>
-
-
-
-
-
- </mappers>
-
- </configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/>
<!-- 加載mapper映射文件 -->
<!-- <mapper resource="cn/labelnet/mapper/ClientMapper.xml" /> -->
</mappers>
</configuration>
(4)ApplicationContext.xml
注意 :1)數據源加載用的是 org.apache.commons.dbcp.BasicDataSource ;
2)配置sqlsessionFactory 用的是 org.mybatis.spring.SqlSessionFactoryBean ;
3)配置dao的接口實現,爲其注入sqlSessionFactory ;
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
-
-
- <context:property-placeholder location="classpath:db.properties"/>
-
-
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${oracle.driver}"></property>
- <property name="url" value="${oracle.url}"></property>
- <property name="username" value="${oracle.name}"></property>
- <property name="password" value="${oracle.pass}"></property>
- <property name="maxActive" value="10"></property>
- <property name="maxIdle" value="5"></property>
- </bean>
-
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
-
-
- <property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
-
-
- <property name="dataSource" ref="dataSource"></property>
-
- </bean>
-
-
-
- <bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
-
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
-
- </bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 加載數據庫配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置數據源,使用dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${oracle.driver}"></property>
<property name="url" value="${oracle.url}"></property>
<property name="username" value="${oracle.name}"></property>
<property name="password" value="${oracle.pass}"></property>
<property name="maxActive" value="10"></property>
<property name="maxIdle" value="5"></property>
</bean>
<!-- 1.配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- 加載mybatis的配置信息 -->
<property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
<!-- 加載數據源 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置dao的接口實現,爲其注入sqlSessionFactory -->
<bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
</beans>
5)測試
-
- private ApplicationContext applicationContext;
-
- @Before
- public void setUp() throws Exception {
- applicationContext=new ClassPathXmlApplicationContext("classpath:cn/labelnet/spring/config/applicationContext.xml");
- }
-
-
- @Test
- public void test() {
- ClientMapper bean = (ClientMapper) applicationContext.getBean("clientMapper");
- bean.findClientById(15);
- }
//獲得Spring 容器
private ApplicationContext applicationContext;
@Before
public void setUp() throws Exception {
applicationContext=new ClassPathXmlApplicationContext("classpath:cn/labelnet/spring/config/applicationContext.xml");
}
@Test
public void test() {
ClientMapper bean = (ClientMapper) applicationContext.getBean("clientMapper");
bean.findClientById(15);
}
3.Mapper代理整合
整合圖解 :
![](http://static.javashuo.com/static/loading.gif)
示例 :上面的場景不變,採用上面的場景實現
(1)Mapper.xml實現
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="cn.labelnet.mapper.ClientMapper">
-
- <select id="findClientById" parameterType="int" resultType="cn.labelnet.po.FClient">
- select * from f_client where id=#{value}
- </select>
-
- </mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.labelnet.mapper.ClientMapper">
<select id="findClientById" parameterType="int" resultType="cn.labelnet.po.FClient">
select * from f_client where id=#{value}
</select>
</mapper>
(2)Mapper.java實現
- public interface ClientMapper {
-
- FClient findClientById(int id);
-
- }
public interface ClientMapper {
FClient findClientById(int id);
}
(3)SqlMapConfig.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
-
- <mappers>
-
- <mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/>
-
-
-
- <mapper resource="cn/labelnet/mapper/ClientMapper.xml" />
-
- </mappers>
-
- </configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/>
<!-- 加載mapper映射文件 -->
<mapper resource="cn/labelnet/mapper/ClientMapper.xml" />
</mappers>
</configuration>
(4)Applicationcontext.xml
注意 :1)數據源加載用的是 org.apache.commons.dbcp.BasicDataSource ;
2)配置sqlsessionFactory 用的是 org.mybatis.spring.SqlSessionFactoryBean ;
3)經過MapperFactoryBean 實現 建立代理對象用的是 org.mybatis.spring.mapper.MapperFactoryBean
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
-
-
- <context:property-placeholder location="classpath:db.properties"/>
-
-
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${oracle.driver}"></property>
- <property name="url" value="${oracle.url}"></property>
- <property name="username" value="${oracle.name}"></property>
- <property name="password" value="${oracle.pass}"></property>
- <property name="maxActive" value="10"></property>
- <property name="maxIdle" value="5"></property>
- </bean>
-
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
-
-
- <property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
-
-
- <property name="dataSource" ref="dataSource"></property>
-
- </bean>
-
-
-
- <bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
-
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
-
- </bean> -->
-
- <!--1.配置mapper代理對象
- 經過MapperFactoryBean 實現 建立代理對象
- -->
-
- <bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
-
- <property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"></property>
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
- </bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 加載數據庫配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置數據源,使用dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${oracle.driver}"></property>
<property name="url" value="${oracle.url}"></property>
<property name="username" value="${oracle.name}"></property>
<property name="password" value="${oracle.pass}"></property>
<property name="maxActive" value="10"></property>
<property name="maxIdle" value="5"></property>
</bean>
<!-- 1.配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- 加載mybatis的配置信息 -->
<property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
<!-- 加載數據源 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- <!-- 配置dao的接口實現,爲其注入sqlSessionFactory -->
<bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> -->
<!--1.配置mapper代理對象
經過MapperFactoryBean 實現 建立代理對象
-->
<bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- value爲接口的全限定名 -->
<property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
</beans>
(5)測試
-
- private ApplicationContext applicationContext;
-
- @Before
- public void setUp() throws Exception {
- applicationContext=new ClassPathXmlApplicationContext("classpath:cn/labelnet/spring/config/applicationContext.xml");
- }
-
-
- @Test
- public void test() {
- ClientMapper bean = (ClientMapper) applicationContext.getBean("clientMapper");
- bean.findClientById(15);
- }
//獲得Spring 容器
private ApplicationContext applicationContext;
@Before
public void setUp() throws Exception {
applicationContext=new ClassPathXmlApplicationContext("classpath:cn/labelnet/spring/config/applicationContext.xml");
}
@Test
public void test() {
ClientMapper bean = (ClientMapper) applicationContext.getBean("clientMapper");
bean.findClientById(15);
}
(6)問題
在使用mapper代理的時候,發生了一個錯誤:
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [cn/labelnet/spring/config/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeException
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
- at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
- at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
- at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
- at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
- at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:591)
- at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
- at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
- at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
- at cn.labelnet.dao.ClientMapperScannerTest.setUp(ClientMapperScannerTest.java:17)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:606)
- at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
- at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
- at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
- at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
- at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
- at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
- at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
- at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
- at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
- at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
- at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
- at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
- at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
- at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
- at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
- Caused by: java.lang.reflect.MalformedParameterizedTypeException
- at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60)
- at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
- at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
- at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
- at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
- at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
- at sun.reflect.generics.visitor.Reifier.visitArrayTypeSignature(Reifier.java:159)
- at sun.reflect.generics.tree.ArrayTypeSignature.accept(ArrayTypeSignature.java:42)
- at sun.reflect.generics.repository.ConstructorRepository.getParameterTypes(ConstructorRepository.java:94)
- at java.lang.reflect.Method.getGenericParameterTypes(Method.java:292)
- at java.beans.FeatureDescriptor.getParameterTypes(FeatureDescriptor.java:387)
- at java.beans.MethodDescriptor.setMethod(MethodDescriptor.java:114)
- at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:72)
- at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:56)
- at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1149)
- at java.beans.Introspector.getBeanInfo(Introspector.java:416)
- at java.beans.Introspector.getBeanInfo(Introspector.java:163)
- at org.springframework.beans.CachedIntrospectionResults.<init>(CachedIntrospectionResults.java:224)
- at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:149)
- at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:324)
- at org.springframework.beans.BeanWrapperImpl.getPropertyDescriptors(BeanWrapperImpl.java:331)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.filterPropertyDescriptorsForDependencyCheck(AbstractAutowireCapableBeanFactory.java:1242)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1101)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
- ... 34 more
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [cn/labelnet/spring/config/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:591)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at cn.labelnet.dao.ClientMapperScannerTest.setUp(ClientMapperScannerTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.reflect.MalformedParameterizedTypeException
at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60)
at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.visitor.Reifier.visitArrayTypeSignature(Reifier.java:159)
at sun.reflect.generics.tree.ArrayTypeSignature.accept(ArrayTypeSignature.java:42)
at sun.reflect.generics.repository.ConstructorRepository.getParameterTypes(ConstructorRepository.java:94)
at java.lang.reflect.Method.getGenericParameterTypes(Method.java:292)
at java.beans.FeatureDescriptor.getParameterTypes(FeatureDescriptor.java:387)
at java.beans.MethodDescriptor.setMethod(MethodDescriptor.java:114)
at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:72)
at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:56)
at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1149)
at java.beans.Introspector.getBeanInfo(Introspector.java:416)
at java.beans.Introspector.getBeanInfo(Introspector.java:163)
at org.springframework.beans.CachedIntrospectionResults.<init>(CachedIntrospectionResults.java:224)
at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:149)
at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:324)
at org.springframework.beans.BeanWrapperImpl.getPropertyDescriptors(BeanWrapperImpl.java:331)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.filterPropertyDescriptorsForDependencyCheck(AbstractAutowireCapableBeanFactory.java:1242)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1101)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
... 34 more
再此陷入糾結中;開始的時候,本身的spring , mybatis ,spring-mybatis的整合包是本身這裏複製哪裏粘貼的,致使不少重複包,通過使用上面的所有整合包,解決了;
還有一個問題 :
問題 : mapper多的話,須要配置多個mapper
解決:mapper批量掃描,從mapper包中掃描出mapper接口,自動建立mapper對象
4.Mapper代理整合 bean掃描實現
整合圖解 :
![](http://static.javashuo.com/static/loading.gif)
1) bean配置
Mapper.xml 和 mapper.java同樣,在這裏就只配置下ApplicationContext.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
-
-
- <context:property-placeholder location="classpath:db.properties"/>
-
-
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${oracle.driver}"></property>
- <property name="url" value="${oracle.url}"></property>
- <property name="username" value="${oracle.name}"></property>
- <property name="password" value="${oracle.pass}"></property>
- <property name="maxActive" value="10"></property>
- <property name="maxIdle" value="5"></property>
- </bean>
-
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
-
-
- <property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
-
-
- <property name="dataSource" ref="dataSource"></property>
-
- </bean>
-
-
-
- <bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
-
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
-
- </bean>
-
- <!--1.配置mapper代理對象
- 經過MapperFactoryBean 實現 建立代理對象
- -->
-
- <!-- <bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
- value爲接口的全限定名
- <property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"></property>
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
- </bean> -->
-
- <!-- mapper批量掃描:
- 從mapper包中掃描出mapper接口,自動建立代理對象 而且在spring容器中註冊;
- 遵循規範:將mapper.java和mapper.xml映射文件名稱保持一致,且在一個目錄中,
- 自動掃描出來的mapper的bean的 id爲mapper類名首字母小寫;-->
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
- <property name="basePackage" value="cn.labelnet.mapper"></property>
-
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
- </bean>
-
-
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- 加載數據庫配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置數據源,使用dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${oracle.driver}"></property>
<property name="url" value="${oracle.url}"></property>
<property name="username" value="${oracle.name}"></property>
<property name="password" value="${oracle.pass}"></property>
<property name="maxActive" value="10"></property>
<property name="maxIdle" value="5"></property>
</bean>
<!-- 1.配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- 加載mybatis的配置信息 -->
<property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
<!-- 加載數據源 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置dao的接口實現,爲其注入sqlSessionFactory -->
<bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!--1.配置mapper代理對象
經過MapperFactoryBean 實現 建立代理對象
-->
<!-- <bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
value爲接口的全限定名
<property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> -->
<!-- mapper批量掃描:
從mapper包中掃描出mapper接口,自動建立代理對象 而且在spring容器中註冊;
遵循規範:將mapper.java和mapper.xml映射文件名稱保持一致,且在一個目錄中,
自動掃描出來的mapper的bean的 id爲mapper類名首字母小寫;-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 掃描的包名 -->
<property name="basePackage" value="cn.labelnet.mapper"></property>
<!-- Sqlsession -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
(2) 重點是 :
- <!-- mapper批量掃描:
- 從mapper包中掃描出mapper接口,自動建立代理對象 而且在spring容器中註冊;
- 遵循規範:將mapper.java和mapper.xml映射文件名稱保持一致,且在一個目錄中,
- 自動掃描出來的mapper的bean的 id爲mapper類名首字母小寫;-->
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
- <property name="basePackage" value="cn.labelnet.mapper"></property>
-
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
- </bean>
-
<!-- mapper批量掃描:
從mapper包中掃描出mapper接口,自動建立代理對象 而且在spring容器中註冊;
遵循規範:將mapper.java和mapper.xml映射文件名稱保持一致,且在一個目錄中,
自動掃描出來的mapper的bean的 id爲mapper類名首字母小寫;-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 掃描的包名 -->
<property name="basePackage" value="cn.labelnet.mapper"></property>
<!-- Sqlsession -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
注意幾點 :
1)掃描bean不須要 設置ID ,使用的時候是掃描出來的mapper的類名且首字母小寫;
2)掃描bean使用的是 org.mybatis.spring.mapper.MapperScannerConfigurer;
3)配置SqlSessionFactory的時候使用 :value爲sqlSessionFactory的bean的id ;
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
5.Demo免積分下載
http://download.csdn.net/detail/lablenet/9385109