MyBatis用法——从纯MyBatis到MyBatis-Spring

Posted 不去天涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis用法——从纯MyBatis到MyBatis-Spring相关的知识,希望对你有一定的参考价值。

概述

引用一句《增广贤文》的句子:“昔时贤文,诲汝谆谆。集韵增广,多见多闻。观今宜鉴古,无古不成今。”希望能够尽快打通自己的任督二脉,跨入新的境界,共勉!

计算机编程有一个很有趣的现象,技术迭代更新速度特别特别快,总是让我们这些技术宅们应接不暇。总感觉怎么学都赶不上技术迭代更新的速度,抓不住时间的尾巴。无奈至极,悲情伤感,甚至消沉乏味。

迭代更新的背后藏着的一个现象需要引起特别的注意,如果没有注意到那么所有的新技术都容易让人摸不到头脑,只是学到了用法和表皮。

这个现象就是:大多数的技术都是在做更高层的封装,朝更便利的发展。大多的技术都是从原来的技术上发展起来的,都是以以前的技术做基础的。比如,要了解elastic-job,那么你最好先了解quartz,想了解quartz,最好先了解java的定时器;比如,想了解kafka或者rocketmq,最好先了解activemq;比如,想了解spring cloud,最好先了解spring boot, 想了解spring boot,最好先了解spring;比如,想了解spring mvc,最好先了解jsp,想了解jsp,最好先先了解servlet;比如,想了解spring mybatis,最好先了解mybatis,要想了解mybatis,最好先了解jdbc。

总结起来就是,每当我们对新技术一脸茫然时,很大的可能性就是我们对新技术的本源还不了解,需要补充相关方面的知识。当这些知识补全之后,对新技术就会豁然明了。

接下来的部分只涉及到最简单的使用,尚不涉及复杂映射、分页、排序、事务等内容。

纯MyBatis的使用

MyBatis的4大关键类

SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、映射器(Mapper)是MyBatis的四大关键类。

SqlSessionFactoryBuilder作用是加载配置信息和属性信息创建一个SqlSessionFactory。有了SqlSessionFactory我们就可以创建SqlSession,就相当于有了和数据库的连接(类比于jdbc的Connection)。SqlSession可以执行Mapper中的任何sql映射器,执行sql,完成和数据库的交互。

MyBatis配置文件

<!-- mybatis-config.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>
<properties resource="mybatis-config.properties">
</properties>

<typeAliases>
  <typeAlias alias="Blog" type="com.dangdang.model.Blog"/>
</typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="$jdbc.driver"/>
        <property name="url" value="$jdbc.url"/>
        <property name="username" value="$jdbc.username"/>
        <property name="password" value="$jdbc.password"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="com/dangdang/mapper/BlogMapper.xml"/>
  </mappers>
</configuration>

映射器(Mapper)

<!-- BlocMapper.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="com.dangdang.mapper.BlogMapper">

  <select id="selectBlog" resultType="Blog">
    select * from blog where id = #id
  </select>
</mapper>

Model类

package com.dangdang.model;

import java.util.Date;

public class Blog 
    private long id;
    private String content;
    private String postuser;
    private Date postdate;

    //...getter and setter ....

    public String toString() 
        return "id:" + this.id + " content:" + this.content + " user:" + this.postuser + " time:" + this.postdate;
    

调用MyBatis


public class App 

    public static void main( String[] args ) throws IOException
    
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            SqlSession session = sqlSessionFactory.openSession();
            try 
              Blog blog = (Blog) session.selectOne("com.dangdang.mapper.BlogMapper.selectBlog", 1);
              System.out.println(blog);
             finally 
              session.close();
            
    

类纯MyBatis的Mybatis-Spring用法

上一节中的Model、Mapper.xml、都不变,仅需要增加spring的xml配置文件,修改mybatis-config.xml配置文件即可。

spring 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:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
                http://www.springframework.org/schema/context  
                 http://www.springframework.org/schema/context/spring-context-3.2.xsd  
                http://www.springframework.org/schema/tx   
                http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">  

    <!-- 加载配置JDBC文件 -->  
    <context:property-placeholder location="classpath:mybatis-config.properties" />  
    <!-- 数据源 -->  
    <bean id="dataSource"  
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName">  
            <value>$jdbc.driver</value>  
        </property>  
        <property name="url">  
            <value>$jdbc.url</value>  
        </property>  
        <property name="username">  
            <value>$jdbc.username</value>  
        </property>  
        <property name="password">  
            <value>$jdbc.password</value>  
        </property>  
    </bean>  

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />   
        <property name="mapperLocations" value="classpath:com/dangdang/mapper/BlogMapper.xml" /> 
        <property name="configLocation" value="classpath:mybatis-config.xml"></property> 
    </bean>  
</beans>  

修改后的mybatis-config.xml

仅需要删除连接和mapper相关的配置就可以了,因为这些配置转移到了spirng的xml配置文件里面。如果不需要特殊配置 <settings><typeAliases> 的话,这个配置文件可以删掉不要。

<?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>
  <typeAlias alias="Blog" type="com.dangdang.model.Blog"/>
</typeAliases>

</configuration>

调用MyBatis

public class App 

    public static void main( String[] args )
    
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application-context.xml");
        SqlSessionFactory factory = (SqlSessionFactory)ac.getBean("sqlSessionFactory");

        SqlSession session = factory.openSession();
            try 
              Blog blog = (Blog) session.selectOne("com.dangdang.mapper.BlogMapper.selectBlog", 1);
              System.out.println(blog);
             finally 
              session.close();
            
    

MyBatis-Spring的最常见用法

当然一般来说我们不会像上边一节那样,直接使用SqlSessionFactory去执行数据库请求,因为MyBatis-Spring提供了更便利的用法。

他可以直接给我们生成dao实例对象,从而可以直接调用dao对象的相关方法。从而,不需要关系连接的关闭,更加直接、简便。

我们需要增加一个和BlogMapper对应的dao接口,需要修改spring的xml配置文件,增加映射器自动扫描。另外,mapper.xml的namespace值需要和对应的Dao.class的完全限定名一致。

增加IBlogManager接口

package com.dangdang.dao;

import com.dangdang.model.Blog;

public interface IBlogManager 
    Blog selectBlog(long id);

修改spring的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:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
                http://www.springframework.org/schema/context  
                 http://www.springframework.org/schema/context/spring-context-3.2.xsd  
                http://www.springframework.org/schema/tx   
                http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">  

    <!-- 加载配置JDBC文件 -->  
    <context:property-placeholder location="classpath:mybatis-config.properties" />  
    <!-- 数据源 -->  
    <bean id="dataSource"  
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName">  
            <value>$jdbc.driver</value>  
        </property>  
        <property name="url">  
            <value>$jdbc.url</value>  
        </property>  
        <property name="username">  
            <value>$jdbc.username</value>  
        </property>  
        <property name="password">  
            <value>$jdbc.password</value>  
        </property>  
    </bean>  

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />   
        <property name="mapperLocations" value="classpath:com/dangdang/mapper/BlogMapper.xml" /> 
        <property name="configLocation" value="classpath:mybatis-config.xml"></property> 
    </bean>  

    <bean id="MapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="com.dangdang.dao" />  
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 
    </bean>  
</beans>  

修改mapper.xml的namespace值

<?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">
  <!-- namespace需要和dao的类限定名一致 -->
<mapper namespace="com.dangdang.dao.IBlogManager">

  <select id="selectBlog" resultType="Blog">
    select * from blog where id = #id
  </select>
</mapper>

调用MyBatis

public class App 

    public static void main( String[] args )
    
             ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("application-context.xml");
             IBlogManager blogManager = ac.getBean(IBlogManager.class);

              Blog blog = blogManager.selectBlog(1);
              System.out.println(blog);
    

总结

几种方式走下来,总体感觉没有太大的差异,MyBatis-Spring只是结合了spring的注入、动态代理优势之后,免去了我们一些调用Mybatis时的代码,免去了SqlSessionFactoryBuilder的配置,把MyBatis的配置文件格式进行修改,融入到了spring的配置格式之中。

相关代码见:http://download.csdn.net/download/buqutianya/10182224

以上是关于MyBatis用法——从纯MyBatis到MyBatis-Spring的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis学习过程记录

Mybatis学习过程记录

Mybatis学习过程记录

mybatis开发

013 mybatis整合

mybatis实战教程(mybatis in action),mybatis入门到精通