前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java EE之SSM框架整合开发 -- (6) MyBatis开发入门

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

作者头像
浩Coding
发布2019-07-03 14:36:17
7620
发布2019-07-03 14:36:17
举报
文章被收录于专栏:浩Coding浩Coding

本章主要内容: 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对象完成和数据库的交互:

代码语言:javascript
复制
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文件,内容如下:

代码语言:javascript
复制
# 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)的字段一致

代码语言:javascript
复制
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。

代码语言:javascript
复制
<?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。在该文件中,配置了数据库环境和映射文件的位置

代码语言:javascript
复制
<?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对象的方法执行数据库操作

代码语言:javascript
复制
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已提供),具体如下:

代码语言:javascript
复制
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的配置文件中添加如下代码:

代码语言:javascript
复制
<!-- 配置数据源 -->
  <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的配置文件中加入以下内容:

代码语言:javascript
复制
<!--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地址。

代码语言:javascript
复制
@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类,在该类中调用数据访问接口中的方法。

代码语言:javascript
复制
@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,代码如下:

代码语言:javascript
复制
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。文件目录如图所示:

代码语言:javascript
复制
<?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版本改变,如图所示:

代码语言:javascript
复制
java -jar mybatis-generator-core-1.3.6.jar -configfile generator.xml –overwrite

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

成功生成所需文件:

本教程所有源码地址:

https://github.com/jiahaoit/java_ssm_course

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩Coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档