一、整合思路
- 1 SqlSessionFactory对象应该放到Spring容器中作为单例存在。
- 2.传统DAO开发模式方法中,应该从Spring容器中获的sqlSession对象
- 3.Mapper动态代理形式中,应该从Spring容器中直接获得mapper的代理对象
- 4.数据库的连接以及数据库的事务管理都交给Spring来管理。
二、整合步骤
- 1.创建一个Java项目,导入Spring和Mybatis所需要的所有jar包
- 2.创建Mybatis的配置文件SqlMapConfig.xml
- 3.编写Spring的配置文件applicationContext.xml
3.1 数据库连接和连接池
3.2 将sqlSessionFactory对象,配置到Spring的容器中
3.3 编写Spring的配置文件其他相关配置
- 4.复制
jdbc.properties
和log4j.properties
配置文件到这个工程
三、整合开发(DAO开发模式)
1.创建POJO文件
package spring.mybatis.pojo;
import java.util.Date;
public class User {
private Integer id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + "]";
}
}
2.创建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">
<mapper namespace="user">
<select id="getUserById" parameterType="int" resultType="spring.mybatis.pojo.User">
select*from user where id=#{id}
</select>
<!-- 查询用户 -->
<select id="getUserByUserName" parameterType="String" resultType="spring.mybatis.pojo.User">
select*from user where username LIKE '%${value}%'
</select>
<!-- 增加用户 -->
<insert id="insertUser" parameterType="spring.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into `user`(`username`,`birthday`,`sex`,`address`)
values(#{username},#{birthday},#{sex},#{address})
</insert>
<!--更新用户 -->
<update id="updateUser" parameterType="spring.mybatis.pojo.User" >
update `user` set `username`=#{username} where `id`=#{id}
</update>
<!--删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from `user` where `id`=#{id}
</delete>
</mapper>
3.在SqlMapConfig.xml文件中加载User.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="mybatis/user.xml" />
</mappers>
</configuration>
4.创建UserDao接口
package spring.mybatis.dao;
import java.util.List;
import spring.mybatis.pojo.User;
//用户持久化接口
public interface UserDao {
//根据用户ID来查询用户信息
User getUserById(Integer id);
//根据用户名查找
List<User> getUserByUserName(String userName);
// 添加用户
void insertUser(User user);
}
5.编写UserDaoImpl实现类,关键要继承SqlSesionDaoSupport和实现UserDao
package spring.mybatis.daoImpl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import spring.mybatis.dao.UserDao;
import spring.mybatis.pojo.User;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
//根据ID查询用户
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = super.getSqlSession();
User user = sqlSession.selectOne("user.getUserById", id);
return user;
// sqlSession2不需要关闭
}
@Override
public List<User> getUserByUserName(String name) {
SqlSession sqlSession = super.getSqlSession();
List<User> list = sqlSession.selectList("user.getUserByUserName", name);
for (User user : list) {
System.out.println(user);
}
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession = super.getSqlSession();
sqlSession.insert("user.insertUser", user);
//不用再手动提交事务,全部交给Spring来管理
}
}
6.在applicationContext.xml中配置UserDaoImpl实现类
<?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">
<!-- 加载jdbc配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 数据库连接池 -->
<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>
<!-- SqlSessionFactory配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 别名包扫描 -->
<property name="typeAliasesPackage" value="spring.mybatis.pojo" />
</bean>
<!-- 传统Dao配置 -->
<bean class="spring.mybatis.daoImpl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
7.编写测试类
package spring.mybatis.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.mybatis.dao.UserDao;
import spring.mybatis.pojo.User;
public class UserDaoTest {
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testGetUserById() {
UserDao userDao = applicationContext.getBean(UserDao.class);
User user = userDao.getUserById(30);
System.out.println(user);
}
}
四、整合开发(动态代理开发模式)
1.创建UserMapper接口
package spring.mybatis.mapper;
import java.util.List;
import spring.mybatis.pojo.User;
public interface UserMapper {
// 根据用户ID来查询用户信息
User getUserById(Integer id);
// 根据用户名查找
List<User> getUserByUserName(String userName);
// 添加用户
void insertUser(User user);
}
2.在同一目录下创建UserMapper.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">
<!--
动态代理开发规则
1.namespace必须是接口的全路径名
2.接口的方法名必须与sql中id一致
3.接口的入参与parameterType类型一致
4.返回值类型必须与resultType类型一致
-->
<mapper namespace="spring.mybatis.mapper.UserMapper">
<!-- 查询ID -->
<!--id是sql语句的唯一标志 parameterType入参的数据类型 resultType是返回的数据类型 -->
<select id="getUserById" parameterType="int" resultType="spring.mybatis.pojo.User">
select*from user where id=#{id}
</select>
<!-- 查询用户名 -->
<select id="getUserByUserName" parameterType="String" resultType="spring.mybatis.pojo.User">
select*from user where username LIKE '%${value}%'
</select>
<!--插入用户的操作 -->
<insert id="insertUser" parameterType="spring.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into `user`(`username`,`birthday`,`sex`,`address`)
values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
3.在applicationContext.xml中配置动态代理方式
<?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">
<!-- 加载jdbc配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 数据库连接池 -->
<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>
<!-- SqlSessionFactory配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 别名包扫描 -->
<property name="typeAliasesPackage" value="spring.mybatis.pojo" />
</bean>
<!-- 动态代理配置方式:第一种方式MapperFactoryBean -->
<bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 配置扫描一个接口 -->
<bean parent="baseMapper">
<property name="mapperInterface" value="spring.mybatis.mapper.UserMapper" />
</bean>
<!-- 动态代理,第二种方式:包扫描(推荐): -->
<!-- basePackage多个包用","分隔 -->
<property name="basePackage" value="spring.mybatis.mapper" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="spring.mybatis.mapper" />
</bean>
4.编写测试类
package spring.mybatis.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.mybatis.mapper.UserMapper;
import spring.mybatis.pojo.User;
public class UserMapperTest {
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void testGetUserById() {
UserMapper userMapper = applicationContext.getBean(UserMapper.class);
User user = userMapper.getUserById(27);
System.out.println(user);
}
}