Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合

时间:2023-03-09 02:55:42
Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合
<h1>
<span class="link_title"><a href="/lablenet/article/details/50440321">
Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合 </a>
</span> </h1>
    <div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.****.net/tag/mybatis" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">mybatis</a><a href="http://www.****.net/tag/Spring" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">Spring</a><a href="http://www.****.net/tag/bean" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">bean</a><a href="http://www.****.net/tag/ApplicationContext" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">ApplicationContext</a><a href="http://www.****.net/tag/Mapper" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">Mapper</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2015-12-31 11:01</span>
<span class="link_view" title="阅读次数">2160人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('Spring+%2b+Mybatis+-+%e5%8e%9f%e5%a7%8bdao%e5%bc%80%e5%8f%91%e6%95%b4%e5%90%88+%e4%b8%8e+Mapper%e4%bb%a3%e7%90%86%e6%95%b4%e5%90%88','50440321');return false;" title="收藏" target="_blank">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(50440321,2);return false;" title="举报">举报</a></span> </div>
</div> <style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ } });
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.****.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('6038676','LABLENET','top','50440321');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">--&gt; 3.2 spring<em>(11)</em></span>
<img class="arrow-down" src="http://static.blog.****.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.****.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.****.net/LABLENET/article/category/6038676" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_6038676">
</ul>
</div>
</label>
</div>
</div>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>

1.准备

这段时间学习了Spring和Mybatis的知识,我们知道持久层的 mapper,dao都需要spring进行管理, 需要spring通过单例的方式管理SqlSessionFactory,spring和mybatis整合生成代理对象使用sqlsessionFactory创建sqlsession;

练习全部jar (Spring+Mybatis+Spring-mybatis整合包)下载 :

http://download.****.net/detail/lablenet/9385114

demo数据准备 :

(1) 创建一个客户表 :

  1. --客户表
  2. CREATE TABLE F_CLIENT(
  3. ID NUMBER(12) PRIMARY KEY,--用户编号
  4. USERNAME VARCHAR2(20) NOT NULL,--用户姓名
  5. CLIENT_CERTIFICATE_NO VARCHAR2(20) NOT NULL UNIQUE,--证件号码
  6. BORN_DATE DATE,--出生日期
  7. FAMILY_REGISTER_ADDRESS VARCHAR2(200),--家庭住址
  8. NOW_ADDRESS VARCHAR2(200) NOT NULL,--现在住址
  9. CONTACT_MODE VARCHAR2(50) NOT NULL,--联系方式
  10. URGENCY_CONTACT_MODE VARCHAR2(50) NOT NULL,--紧急联系方式
  11. CREATE_DATE DATE NOT NULL--创建时间
  12. );
--客户表
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) 初始化数据 :

  1. 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,
  2. 'yuan','311209070127',to_date('1993-03-12','yyyy-mm-dd'),'河南省焦作市','河南省河南理工大学','150000000','110',sysdate);
  3. insert into f_client(id,username,client_certificate_no,born_date,family_register_address,now_address,contact_mode,urgency_contact_mode,create_date) values(
  4. 15,'yang','311209070126',to_date('1993-04-12','yyyy-mm-dd'),'河南温县','河南理工大学','3987321','110',sysdate);
  5. insert into f_client values(
  6. 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

  1. public class FClient {
  2. private Integer id;
  3. private String username;
  4. private String client_certificate_no;
  5. private Date born_date;
  6. private String family_register_address;
  7. private String now_address;
  8. private String contact_mode;
  9. private String urgency_contact_mode;
  10. private Date create_data;
  11. public Integer getId() {
  12. return id;
  13. }
  14. public void setId(Integer id) {
  15. this.id = id;
  16. }
  17. public String getUsername() {
  18. return username;
  19. }
  20. public void setUsername(String username) {
  21. this.username = username;
  22. }
  23. public String getClient_certificate_no() {
  24. return client_certificate_no;
  25. }
  26. public void setClient_certificate_no(String client_certificate_no) {
  27. this.client_certificate_no = client_certificate_no;
  28. }
  29. public Date getBorn_date() {
  30. return born_date;
  31. }
  32. public void setBorn_date(Date born_date) {
  33. this.born_date = born_date;
  34. }
  35. public String getFamily_register_address() {
  36. return family_register_address;
  37. }
  38. public void setFamily_register_address(String family_register_address) {
  39. this.family_register_address = family_register_address;
  40. }
  41. public String getNow_address() {
  42. return now_address;
  43. }
  44. public void setNow_address(String now_address) {
  45. this.now_address = now_address;
  46. }
  47. public String getContact_mode() {
  48. return contact_mode;
  49. }
  50. public void setContact_mode(String contact_mode) {
  51. this.contact_mode = contact_mode;
  52. }
  53. public String getUrgency_contact_mode() {
  54. return urgency_contact_mode;
  55. }
  56. public void setUrgency_contact_mode(String urgency_contact_mode) {
  57. this.urgency_contact_mode = urgency_contact_mode;
  58. }
  59. public Date getCreate_data() {
  60. return create_data;
  61. }
  62. public void setCreate_data(Date create_data) {
  63. this.create_data = create_data;
  64. }
  65. }
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整合

整合图解 :

Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合

下面我们使用一个例子来说明 :

场景描述 : 通过客户id查询客户信息 ;

(1)dao层

dao接口

  1. public interface ClientDao {
  2. FClient findClientById(int id);
  3. }
public interface ClientDao {
FClient findClientById(int id);

}

          dao接口实现 :

注意 : 在这里我们让dao实现接口继承SqlSessionDaoSupport (在spring-mybatis整合包中 org.mybatis.spring.support.SqlSessionDaoSupport),则在dao接口实现中不需要sqlsessionFactory属性了;就不用了在注入sqlSessionFactory了;

  1. public class ClinetDapimpl extends SqlSessionDaoSupport implements ClientDao {
  2. /*
  3. *  原始的sqlSessionFactory的注入方式
  4. *  private SqlSessionFactory sqlSessionFactory;
  5. public ClinetDapimpl(SqlSessionFactory sqlSessionFactory) {
  6. super();
  7. this.sqlSessionFactory = sqlSessionFactory;
  8. }*/
  9. @Override
  10. public FClient findClientById(int id) {
  11. SqlSession session = this.getSqlSession();
  12. FClient client = (FClient) session.selectOne("cn.labelnet.dao.ClientDao.findClientById",id);
  13. return client;
  14. }
  15. }
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

操作数据库;

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="cn.labelnet.dao.ClientDao">
  6. <select id="findClientById" parameterType="int" resultType="cn.labelnet.po.FClient">
  7. select * from f_client where id=#{value}
  8. </select>
  9. </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

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <mappers>
  7. <mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/>
  8. <!-- 加载mapper映射文件 -->
  9. <!--  <mapper resource="cn/labelnet/mapper/ClientMapper.xml" /> -->
  10. </mappers>
  11. </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>
&lt;mappers&gt;

   &lt;mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/&gt;

    &lt;!-- 加载mapper映射文件 --&gt;

  &lt;!--  &lt;mapper resource="cn/labelnet/mapper/ClientMapper.xml" /&gt; --&gt;

&lt;/mappers&gt;

</configuration>

(4)ApplicationContext.xml

注意 :1)数据源加载用的是 org.apache.commons.dbcp.BasicDataSource ;

2)配置sqlsessionFactory 用的是 org.mybatis.spring.SqlSessionFactoryBean ;

3)配置dao的接口实现,为其注入sqlSessionFactory ;

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  14. <!-- 加载数据库配置文件 -->
  15. <context:property-placeholder location="classpath:db.properties"/>
  16. <!-- 配置数据源,使用dbcp -->
  17. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  18. <property name="driverClassName" value="${oracle.driver}"></property>
  19. <property name="url" value="${oracle.url}"></property>
  20. <property name="username" value="${oracle.name}"></property>
  21. <property name="password" value="${oracle.pass}"></property>
  22. <property name="maxActive" value="10"></property>
  23. <property name="maxIdle" value="5"></property>
  24. </bean>
  25. <!-- 1.配置sqlSessionFactory -->
  26. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
  27. <!-- 加载mybatis的配置信息 -->
  28. <property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
  29. <!-- 加载数据源  dataSource-->
  30. <property name="dataSource" ref="dataSource"></property>
  31. </bean>
  32. <!-- 配置dao的接口实现,为其注入sqlSessionFactory -->
  33. <bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
  34. <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
  35. </bean>
  36. </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">
&lt;!-- 加载数据库配置文件 --&gt;
&lt;context:property-placeholder location="classpath:db.properties"/&gt; &lt;!-- 配置数据源,使用dbcp --&gt;
&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;
&lt;property name="driverClassName" value="${oracle.driver}"&gt;&lt;/property&gt;
&lt;property name="url" value="${oracle.url}"&gt;&lt;/property&gt;
&lt;property name="username" value="${oracle.name}"&gt;&lt;/property&gt;
&lt;property name="password" value="${oracle.pass}"&gt;&lt;/property&gt;
&lt;property name="maxActive" value="10"&gt;&lt;/property&gt;
&lt;property name="maxIdle" value="5"&gt;&lt;/property&gt;
&lt;/bean&gt; &lt;!-- 1.配置sqlSessionFactory --&gt;
&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" &gt; &lt;!-- 加载mybatis的配置信息 --&gt;
&lt;property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"&gt;&lt;/property&gt; &lt;!-- 加载数据源 dataSource--&gt;
&lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt; &lt;/bean&gt; &lt;!-- 配置dao的接口实现,为其注入sqlSessionFactory --&gt;
&lt;bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl"&gt; &lt;property name="sqlSessionFactory" ref="sqlSessionFactory"&gt;&lt;/property&gt; &lt;/bean&gt;

</beans>

5)测试

  1. //得到Spring 容器
  2. private ApplicationContext applicationContext;
  3. @Before
  4. public void setUp() throws Exception {
  5. applicationContext=new ClassPathXmlApplicationContext("classpath:cn/labelnet/spring/config/applicationContext.xml");
  6. }
  7. @Test
  8. public void test() {
  9. ClientMapper bean = (ClientMapper) applicationContext.getBean("clientMapper");
  10. bean.findClientById(15);
  11. }
	//得到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);
}</pre><br>

3.Mapper代理整合

 整合图解 :

Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合

示例 :上面的场景不变,采用上面的场景实现

(1)Mapper.xml实现

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="cn.labelnet.mapper.ClientMapper">
  6. <select id="findClientById" parameterType="int" resultType="cn.labelnet.po.FClient">
  7. select * from f_client where id=#{value}
  8. </select>
  9. </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实现

  1. public interface ClientMapper {
  2. FClient findClientById(int id);
  3. }
public interface ClientMapper {
FClient findClientById(int id);

}

(3)SqlMapConfig.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <mappers>
  7. <mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/>
  8. <!-- 加载mapper映射文件 -->
  9. <mapper resource="cn/labelnet/mapper/ClientMapper.xml" />
  10. </mappers>
  11. </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>
&lt;mappers&gt;

   &lt;mapper resource="cn/lablenet/dao/sqlmap/ClientMap.xml"/&gt;

    &lt;!-- 加载mapper映射文件 --&gt;

    &lt;mapper resource="cn/labelnet/mapper/ClientMapper.xml" /&gt;

&lt;/mappers&gt;

</configuration>

(4)Applicationcontext.xml

注意 :1)数据源加载用的是 org.apache.commons.dbcp.BasicDataSource ;

2)配置sqlsessionFactory 用的是 org.mybatis.spring.SqlSessionFactoryBean ;

3)通过MapperFactoryBean 实现 创建代理对象用的是 org.mybatis.spring.mapper.MapperFactoryBean

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  14. <!-- 加载数据库配置文件 -->
  15. <context:property-placeholder location="classpath:db.properties"/>
  16. <!-- 配置数据源,使用dbcp -->
  17. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  18. <property name="driverClassName" value="${oracle.driver}"></property>
  19. <property name="url" value="${oracle.url}"></property>
  20. <property name="username" value="${oracle.name}"></property>
  21. <property name="password" value="${oracle.pass}"></property>
  22. <property name="maxActive" value="10"></property>
  23. <property name="maxIdle" value="5"></property>
  24. </bean>
  25. <!-- 1.配置sqlSessionFactory -->
  26. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
  27. <!-- 加载mybatis的配置信息 -->
  28. <property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
  29. <!-- 加载数据源  dataSource-->
  30. <property name="dataSource" ref="dataSource"></property>
  31. </bean>
  32. <!--    <!-- 配置dao的接口实现,为其注入sqlSessionFactory -->
  33. <bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
  34. <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
  35. </bean> -->
  36. <!--1.配置mapper代理对象
  37. 通过MapperFactoryBean 实现 创建代理对象
  38. -->
  39. <bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  40. <!--  value为接口的全限定名 -->
  41. <property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"></property>
  42. <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
  43. </bean>
  44. </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">
&lt;!-- 加载数据库配置文件 --&gt;
&lt;context:property-placeholder location="classpath:db.properties"/&gt; &lt;!-- 配置数据源,使用dbcp --&gt;
&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;
&lt;property name="driverClassName" value="${oracle.driver}"&gt;&lt;/property&gt;
&lt;property name="url" value="${oracle.url}"&gt;&lt;/property&gt;
&lt;property name="username" value="${oracle.name}"&gt;&lt;/property&gt;
&lt;property name="password" value="${oracle.pass}"&gt;&lt;/property&gt;
&lt;property name="maxActive" value="10"&gt;&lt;/property&gt;
&lt;property name="maxIdle" value="5"&gt;&lt;/property&gt;
&lt;/bean&gt; &lt;!-- 1.配置sqlSessionFactory --&gt;
&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" &gt; &lt;!-- 加载mybatis的配置信息 --&gt;
&lt;property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"&gt;&lt;/property&gt; &lt;!-- 加载数据源 dataSource--&gt;
&lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt; &lt;/bean&gt;

<!-- <!-- 配置dao的接口实现,为其注入sqlSessionFactory -->

<bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">

    &lt;property name="sqlSessionFactory" ref="sqlSessionFactory"&gt;&lt;/property&gt;

&lt;/bean&gt; --&gt;

&lt;!--1.配置mapper代理对象
通过MapperFactoryBean 实现 创建代理对象
--&gt; &lt;bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"&gt;
&lt;!-- value为接口的全限定名 --&gt;
&lt;property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"&gt;&lt;/property&gt;
&lt;property name="sqlSessionFactory" ref="sqlSessionFactory"&gt;&lt;/property&gt;
&lt;/bean&gt;

</beans>

(5)测试

  1. //得到Spring 容器
  2. private ApplicationContext applicationContext;
  3. @Before
  4. public void setUp() throws Exception {
  5. applicationContext=new ClassPathXmlApplicationContext("classpath:cn/labelnet/spring/config/applicationContext.xml");
  6. }
  7. @Test
  8. public void test() {
  9. ClientMapper bean = (ClientMapper) applicationContext.getBean("clientMapper");
  10. bean.findClientById(15);
  11. }
	//得到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);
}</pre><br>

(6)问题

在使用mapper代理的时候,发生了一个错误:

  1. 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
  2. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
  3. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
  4. at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
  5. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
  6. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
  7. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
  8. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:591)
  9. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
  10. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
  11. at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
  12. at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
  13. at cn.labelnet.dao.ClientMapperScannerTest.setUp(ClientMapperScannerTest.java:17)
  14. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  15. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  16. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  17. at java.lang.reflect.Method.invoke(Method.java:606)
  18. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
  19. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  20. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
  21. at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
  22. at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
  23. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
  24. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
  25. at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
  26. at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
  27. at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
  28. at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
  29. at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
  30. at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
  31. at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  32. at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  33. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
  34. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
  35. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
  36. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
  37. Caused by: java.lang.reflect.MalformedParameterizedTypeException
  38. at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60)
  39. at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
  40. at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
  41. at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
  42. at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
  43. at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
  44. at sun.reflect.generics.visitor.Reifier.visitArrayTypeSignature(Reifier.java:159)
  45. at sun.reflect.generics.tree.ArrayTypeSignature.accept(ArrayTypeSignature.java:42)
  46. at sun.reflect.generics.repository.ConstructorRepository.getParameterTypes(ConstructorRepository.java:94)
  47. at java.lang.reflect.Method.getGenericParameterTypes(Method.java:292)
  48. at java.beans.FeatureDescriptor.getParameterTypes(FeatureDescriptor.java:387)
  49. at java.beans.MethodDescriptor.setMethod(MethodDescriptor.java:114)
  50. at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:72)
  51. at java.beans.MethodDescriptor.<init>(MethodDescriptor.java:56)
  52. at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1149)
  53. at java.beans.Introspector.getBeanInfo(Introspector.java:416)
  54. at java.beans.Introspector.getBeanInfo(Introspector.java:163)
  55. at org.springframework.beans.CachedIntrospectionResults.<init>(CachedIntrospectionResults.java:224)
  56. at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:149)
  57. at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:324)
  58. at org.springframework.beans.BeanWrapperImpl.getPropertyDescriptors(BeanWrapperImpl.java:331)
  59. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.filterPropertyDescriptorsForDependencyCheck(AbstractAutowireCapableBeanFactory.java:1242)
  60. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1101)
  61. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
  62. ... 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扫描实现

整合图解 :

Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合

1) bean配置

Mapper.xml 和 mapper.java一样,在这里就只配置下ApplicationContext.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  14. <!-- 加载数据库配置文件 -->
  15. <context:property-placeholder location="classpath:db.properties"/>
  16. <!-- 配置数据源,使用dbcp -->
  17. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  18. <property name="driverClassName" value="${oracle.driver}"></property>
  19. <property name="url" value="${oracle.url}"></property>
  20. <property name="username" value="${oracle.name}"></property>
  21. <property name="password" value="${oracle.pass}"></property>
  22. <property name="maxActive" value="10"></property>
  23. <property name="maxIdle" value="5"></property>
  24. </bean>
  25. <!-- 1.配置sqlSessionFactory -->
  26. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
  27. <!-- 加载mybatis的配置信息 -->
  28. <property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"></property>
  29. <!-- 加载数据源  dataSource-->
  30. <property name="dataSource" ref="dataSource"></property>
  31. </bean>
  32. <!-- 配置dao的接口实现,为其注入sqlSessionFactory -->
  33. <bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">
  34. <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
  35. </bean>
  36. <!--1.配置mapper代理对象
  37. 通过MapperFactoryBean 实现 创建代理对象
  38. -->
  39. <!--  <bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  40. value为接口的全限定名
  41. <property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"></property>
  42. <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
  43. </bean> -->
  44. <!-- mapper批量扫描:
  45. 从mapper包中扫描出mapper接口,自动创建代理对象 并且在spring容器中注册;
  46. 遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中,
  47. 自动扫描出来的mapper的bean的 id为mapper类名首字母小写;-->
  48. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  49. <!-- 扫描的包名 -->
  50. <property name="basePackage" value="cn.labelnet.mapper"></property>
  51. <!-- Sqlsession -->
  52. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  53. </bean>
  54. </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">
&lt;!-- 加载数据库配置文件 --&gt;
&lt;context:property-placeholder location="classpath:db.properties"/&gt; &lt;!-- 配置数据源,使用dbcp --&gt;
&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;
&lt;property name="driverClassName" value="${oracle.driver}"&gt;&lt;/property&gt;
&lt;property name="url" value="${oracle.url}"&gt;&lt;/property&gt;
&lt;property name="username" value="${oracle.name}"&gt;&lt;/property&gt;
&lt;property name="password" value="${oracle.pass}"&gt;&lt;/property&gt;
&lt;property name="maxActive" value="10"&gt;&lt;/property&gt;
&lt;property name="maxIdle" value="5"&gt;&lt;/property&gt;
&lt;/bean&gt; &lt;!-- 1.配置sqlSessionFactory --&gt;
&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" &gt; &lt;!-- 加载mybatis的配置信息 --&gt;
&lt;property name="configLocation" value="cn/labelnet/mybatis/config/SqlmapDaoConfig.xml"&gt;&lt;/property&gt; &lt;!-- 加载数据源 dataSource--&gt;
&lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt; &lt;/bean&gt;

<!-- 配置dao的接口实现,为其注入sqlSessionFactory -->

<bean id="ClientDao" class="cn.labelnet.dao.ClinetDapimpl">

    &lt;property name="sqlSessionFactory" ref="sqlSessionFactory"&gt;&lt;/property&gt;

&lt;/bean&gt; 

&lt;!--1.配置mapper代理对象
通过MapperFactoryBean 实现 创建代理对象
--&gt; &lt;!-- &lt;bean id="clientMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"&gt;
value为接口的全限定名
&lt;property name="mapperInterface" value="cn.labelnet.mapper.ClientMapper"&gt;&lt;/property&gt;
&lt;property name="sqlSessionFactory" ref="sqlSessionFactory"&gt;&lt;/property&gt;
&lt;/bean&gt; --&gt; &lt;!-- mapper批量扫描:
从mapper包中扫描出mapper接口,自动创建代理对象 并且在spring容器中注册;
遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中,
自动扫描出来的mapper的bean的 id为mapper类名首字母小写;--&gt; &lt;bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&gt;
&lt;!-- 扫描的包名 --&gt;
&lt;property name="basePackage" value="cn.labelnet.mapper"&gt;&lt;/property&gt;
&lt;!-- Sqlsession --&gt;
&lt;property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"&gt;&lt;/property&gt;
&lt;/bean&gt;

</beans>

(2) 重点是 :

  1. <!-- mapper批量扫描:
  2. 从mapper包中扫描出mapper接口,自动创建代理对象 并且在spring容器中注册;
  3. 遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中,
  4. 自动扫描出来的mapper的bean的 id为mapper类名首字母小写;-->
  5. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  6. <!-- 扫描的包名 -->
  7. <property name="basePackage" value="cn.labelnet.mapper"></property>
  8. <!-- Sqlsession -->
  9. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  10. </bean>
	 <!-- mapper批量扫描:
从mapper包中扫描出mapper接口,自动创建代理对象 并且在spring容器中注册;
遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中,
自动扫描出来的mapper的bean的 id为mapper类名首字母小写;-->
 &lt;bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&gt;
&lt;!-- 扫描的包名 --&gt;
&lt;property name="basePackage" value="cn.labelnet.mapper"&gt;&lt;/property&gt;
&lt;!-- Sqlsession --&gt;
&lt;property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"&gt;&lt;/property&gt;
&lt;/bean&gt;
</pre><p></p>

注意几点 :

     1)扫描bean不需要 设置ID ,使用的时候是扫描出来的mapper的类名且首字母小写;

2)扫描bean使用的是 org.mybatis.spring.mapper.MapperScannerConfigurer;

3)配置SqlSessionFactory的时候使用 :value为sqlSessionFactory的bean的id ;

  1. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>

5.Demo免积分下载

http://download.****.net/detail/lablenet/9385109



    <div id="digg" articleid="50440321">
<dl id="btnDigg" class="digg digg_disable" onclick="btndigga();"> <dt>顶</dt>
<dd>0</dd>
</dl> <dl id="btnBury" class="digg digg_disable" onclick="btnburya();"> <dt>踩</dt>
<dd>0</dd>
</dl> </div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<div style="clear:both; height:10px;"></div>

        <div class="similar_article">
<h4></h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
&nbsp;&nbsp;相关文章推荐
</div> <div class="similar_wrap tracking-ad" data-mod="popu_36" style="max-height:250px">
<ul class="similar_list fl">
<li>
<em>•</em>
<a href="http://blog.****.net/mickjoust/article/details/51612482" title="Spring Boot 实践折腾记(二):切入点,Spring MVC集成Mybatis的经典例子" strategy="BlogCommendFromBaidu_0" target="_blank">Spring Boot 实践折腾记(二):切入点,Spring MVC集成Mybatis的经典例子</a>
</li>
<li>
<em>•</em>
<a href="http://edu.****.net/huiyiCourse/detail/596?utm_source=blog7" title="免费直播 神经网络的原理及结构设计--何宇健" strategy="undefined" target="_blank">免费直播 神经网络的原理及结构设计--何宇健</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/cwh056056/article/details/51051042" title="(五)mybatis学习之mapper代理开发方式及与spring整合" strategy="BlogCommendFromBaidu_1" target="_blank">(五)mybatis学习之mapper代理开发方式及与spring整合</a>
</li>
<li>
<em>•</em>
<a href="http://edu.****.net/huiyiCourse/detail/602?utm_source=blog7" title="Apache Weex:移动研发的进阶之路--董岩" strategy="undefined" target="_blank">Apache Weex:移动研发的进阶之路--董岩</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/h3243212/article/details/50778937" title="mybatis学习笔记(18)-mybatis逆向工程" strategy="BlogCommendFromBaidu_2" target="_blank">mybatis学习笔记(18)-mybatis逆向工程</a>
</li>
<li>
<em>•</em>
<a href="http://edu.****.net/course/detail/6252?utm_source=blog7" title="C++ 百万并发网络通信引擎架构与实现" strategy="undefined" target="_blank">C++ 百万并发网络通信引擎架构与实现</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/u011051912/article/details/73611618" title="SpringMVC中PostForEntity的中文乱码问题" strategy="BlogCommendFromBaidu_3" target="_blank">SpringMVC中PostForEntity的中文乱码问题</a>
</li>
<li>
<em>•</em>
<a href="http://edu.****.net/course/detail/6271?utm_source=blog7" title="PHP入门到精通及项目实战" strategy="undefined" target="_blank">PHP入门到精通及项目实战</a>
</li>
</ul>
<ul class="similar_list fr">
<li>
<em>•</em>
<a href="http://blog.****.net/h3243212/article/details/50837878" title="springmvc学习笔记(7)-springmvc整合mybatis之mapper" strategy="BlogCommendFromBaidu_4" target="_blank">springmvc学习笔记(7)-springmvc整合mybatis之mapper</a>
</li>
<li>
<em>•</em>
<a href="http://edu.****.net/course/detail/6409?utm_source=blog7" title=" Kotlin基本语法到实战开发" strategy="undefined" target="_blank"> Kotlin基本语法到实战开发</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/QH_JAVA/article/details/43699137" title="Spring之ORM(spring 与mybatis的4种整合实例)" strategy="BlogCommendFromBaidu_5" target="_blank">Spring之ORM(spring 与mybatis的4种整合实例)</a>
</li>
<li>
<em>•</em>
<a href="http://edu.****.net/course/detail/2932?utm_source=blog7" title=" Android 实战开发 第三方SDK 讯飞语音SDK" strategy="undefined" target="_blank"> Android 实战开发 第三方SDK 讯飞语音SDK</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/mickjoust/article/details/51605515" title="Spring Boot 实践折腾记(一):快速,Hello World例子" strategy="BlogCommendFromBaidu_6" target="_blank">Spring Boot 实践折腾记(一):快速,Hello World例子</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/u011051912/article/details/74295172" title="SpringBoot集成Mybatis+xml格式的sql配置文件" strategy="BlogCommendFromBaidu_7" target="_blank">SpringBoot集成Mybatis+xml格式的sql配置文件</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/zbw18297786698/article/details/53241167" title="Spring与Mybatis的整合------原始Dao的整合方式" strategy="BlogCommendFromBaidu_8" target="_blank">Spring与Mybatis的整合------原始Dao的整合方式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.****.net/u010435203/article/details/51527404" title="SSM之DAO部分Spring与MyBatis整合" strategy="BlogCommendFromBaidu_9" target="_blank">SSM之DAO部分Spring与MyBatis整合</a>
</li>
</ul>
</div>
</div>
</div>