整合前先重新理下两个框架的基础的东西。
以前搭Hibernate那些,都是是自己看着别人已经搭好的视频,然后自己重新理了一次。这次Mybatis与Spring的整合。从最原始的官方文档开始搭起。要学的,是当这套东西没人搭过的时候,你自己一个人怎么搭起来。
包依赖用了maven,最后才放所有的包依赖吧。
MyBatis的搭建了一下基础的东西还有折腾了一下注释和xml配置。
MyBatis实战——前身iBatis、基础环境搭建和如何"钓鱼" 和 MyBatis之resultMap的作用和xml配置折腾
通过读取mybatis-config.xml,mybatis文件有相应的EmployeeMapper.xml(如果用的注释进行的映射,那么配置文件里面直接配置
带注释的接口类即可)EmployeeMapper映射了相应的JavaBean,通过SqlSessionFactory的实例化出来的SqlSession,执行对应方法,根据方法名EmployeeMapper.selectEmployee,回到EmployeeMapper.xml中找到和方法名相对应的id(注释方式的话找到接口类里面注释id对应的方法),根据sql语句,还有传入的参数,还有Bean,这几者的联系形成的映射,进行CURD操作。省去JDBC那些模板方法代码。
可以用JDBC的小例子来展示:参考Spring doc中的jdbc部分。
数据库先建了Employee的表
applicationContext.xml
TestSpringJDBC.java
这里并没有看到JdbcTemplate在构造方法中传入了什么,但他确实就是实现了。具体就是Spring帮你注入了你xml配置中的dataSource。
需要加入mybatis-spring-x.x.x.jar包,要和 Spring 一起使用 MyBatis,你需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类。之前只有Mybatis的时候是通过SqlSessionFactory的实例化出来的SqlSession。
像前面文章写MyBatis刚开始搭建的时候一样:
一个model:省略set和get方法
一个Mapper:
applicationContext.xml变为:
后面一个具体的实现我稍微改了下代码:
是的,官方文档就在这里终止的,但是之前单独用Mybatis这样实现就可以了。
现在整合Spring要如何入手,这是要结合回之前写的JDBCTemplate的例子。
我们给TestSpringJDBC的JdbcTemplate变量传入具体的DataSource,
现在给TestSpring的userMapper传入具体的UserMapper。传入之前,我们先要注册这个Mapper,根据官方文档的关于Mapper注册的说明:
MapperFactoryBean处理SqlSession的创建和关闭,我们根据自己的例子改为:Mapper具体的实现类
再把Mapper注入到TestSpring的userMapper中。
TestSpring添加具体实现:
这时候拿到的TestSpring实例t里面的userMapper已经是注入了MapperFactoryBean。
现在重新理一下思路。SqlSessionFactory 需要一个数据源DataSource,可以看成是一个连接数据库的配置。所以我们配置了DataSoruce和sqlSessionFactory。
Spring与Mybatis的整合里面,虽然现在具体不知道MapperFactoryBean的具体实现,但是通过文档的第六章注入映射器知道SqlSession的创建和关闭交由它,还有创建的代理类实现了UserMapper接口,并且注入到应用程序中。
这就是我们为什么这样配置的一个思路。
最后通过整合Spring,我们用了3行代码做到单独用Mybatis时11行代码做到的东西。
这次完全没看别人搭建的代码,看着官方文档加上自己的理解还有不断的试。写出了文档里面没有说明的
可以运行看到整合结果的代码。
以前搭Hibernate那些,都是是自己看着别人已经搭好的视频,然后自己重新理了一次。这次Mybatis与Spring的整合。从最原始的官方文档开始搭起。要学的,是当这套东西没人搭过的时候,你自己一个人怎么搭起来。
包依赖用了maven,最后才放所有的包依赖吧。
MyBatis
MyBatis是什么,开源持久化框架。通过抽象jdbc模板代码提供简单的api交互简化持久层实现。MyBatis的搭建了一下基础的东西还有折腾了一下注释和xml配置。
MyBatis实战——前身iBatis、基础环境搭建和如何"钓鱼" 和 MyBatis之resultMap的作用和xml配置折腾
通过读取mybatis-config.xml,mybatis文件有相应的EmployeeMapper.xml(如果用的注释进行的映射,那么配置文件里面直接配置
带注释的接口类即可)EmployeeMapper映射了相应的JavaBean,通过SqlSessionFactory的实例化出来的SqlSession,执行对应方法,根据方法名EmployeeMapper.selectEmployee,回到EmployeeMapper.xml中找到和方法名相对应的id(注释方式的话找到接口类里面注释id对应的方法),根据sql语句,还有传入的参数,还有Bean,这几者的联系形成的映射,进行CURD操作。省去JDBC那些模板方法代码。
Spring
而Spring是什么,Spring也是开源框架。简化Java开发。主要功能是依赖注入和面向切面工程。可以用JDBC的小例子来展示:参考Spring doc中的jdbc部分。
数据库先建了Employee的表
applicationContext.xml
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<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/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="TestSpringJDBC" class="DAO.TestSpringJDBC">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
TestSpringJDBC.java
public class TestSpringJDBC {
private JdbcTemplate jt;
public void setDataSource(DataSource dataSource) {
this.jt = new JdbcTemplate(dataSource);
}
public int get() {
int rowCount = this.jt.queryForObject("select count(*) from employee", Integer.class);
return rowCount;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestSpringJDBC t = ((TestSpringJDBC) context.getBean("TestSpringJDBC"));
System.out.println("the number in employee"+t.get());
}
}
这里并没有看到JdbcTemplate在构造方法中传入了什么,但他确实就是实现了。具体就是Spring帮你注入了你xml配置中的dataSource。
AOP的话先放着不用看。
两者的整合
再回到Mybatis与Spring整合的官方介绍。http://www.mybatis.org/spring/zh/index.html需要加入mybatis-spring-x.x.x.jar包,要和 Spring 一起使用 MyBatis,你需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类。之前只有Mybatis的时候是通过SqlSessionFactory的实例化出来的SqlSession。
像前面文章写MyBatis刚开始搭建的时候一样:
一个model:省略set和get方法
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
}
一个Mapper:
public interface EmployeeMapper
{
@Select("select * from employee where id = #{id}")
Employee findEmployeeById(Integer a);
}
applicationContext.xml变为:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<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/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- datasource bean -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
后面一个具体的实现我稍微改了下代码:
public class TestSpring {
private EmployeeMapper userMapper;
public EmployeeMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(EmployeeMapper userMapper) {
this.userMapper = userMapper;
}
public Employee findEmployeeByID(int userId) {
return this.userMapper.findEmployeeById(userId);
}
}
是的,官方文档就在这里终止的,但是之前单独用Mybatis这样实现就可以了。
String configxml = "mybatis-config.xml";
InputStream is = null;
try {
is = Resources.getResourceAsStream(configxml);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(is);
SqlSession s = sf.openSession();
EmployeeMapper employeeMapper = s.getMapper(EmployeeMapper.class);
Employee e = employeeMapper.findEmployeeById(47);
System.out.println(e.getFirst_name());
现在整合Spring要如何入手,这是要结合回之前写的JDBCTemplate的例子。
<bean id="TestSpringJDBC" class="DAO.TestSpringJDBC">
<property name="dataSource" ref="dataSource"/>
</bean>
我们给TestSpringJDBC的JdbcTemplate变量传入具体的DataSource,
现在给TestSpring的userMapper传入具体的UserMapper。传入之前,我们先要注册这个Mapper,根据官方文档的关于Mapper注册的说明:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
MapperFactoryBean处理SqlSession的创建和关闭,我们根据自己的例子改为:Mapper具体的实现类
<bean id="myuserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.mybatis3.mappers.EmployeeMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
再把Mapper注入到TestSpring的userMapper中。
<bean id="test" class="DAO.TestSpring">
<property name="userMapper">
<ref bean="myuserMapper" />
</property>
</bean>
TestSpring添加具体实现:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestSpring t = ((TestSpring) context.getBean("test"));
System.out.println(t.findEmployeeByID(45).getFirst_name());
}
这时候拿到的TestSpring实例t里面的userMapper已经是注入了MapperFactoryBean。
现在重新理一下思路。SqlSessionFactory 需要一个数据源DataSource,可以看成是一个连接数据库的配置。所以我们配置了DataSoruce和sqlSessionFactory。
Spring与Mybatis的整合里面,虽然现在具体不知道MapperFactoryBean的具体实现,但是通过文档的第六章注入映射器知道SqlSession的创建和关闭交由它,还有创建的代理类实现了UserMapper接口,并且注入到应用程序中。
这就是我们为什么这样配置的一个思路。
最后通过整合Spring,我们用了3行代码做到单独用Mybatis时11行代码做到的东西。
maven的包依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ckc</groupId>
<artifactId>Spring4Mybatis</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Spring4Mybatis Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-library -->
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4 </version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4 </version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>net.rossillo.mvc.cache</groupId>
<artifactId>spring-mvc-cache-control</artifactId>
<version>1.1.1-RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
<build>
<finalName>Spring4Mybatis</finalName>
</build>
</project>
这次完全没看别人搭建的代码,看着官方文档加上自己的理解还有不断的试。写出了文档里面没有说明的
可以运行看到整合结果的代码。