Spring学习(九)Spring整合Mybatis
spring整合mybatis
导入相关jar包
- junit
- mybatis
- mysql
- spring
- aop织入
- mybatis-spring
- lombok【非必要】
mybatis使用步骤
这部分不理解的可以先去学习mybatis:mybatis专栏
-
编写实体类
package com.hj.pojo; import lombok.Data; @Data public class User { private int id; private String name; private String pwd; }
-
编写核心配置文件
<?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="com.hj.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper class="com.hj.mapper.UserMapper"/> </mappers> </configuration>
-
编写接口
package com.hj.mapper; import com.hj.pojo.User; import java.util.List; public interface UserMapper { public List<User> selectUser(); }
-
编写Mapper.xml
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--核心配置文件--> <mapper namespace="com.hj.mapper.UserMapper"> <select id="selectUser" resultType="user"> select * from mybatis.user; </select> </mapper>
-
测试
import com.hj.mapper.UserMapper; import com.hj.pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MyTest { @Test public void test() throws IOException { String resources = "mybatis-config.xml"; InputStream in = Resources.getResourceAsStream(resources); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in); SqlSession sqlSession = sessionFactory.openSession(true); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.selectUser(); for (User user : userList) { System.out.println(user); } } }
mybatis整合
首先给一个mybatis-spring的文档:mybatis-spring
整合方式一
首先在刚刚的mybatis项目里引入spring。在resources里面新建一个spring-dao.xml(名称不重要)作为spring的配置文件,我们首先把mybatis的sqlSessionFactory对象交给spring托管。同时也将mybatis中的数据源替换成spring的数据源。这样可以把mybatis的配置文件完全用spring的配置文件来代理,把内容都放到bean里
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--DataSource:使用spring的数据源替换mybatis的配置 c3p0 dbcp druid
我们这里使用spring提供的jdbc
有了这段后,可以把mybatis-config.xml里的environments标签以及内容都删除
-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--绑定mybatis配置文件,这里可以写mybatis-config.xml里的内容,包括起别名等等-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--有了这段后,可以把mybatis-config.xml里的mapper标签以及内容都删除-->
<property name="mapperLocations" value="classpath:com/hj/mapper/*.xml"/>
</bean>
</beans>
这样其实就已经很完备了。我们只需要写一个UserMapper实现类:
public class UserMapperImpl implements UserMapper {
//我们所有的操作,在mybatis的时候都使用sqlSession来执行,现在都使用SqlSessionTemplate执行
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
return sqlSession.getMapper(UserMapper.class).selectUser();
}
}
然后我们可以把UserMapperImpl类也交给spring托管,然后根据set方法注入我们在spring的bean中注册的sqlSession就可以使用了!
<!--这就是mybatis里的sqlSession,有了以后就不需要自己再去new sqlSession对象了-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--这里只能用构造器注入sqlSessionFatory,因为源码里没有set方法,但有构造方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!--我们把UserMapper的实现类也放到spring中管理,这样直接使用就好了-->
<bean id="userMapper" class="com.hj.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
这样一来我们的spring-dao.xml就完整了。直接再开一个测试类:
public class MyTest {
@Test //spring使用方法
public void test2(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
List<User> userList = userMapper.selectUser();
for (User user : userList) {
System.out.println(user);
}
}
}
可以看到结果和mybatis的是一样的,成功使用spring整合了mybatis。我们不需要去写mybatis的配置文件了,也不需要去new sqlSession了。转而在类里直接使用sqlSessionTemplate当做mybatis里的sqlSession来使用就可以了。最后把类也托管给spring。就可以直接使用该对象了!
由此,我们整合的步骤为:
1.在spring中编写数据源配置(替换掉mybatis里的)
<!--DataSource:使用spring的数据源替换mybatis的配置 c3p0 dbcp druid
我们这里使用spring提供的jdbc
有了这段后,可以把mybatis-config.xml里的environments标签以及内容都删除
-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
2.sqlSessionFactory交给spring托管 这里托管的时候要求注入数据源属性,也就是1的内容
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--绑定mybatis配置文件,这里可以写mybatis-config.xml里的内容,包括起别名等等-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--有了这段后,可以把mybatis-config.xml里的mapper标签以及内容都删除-->
<property name="mapperLocations" value="classpath:com/hj/mapper/*.xml"/>
</bean>
3.sqlSessionTemplate(就是mybatis里的sqlSession) 这里托管的时候要求注入sqlSessionFactory,也就是2的内容
<!--这就是mybatis里的sqlSession,有了以后就不需要自己再去new sqlSession对象了-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--这里只能用构造器注入sqlSessionFatory,因为源码里没有set方法,但有构造方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
4.给接口加实现类(实现类里使用sqlSessionTemplate对象) 和mybatis一样,直接使用sqlSessionTemplate就完事了。这个sqlSessionTemplate对象可以无缝代替mybatis里的sqlSession对象。而且sqlSessionTemplate还是线程安全的,可以在多个DAO或映射器使用。
public class UserMapperImpl implements UserMapper {
//我们所有的操作,在mybatis的时候都使用sqlSession来执行,现在都使用SqlSessionTemplate执行
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
return sqlSession.getMapper(UserMapper.class).selectUser();
}
}
5.将自己的实现类注入到spring中 这里是spring的内容了,IOC容器思想
<!--我们把UserMapper的实现类也放到spring中管理,这样直接使用就好了-->
<bean id="userMapper" class="com.hj.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
6.直接在spring容器中拿对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
List<User> userList = userMapper.selectUser();
for (User user : userList) {
System.out.println(user);
}
整合方式二 sqlSessionDaoSupport
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供 SqlSession
。调用 getSqlSession()
方法你会得到一个 SqlSessionTemplate
,之后可以用于执行 SQL 方法。现在利用这个,我们连sqlSession都不需要写了。
新建一个UserMapperImpl2.java文件:
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectUser() {
SqlSession sqlSession = getSqlSession();
return sqlSession.getMapper(UserMapper.class).selectUser();
}
}
我们连sqlSession都不需要配置了,直接就可以获取到sqlSession对象,然后如mybatis一般使用即可!
然后再把这个UserMapperImpl2对象注册到bean里。
<bean id="userMapper2" class="com.hj.mapper.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
然后直接测试!
@Test //SqlSessionDaoSupport
public void test3(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper userMapperImpl2 = context.getBean("userMapper2", UserMapper.class);
List<User> userList = userMapperImpl2.selectUser();
for (User user : userList) {
System.out.println(user);
}
}
方式二其实就是省略了spring配置文件中把sqlSessionTemplate注册到bean里的步骤,直接在实现类里继承SqlSessionDaoSupport就可以直接获得sqlSession对象。