Java EE之SSM框架整合开发 -- (6) MyBatis开发入门

本章主要内容: MyBatis环境的构建、MyBatis的工作原理、与Spring框架的整合开发、MyBatis的入门程序。

前言

1 、简述MyBatis的工作原理?

mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。

详细流程如下:

1.加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

2.SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

3.SqlSession对象完成和数据库的交互:

a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。

mybatis层次图:

2.简述MyBatis与Spring的整合过程

答:

1、实现MyBatis与Spring的整合,需要导入相关JAR包,包括MyBatis、Spring以及其他JAR包:

1)MyBatis框架所需的JAR包;

2)Spring框架所需的JAR包;

3)MyBatis与Spring整合的中间JAR包;

4)数据库驱动JAR包;

5)数据源所需的JAR包。

2、在Spring中配置MyBatis工厂

3、使用Spring管理MyBatis的数据操作接口。整合示例参加6.5.4节。

3.除MyBatis持久化框架外,您还知道哪些持久化框架?

答:Hibernate

6.1 MyBatis简介

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。

MyBatis 是一个基于Java的持久层框架。MyBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO),它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和Java的 POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

6.2 MyBatis环境的构建

MyBatis的3.4.5版本可以通过“https://github.com/mybatis/mybatis-3/releases”网址下载。下载时只需选择mybatis-3.4.5.zip即可,解压后得到如图6.1所示的目录。

图6.1中mybatis-3.4.5.jar是MyBatis的核心包,mybatis-3.4.5.pdf是MyBatis的使用手册,lib文件夹下的JAR是MyBatis的依赖包。 使用MyBatis框架时,需要将它的核心包和依赖包引入到应用程序中。如果是Web应用,只需将核心包和依赖包复制到/WEB-INF/lib目录中。

6.3 MyBatis的工作原理

简述MyBatis的工作原理:

1)读取MyBatis配置文件mybatis-config.xml。mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,如数据库连接信息。

2)加载映射文件。映射文件即SQL映射文件,文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中一张表。

3)构造会话工厂。通过MyBatis的环境等配置信息,构建会话工厂SqlSessionFactory。

4)创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含执行SQL语句的所有方法。

5)MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。

6)在Executor接口的执行方法中,有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。

7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。

8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。

过程如图示:

6.4 使用Eclipse开发MyBatis入门程序

本节使用第5章MySQL数据库springtest的user数据表进行讲解。下面通过一个实例讲解如何使用Eclipse开发MyBatis入门程序,具体过程如下。

1.创建Web应用,并添加相关JAR包

2.创建日志文件log4j.properties

MyBatis默认使用log4j输出日志信息,如果开发者需要查看控制台输出的SQL语句,那么需要在classpath路径下配置其日志文件。在应用的src目录下创建log4j.properties文件,内容如下:

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

日志文件中配置了全局的日志配置、MyBatis的日志配置和控制台输出,其中MyBatis的日志配置用于将com.mybatis包下所有类的日志记录级别设置为DEBUG。该配置文件内容不需要开发者全部手写,可以从MyBatis使用手册中Logging小节复制,然后进行简单修改。

3.创建持久化类MyUser.java

在src目录下,创建一个名为com.mybatis.po包,在该包中创建持久化类MyUser类中声明的属性与数据表user(创建表的代码参照5.1)的字段一致

package com.mybatis.po;
/**
 *springtest数据库中user表的持久化类
 *属性和表中字段一一对应,并重写了toString()
 */
public class MyUser {
  private Integer uid;//主键
  private String uname;
  private String usex;
  public Integer getUid() {
    return uid;
  }
  public void setUid(Integer uid) {
    this.uid = uid;
  }
  public String getUname() {
    return uname;
  }
  public void setUname(String uname) {
    this.uname = uname;
  }
  public String getUsex() {
    return usex;
  }
  public void setUsex(String usex) {
    this.usex = usex;
  }
  @Override
  public String toString() {
    return "User [uid=" + uid +",uname=" + uname + ",usex=" + usex +"]";
  }
}

4.创建映射文件UserMapper.xml

在src目录下,创建一个名为com.mybatis.mapper包,在该包中创建映射文件UserMapper.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.mybatis.mapper.UserMapper">
  <!-- 根据uid查询一个用户信息 -->
  <select id="selectUserById" parameterType="Integer" 
    resultType="com.mybatis.po.MyUser">
    select * from user where uid = #{uid}
  </select>
  <!-- 查询所有用户信息 -->
  <select id="selectAllUser"  resultType="com.mybatis.po.MyUser">
    select * from user
  </select>
  <!-- 添加一个用户 ,#{uname}为com.mybatis.po.MyUser的属性值-->
  <insert id="addUser" parameterType="com.mybatis.po.MyUser">
    insert into user (uname,usex) values(#{uname},#{usex})
  </insert>
  <!-- 修改一个用户 -->
  <update id="updateUser" parameterType="com.mybatis.po.MyUser">
    update user set uname = #{uname},usex = #{usex} where uid = #{uid}
  </update>
  <!-- 删除一个用户 -->
  <delete id="deleteUser" parameterType="Integer"> 
    delete from user where uid = #{uid}
  </delete>
</mapper>

上述映射文件中,<mapper>元素是配置文件的根元素,它包含了一个namespace属性,该属性值通常设置为“包名+SQL映射文件名”,指定了唯一的命名空间。子元素<select>、<insert>、<update>以及<delete>中的信息是用于执行查询、添加、修改以及删除操作的配置。在定义的SQL语句中,“#{}”表示一个占位符,相当于“?”,而“#{uid}”表示该占位符待接收参数的名称为uid。

5.创建MyBatis的配置文件mybatis-config.xml

在src目录下,创建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>
  <!-- 配置环境 -->
  <environments default="development">
    <environment id="development">
      <!-- 使用JDBC的事务管理 -->
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <!-- MySQL数据库驱动 -->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <!-- 连接数据库的URL -->
        <property name="url" value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
  <!-- 映射文件的位置 -->
  <mapper resource="com/mybatis/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

6.创建测试类MyBatisTest.java

在src目录下,创建一个名为com.mybatis.test包,在该包中创建MyBatisTest测试类。在测试类中,首先使用输入流读取配置文件,然后根据配置信息构建SqlSessionFactory对象。接下来通过SqlSessionFactory对象创建SqlSession对象,并使用SqlSession对象的方法执行数据库操作

package com.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.mybatis.po.MyUser;
public class MyBatisTest {
  public static void main(String[] args) {
    try {
      //读取配置文件mybatis-config.xml
      InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
      //根据配置文件构建SqlSessionFactory
      SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
      //通过SqlSessionFactory创建SqlSession
      SqlSession ss = ssf.openSession();
      //SqlSession执行映射文件中定义的SQL,并返回映射结果
      //com.mybatis.mapper.UserMapper.selectUserById为UserMapper.xml中的命名空间+select的id
      //查询一个用户
      MyUser mu = ss.selectOne("com.mybatis.mapper.UserMapper.selectUserById", 1);
      System.out.println(mu);
      //添加一个用户
      MyUser addmu = new MyUser();
      addmu.setUname("陈恒");
      addmu.setUsex("男");
      ss.insert("com.mybatis.mapper.UserMapper.addUser",addmu);
      //修改一个用户
      MyUser updatemu = new MyUser();
      updatemu.setUid(1);
      updatemu.setUname("张三");
      updatemu.setUsex("女");
      ss.update("com.mybatis.mapper.UserMapper.updateUser", updatemu);
      //删除一个用户
      ss.delete("com.mybatis.mapper.UserMapper.deleteUser", 3);
      //查询所有用户
      List<MyUser> listMu = ss.selectList("com.mybatis.mapper.UserMapper.selectAllUser");
      for (MyUser myUser : listMu) {
        System.out.println(myUser);
      }
      //提交事务
      ss.commit();
      //关闭SqlSession
      ss.close();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

可能小伙伴们心里有些疑惑,先记下来,安安静静的敲完这个例子代码,并成功运行,细节下面会将。结果截图如下:

6.5 MyBatis与Spring的整合

1. 导入相关JAR包

MyBatis框架所需的JAR包:包括它的核心包和依赖包,包的详情见6.2节。

Spring框架所需的JAR包:Spring框架所需的JAR包,包括它的核心模块JAR、AOP开发使用的JAR、JDBC和事务的JAR包(其中依赖包不需要再导入,因为MyBatis已提供),具体如下:

aopalliance-1.0.jar
aspectjweaver-1.8.13.jar
spring-aop-5.0.2.RELEASE.jar
spring-aspects-5.0.2.RELEASE.jar
spring-beans-5.0.2.RELEASE.jar
spring-context-5.0.2.RELEASE.jar
spring-core-5.0.2.RELEASE.jar
spring-expression-5.0.2.RELEASE.jar
spring-jdbc-5.0.2.RELEASE.jar
spring-tx-5.0.2.RELEASE.jar

MyBatis与Spring整合的中间JAR包:该中间JAR包的最新版本为mybatis-spring-1.3.1.jar。此版本可从地址“http://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.1”下载。

数据库驱动JAR包: 本书所使用的MySQL数据库驱动包为mysql-connector-java-5.1.45-bin.jar。

数据源所需的JAR包: 整合时使用的是DBCP数据源,需要准备DBCP和连接池的JAR包。最新版本的DBCP的JAR包为commons-dbcp2-2.2.0.jar,可从地址“http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi”下载;最新版本的连接池的JAR包为commons-pool2-2.5.0.jar,可从地址“http://commons.apache.org/proper/commons-pool/download_pool.cgi”下载。

2. 在Spring中配置MyBatis工厂

通过与Spring的整合,MyBatis的SessionFactory交由Spring来构建。构建时需要在Spring的配置文件中添加如下代码:

<!-- 配置数据源 -->
  <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://jiahao.work:3306/springtest?characterEncoding=utf8" />
      <property name="username" value="jdbc" />
      <property name="password" value="jdbc" />
      <!-- 最大连接数 -->
      <property name="maxTotal" value="30"/>
      <!-- 最大空闲连接数 -->
      <property name="maxIdle" value="10"/>
      <!-- 初始化连接数 -->
      <property name="initialSize" value="5"/>
  </bean>
  <!-- 配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 -->  
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <!-- configLocation的属性值为MyBatis的核心配置文件 -->
        <property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml"/>
    </bean>  

3 .使用Spring管理MyBatis的数据操作接口

使用Spring管理MyBatis的数据操作接口的方式有多种。其中,最常用最简洁的一种是基于MapperScannerConfigurer的整合。该方式需要在Spring的配置文件中加入以下内容:

<!--Mapper代理开发,使用Spring自动扫描MyBatis的接口并装配
   (Spring将指定包中所有被@Mapper注解标注的接口自动装配为MyBatis的映射接口)  --> 
     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <!-- mybatis-spring组件的扫描器 com.dao只需要接口(接口方法与SQL映射文件中相同)-->
       <property name="basePackage" value="com.dao"/>
       <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
     </bean>

4.创建数据访问接口

在src目录下,创建一个名为com.dao的包,在该包中创建UserDao接口,并将接口使用@Mapper注解为Mapper,接口中的方法与SQL映射文件一致。源码太多,具体代码见文末Github地址。

@Repository("userDao")
@Mapper
/*使用Spring自动扫描MyBatis的接口并装配
(Spring将指定包中所有被@Mapper注解标注的接口自动装配为MyBatis的映射接口*/
public interface UserDao {
  /**
   * 接口方法对应SQL映射文件UserMapper.xml中的id
   */
  public MyUser selectUserById(Integer uid);
  public List<MyUser> selectAllUser();
  public int addUser(MyUser user);
  public int updateUser(MyUser user);
  public int deleteUser(Integer uid);
}

5.创建控制层

在src目录下,创建一个名为com.controller的包,在包中创建UserController类,在该类中调用数据访问接口中的方法。

@Controller("userController")
public class UserController {
  @Autowired
  private UserDao userDao;
  public void test() {
    //只需要调用userDao中的接口即可--接口由Spring容器自动装配了Mybatis的映射接口--UserMapper.xml
    //查询一个用户
    MyUser auser = userDao.selectUserById(66);
    System.out.println(auser);
    System.out.println("================");
    //添加一个用户
    MyUser addmu = new MyUser();
    addmu.setUname("陈恒");
    addmu.setUsex("男");
    int add = userDao.addUser(addmu);
    System.out.println("添加了" + add + "条记录");
    System.out.println("================");
    //修改一个用户
    MyUser updatemu = new MyUser();
    updatemu.setUid(1);
    updatemu.setUname("张三");
    updatemu.setUsex("女");
    int up = userDao.updateUser(updatemu);
    System.out.println("修改了" + up + "条记录");
    System.out.println( "================");
    //删除一个用户
    int dl = userDao.deleteUser(62);
    System.out.println("删除了" + dl + "条记录");
    System.out.println("================");
    //查询所有用户
    List<MyUser> list = userDao.selectAllUser();
    for (MyUser myUser : list) {
      System.out.println(myUser);
    }
  }
}

6.创建测试类

在包com.controller中,创建测试类TestController,代码如下:

ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController uc = (UserController)appCon.getBean("userController");
uc.test();

结果同6.3小节是一样的,截图如下:

6.6 使用MyBatis Generator插件自动生成映射文件

使用MyBatis Generator插件自动生成MyBatis所需要的DAO接口、实体模型类POJO、Mapping映射文件,将生成的代码复制到项目工程中即可,把更多精力放在业务逻辑上。MyBatis Generator有三种常用方法自动生成代码:命令行、Eclipse插件和Maven插件。本节使用比较简单的方法(命令行)自动生成相关代码。

1.准备相关JAR包

需要准备的JAR包:mysql-connector-java-5.1.45-bin.jar和mybatis-generator-core-1.3.6.jar

(http://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core/1.3.6)。

2.创建文件目录

在某磁盘根目录下新建一个文件目录。如,D:\generator。并将mysql-connector-java-5.1.45-bin.jar和mybatis-generator-core-1.3.6.jar文件复制到generator目录下。另外,在generator目录下,创建src子目录存放生成的相关代码文件。

3.创建配置文件

在第二步创建的文件目录(D:\generator)下创建配置文件,如D:\generator\generator.xml。文件目录如图所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--数据库驱动-->
    <classPathEntry    location="mysql-connector-java-5.1.22-bin.jar"/>
    <context id="DB2Tables"    targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接地址账号密码-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8" userId="root" password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!--生成Model类存放位置-->
        <javaModelGenerator targetPackage="com.po" targetProject="src">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="com.mapping" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.dao" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!--生成对应表及类名-->
        <table tableName="user" domainObjectName="Messgae" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

需要修改文件配置的地方我都已经把注释标注出来了,这里的相关路径(如数据库驱动包,生成对应的相关文件位置可以自定义)不能带有中文。

4.使用命令生成代码

打开命令提示符,进入D:\generator,输入命令:java -jar mybatis-generator-core-1.3.6.jar -configfile generator.xml –overwrite,具体命令随jar版本改变,如图所示:

java -jar mybatis-generator-core-1.3.6.jar -configfile generator.xml –overwrite

小技巧:Windows系统下,在该目录按住Shift键,右键鼠标选择"在此处打开命令窗口",复制粘贴生成语句的文件代码即可。

成功生成所需文件:

本教程所有源码地址:

https://github.com/jiahaoit/java_ssm_course

原文发布于微信公众号 - 浩Coding(gh_c4a2e63d2ca7)

原文发表时间:2019-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券