Mybatis+Sping整合
- mybatis+spring整合
- 整合思路
思路:将mybatis框架的对象,交给spring管理。
- 把SqlSessionFactory对象,交给spring管理
- 把SqlSession对象,交给spring管理
- 在原始的dao开发方法中,将dao实现类对象交给spring管理
- 在mapper代理开发方法中,把mapper代理对象交给spring管理
- 把数据源对象,交给spring管理
-
- 整合步骤
- 创建项目(mybatis-spring)
- 整合步骤
-
-
- 加入spring和mybatis框架以及整合包
-
mybatis框架包
spring框架包
mybaits-spring整合包
数据库驱动包
数据库连接池包(dbcp)
log4j日志包
junit单元测试包
-
-
- 准备配置文件
- sqlMapConfig.xml
- 准备配置文件
-
配置别名
配置加载mapper映射文件(在这里配置的是原始的dao开发方法的配置文件)
<?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>
<!-- 配置别名 --> <typeAliases> <!-- 包扫描方式配置别名 --> <package name="cn.bdqn.ssm.po"/> </typeAliases>
<!-- 配置映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers>
</configuration> |
-
-
-
- applicationContext.xml
-
-
配置数据源对象(dataSource)
配置mybatis核心对象(SqlSessionFactory)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 配置加载db.properties属性文件 --> <context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName" value="${db.driverClassName}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" />
<!-- 最大连接数量 --> <property name="maxActive" value="${db.maxActive}" /> <!-- 最小空闲连接数量 --> <property name="minIdle" value="${db.minIdle}" /> <!-- 最大空闲连接数量 --> <property name="maxIdle" value="${db.maxIdle}" /> <!-- 初始化连接数数量 --> <property name="initialSize" value="${db.initialSize}" /> <!-- 超时等待时间,以毫秒为单位 --> <property name="maxWait" value="${db.maxWait}" />
</bean>
<!-- 配置SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据源对象 --> <property name="dataSource" ref="dataSource"/>
<!-- 加载mybatis框架的主配置文件 --> <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/> </bean> </beans> |
-
-
-
- db.properties
-
-
db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://127.0.0.1:3306/dbqn db.username=root db.password=root
db.maxActive=10 db.minIdle=2 db.maxIdle=5 db.initialSize=5 db.maxWait=6000 |
-
-
-
- log4j.properties
-
-
# Global logging configuration log4j.rootLogger=DEBUG, stdout
# Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n |
-
-
- 整合好的项目
-
-
- 原始的dao开发方法
- 需求
- 原始的dao开发方法
- 根据用户id查询用户
- 新增一个用户
-
-
- 需求实现
- 准备用户pojo
- 需求实现
-
-
-
-
- 准备User.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"> <!-- namespace:名称空间,相当于java中的package,用于防止sql语句名称冲突(sql语句隔离) --> <mapper namespace="test"> <!--说明:myatis框架针对每一种sql语句:新增/修改/删除/查询,提供了对应过的标签: insert/update/delete/select来放置 -->
<!-- 根据用户id查询用户,说明: select标签:用于放置查询的sql语句 id:唯一标识一条sql语句 parameterType:输入参数的类型 resultType:返回值的类型(暂时需要记住使用的类的全限定名称) #{id}:占位符,相当于jdbc中的问号? --> <select id="queryUserById" parameterType="int" resultType="user" > select * from `user` where id=#{id} </select>
<!-- 新增用户,说明: insert标签:用于放置新增sql语句 #{id}:字符串拼接符,当参数传递的是pojo的时候,花括号中的内容是pojo的属性 --> <insert id="insertUser" parameterType="user"> insert into `user`(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
</mapper> |
-
-
-
- 编写用户dao接口
-
-
package cn.bdqn.ssm.dao;
import cn.bdqn.ssm.po.User;
public interface UserDao {
//1.根据用户id查询用户 User queryUserById(Integer id);
// 2.新增一个用户 void insertUser(User user);
} |
-
-
-
- 实现用户dao接口
-
-
说明:整合包提供了SqlSessionDaoSupport类,我们的dao实现类需要继承SqlSessionDaoSupport类,获取到sqlSession对象。
package cn.bdqn.ssm.dao.impl;
import org.apache.ibatis.session.SqlSession; import org.mybatis.spring.support.SqlSessionDaoSupport;
import cn.bdqn.ssm.dao.UserDao; import cn.bdqn.ssm.po.User;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
/** * 根据用户id查询用户 */ public User queryUserById(Integer id) { // 1.获取sqlSession对象 SqlSession sqlSession = this.getSqlSession();
// 2.使用sqlSession对象,调用方法执行 Object user = sqlSession.selectOne("test.queryUserById", id);
/** * 释放资源: * 与spring整合以后,sqlSession对象交给spring管理,不需要再手动释放(不能) */
return (User) user; }
/** * 新增一个用户 */ public void insertUser(User user) { // 1.获取sqlSession对象 SqlSession sqlSession = this.getSqlSession();
// 2.使用sqlSession对象,调用方法执行 sqlSession.insert("test.insertUser", user);
/** * 释放资源: * 1.与spring整合以后,sqlSession对象交给spring管理,不需要再手动释放(不能) * 2.与spring整合以后,sqlSession对象交给spring管理,不需要再关心事务 * (如果配置了spring的事务,使用spring事务;如果没有配置,使用jdbc的事务) */
}
} |
-
-
-
- 在applicationContext.xml文件中,配置用户dao实现类对象
-
-
<!-- 配置用户dao实现类对象 --> <bean id="userDao" class="cn.bdqn.ssm.dao.impl.UserDaoImpl"> <!-- 注入sqlSessionFactory对象 --> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> |
-
-
-
- 编写测试代码
-
-
package cn.bdqn.ssm.test;
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.bdqn.ssm.dao.UserDao; import cn.bdqn.ssm.po.User;
/** * @ClassName: UserDaoTest * @Description:用户dao开发方法测试 * @author 老师 * @date 2018-4-9 下午2:40:34 * */ public class UserDaoTest {
/** * 测试根据用户id查询用户 */ @Test public void queryUserByIdTest(){
// 1.加载spring配置文件,创建spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
// 2.从容器中,获取用户dao对象 UserDao userDao = (UserDao) context.getBean("userDao");
User user = userDao.queryUserById(2); System.out.println(user);
}
} |
测试新增用户:
/** * 测试新增一个用户 */ @Test public void insertUserTest(){ // 1.加载spring配置文件,创建spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
// 2.从容器中,获取用户dao对象 UserDao userDao = (UserDao) context.getBean("userDao");
// 创建用户对象 User user = new User(); user.setUsername("李云龙"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("独立团");
userDao.insertUser(user); } |
-
- mapper代理开发方法
- 需求
- mapper代理开发方法
- 新增一个用户
-
-
- 需求实现
- 创建mapper接口以及mapper映射文件
- 准备测试
- 需求实现
-
说明:整合包提供了一个MapperFactoryBean类,用于配置mapper代理对象。
<!-- 配置用户mapper代理对象 --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!-- 注入sqlSessionFactory对象 --> <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<!-- 注入被代理接口 根据接口生成代理对象 --> <property name="mapperInterface" value="cn.bdqn.ssm.mapper.UserMapper"/> </bean> |
测试新增用户:
/** * 测试新增用户 */ @Test public void insertUserTest(){
// 1.加载spring配置文件,创建spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
// 2.从容器中获取mapper代理对象 UserMapper mapper = (UserMapper) context.getBean("userMapper");
// 创建用户对象 User user = new User(); user.setUsername("楚云飞"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("国军");
mapper.insertSelective(user); } |
-
-
-
- mapper代理对象配置方式二【重点】
-
-
<!-- mapper代理对象配置方式二【重点】 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入要扫描的包,说明: 1.如果有多个包,在同一个父包下,配置父包即可 2.不在同一个父包,以半角逗号进行分割:,(cn.bdqn.ssm.mapper,cn.bdqn.ssm.mapper) 3.在企业项目中,推荐使用包扫描方式(mapper扫描器) --> <property name="basePackage" value="cn.bdqn.ssm.mapper"/> </bean> |