整合思路
需要spring通过单例方式管理SqlSessionFactory。
spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
持久层的mapper都需要由spring进行管理。
整合环境
使用心得Java工程(接近实际开发的工程结构)
jar包:
mybatis3.2.7的jar包
spring3.2.0的jar包
全部jar包
![](https://i-blog.csdnimg.cn/blog_migrate/090f8ddc3440ea00d9c9da09b66dc55e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5f4f2d798164ae2b96e25769a28ab6ee.png)
sqlSessionFactory
在applicationContext.xml配置sqlSessionFactory和数据源
sqlSessionFactory在mybatis和spring的整合包下。
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据源,使用dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- sqlSessinFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的配置文件 -->
<property name="configLocation" value="mybatis/SqlMapConfig.xml" />
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
原始dao开发(和spring整合后)
User.xml
![](https://i-blog.csdnimg.cn/blog_migrate/b6b6dae967b902968ced5027e7482b1e.png)
在SqlMapconfig.xml中加载User.xml
![](https://i-blog.csdnimg.cn/blog_migrate/e7c45a810032476cf1d276102d4bc984.png)
dao(实现类继承SqlSessionDaoSupport)
![](https://i-blog.csdnimg.cn/blog_migrate/3c87533f2d69d5d28ec5719e5d4c97d8.png)
dao接口实现类需要注入SqlSessoinFactory,通过spring进行注入。
这里spring声明配置方式,配置dao的bean:
让UserDaoImpl实现类继承SqlSessionDaoSupport
![](https://i-blog.csdnimg.cn/blog_migrate/b375591c5daa8b5804d79165c20de8dc.png)
配置dao
在applicationContext.xml中配置dao。
![](https://i-blog.csdnimg.cn/blog_migrate/386fdd201bda589ad6e694fa33e552b2.png)
测试程序
![](https://i-blog.csdnimg.cn/blog_migrate/ad9130b06a49ac4eae1a9348a7577d70.png)
mapper代理开发
mapper.xml和mapper.java
![](https://i-blog.csdnimg.cn/blog_migrate/10a6ebd84bc19d0b775de4d76067e6b3.png)
通过MapperFactoryBean创建代理对象
![](https://i-blog.csdnimg.cn/blog_migrate/1190d0d3c3b95fe3da9aed6b786c6e1d.png)
此方法问题:
需要针对每个mapper进行配置,麻烦
通过MapperScannerConfigurer进行mapper扫描(重要)
![](https://i-blog.csdnimg.cn/blog_migrate/b0dd795edb46c7e7a45c99cf093df68b.png)
测试代码
![](https://i-blog.csdnimg.cn/blog_migrate/1a39067e9a33dd9d3b9554e6b2c211fa.png)
逆向工程
什么是逆向工程
mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml、po..)
企业实际开发中,常用的逆向工程方式:
由于数据库的表生成java代码。
下载逆向工程
![](https://i-blog.csdnimg.cn/blog_migrate/e11f917a9670d4281b50cdfca82962a0.png)
使用方法(会用)
运行逆向工程
![](https://i-blog.csdnimg.cn/blog_migrate/92de9107761279fa2303f2e491723e6e.png)
建议使用java程序方式,不依赖开发工具。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
password="mysql">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="cn.itcast.ssm.po"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="cn.itcast.ssm.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="cn.itcast.ssm.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="items"></table>
<table tableName="orders"></table>
<table tableName="orderdetail"></table>
<table tableName="user"></table>
</context>
</generatorConfiguration>
执行生成程序
![](https://i-blog.csdnimg.cn/blog_migrate/60d64f054202b249dc1558c1fb962682.png)
生成后的代码:
![](https://i-blog.csdnimg.cn/blog_migrate/6e6a021c291306cc1ec907cd8b9778b0.png)
使用生成的代码
需要将生成工程中所生成的代码拷贝到自己的工程中。
测试ItemsMapper中的方法
//自定义条件查询
@Test
public void testSelectByExample() {
ItemsExample itemsExample = new ItemsExample();
//通过criteria构造查询条件
ItemsExample.Criteria criteria = itemsExample.createCriteria();
criteria.andNameEqualTo("笔记本3");
//可能返回多条记录
List<Items> list = itemsMapper.selectByExample(itemsExample);
System.out.println(list);
}
//根据主键查询
@Test
public void testSelectByPrimaryKey() {
Items items = itemsMapper.selectByPrimaryKey(1);
System.out.println(items);
}
//插入
@Test
public void testInsert() {
//构造 items对象
Items items = new Items();
items.setName("手机");
items.setPrice(999f);
itemsMapper.insert(items);
}
//更新数据
@Test
public void testUpdateByPrimaryKey() {
//对所有字段进行更新,需要先查询出来再更新
Items items = itemsMapper.selectByPrimaryKey(1);
items.setName("水杯");
itemsMapper.updateByPrimaryKey(items);
//如果传入字段不空为才更新,在批量更新中使用此方法,不需要先查询再更新
//itemsMapper.updateByPrimaryKeySelective(record);
}