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开发方法 需求根据用户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映射文件准备测试
说明:整合包提供了一个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>