这里mybatis与spring的整合配置方式分为三种:
- 传统的dao开发方式
- Mapper动态代理形式开发dao
- Mapper动态代理扫描包形式开发dao(增强第二种方式)
mybatis与spring三种开发方式详解(一)传统的dao开发方式
首先这里上一波@test测试代码,大家先看一下mybatis测试的完整的过程代码,以便后面的讲解。
public class MybatisTest {
@Test
public void testQueryUserById() throws Exception {
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 4. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 执行SqlSession对象执行查询,获取结果User
// 第一个参数是User.xml的statement的id,第二个参数是执行sql需要的参数;
Object user = sqlSession.selectOne("queryUserById", 1);
// 6. 打印结果
System.out.println(user);
// 7. 释放资源
sqlSession.close();
}
}
因此我们若想调用mybatis的crud方法,首先需要获取sqlSession对象。
我们话不多说,直接上本文主要内容
一. 传统的dao开发方式
1.创建pojo
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
...
//get/set方法
}
2.Mapper配置文件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="test">
<!-- 根据用户id查询 -->
<select id="queryUserById" parameterType="int" resultType="user">
<!-- 这里#{}中写什么都行,写个abc也行,相当于jdbc中?占位符 -->
select * from user where id = #{id}
</select>
3.mybatis核心配置文件SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载User.xml配置文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
3.Dao层接口以及实现类
UserDao.java (接口)
package com.itheima.mybatis.dao;
public interface UserDao {
public void queryUserById();
}
UserDaoImpl.java (实现类)
package com.itheima.mybatis.dao;
import org.mybatis.spring.support.SqlSessionDaoSupport;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
public void queryUserById(){
this.getSqlSession().selectOne("queryUserById", 1)
}
注意:这里需要dao实现类需要继承SqlsessionDaoSupport类,通过查看SqlsessionDaoSupport类源码
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.dao.support.DaoSupport;
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSession sqlSession;
private boolean externalSqlSession;
public SqlSession getSqlSession() {
return this.sqlSession;
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (!this.externalSqlSession) {
this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
}
}
由源码可知,成员变量已经声明sqlSession对象,并生成set方法,因此我们这里只需要在spring的xml配置文件中向UserDaoImpl类中注入sqlSessionFactory对象即可获取sqlSession对象。
4.Spring核心配置文件applicationContext.xml
(这个配置文件其实应该一开始就配置,为了容易讲解放到了这步)
配置连接池以及连接池的properties配置文件,这里用的是dbcp(c3p0也可以)
然后将sqlSessionFactory注入到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">
<context:property-placeholder location="classpath:db.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>
<!-- Mybatis的工厂 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 核心配置文件的位置 -->
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean>
<!-- 注入sqlSessionFactory -->
<bean id="userDao" class="com.itheima.mybatis.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
</bean>
</beans>
4.编写测试类
public class UserDaoTest {
@Test
public void testQueryUserById() {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// 获取userDao
UserDao userDao = this.context.getBean(UserDao.class);
User user = userDao.queryUserById(1);
System.out.println(user);
}
好啦,至此,利用传统的Dao接口和实现类的方法就已配置完成,有什么问题的话期待各位coder留言哦~