整合前先重新理下两个框架的基础的东西。
以前搭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>
这次完全没看别人搭建的代码,看着官方文档加上自己的理解还有不断的试。写出了文档里面没有说明的
可以运行看到整合结果的代码。