MyBatis使用 - 基于XML和注解

MyBatis使用 - 基于XML和注解

Scroll Down

简介

什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

使用MyBatis

1.准备数据库

create table score
(
    sno           varchar(32) default '' not null
        primary key,
    name          varchar(32) default '' null,
    Java          int(32)                null,
    C             int(32)                null,
    Algorithm     int(32)                null,
    LinearAlgebra int(32)                null,
    English       int(32)                null,
    PE            int(32)                null
);

在表里添加几条数据

INSERT INTO `userinfo`.`score`(`sno`, `name`, `Java`, `C`, `Algorithm`, `LinearAlgebra`, `English`, `PE`) VALUES ('20180861200', '张三', 60, 90, 61, 70, 60, 60);
INSERT INTO `userinfo`.`score`(`sno`, `name`, `Java`, `C`, `Algorithm`, `LinearAlgebra`, `English`, `PE`) VALUES ('20180861249', '王五', 43, 65, 76, 33, 64, 76);
INSERT INTO `userinfo`.`score`(`sno`, `name`, `Java`, `C`, `Algorithm`, `LinearAlgebra`, `English`, `PE`) VALUES ('20180861255', '李四', 90, 80, 60, 30, 60, 100);
INSERT INTO `userinfo`.`score`(`sno`, `name`, `Java`, `C`, `Algorithm`, `LinearAlgebra`, `English`, `PE`) VALUES ('20180861258', 'john', 23, 54, 21, 35, 87, 57);
INSERT INTO `userinfo`.`score`(`sno`, `name`, `Java`, `C`, `Algorithm`, `LinearAlgebra`, `English`, `PE`) VALUES ('20180861259', 'jack', 41, 43, 54, 75, 43, 13);
INSERT INTO `userinfo`.`score`(`sno`, `name`, `Java`, `C`, `Algorithm`, `LinearAlgebra`, `English`, `PE`) VALUES ('20180861260', 'hellen', 23, 34, 76, 99, 57, 97);

2. 新建一个 Maven 项目

将下面的依赖代码置于 pom.xml 文件中:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
	<version>8.0.13</version>
    </dependency>
    <dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.2</version>
    </dependency>
    <dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
    </dependency>
</dependencies>

3. 新建一个 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">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
	        <property name="url" value="jdbc:mysql://localhost:3306/userinfo?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=true&amp;serverTimezone=UTC"/>
	        <property name="username" value="root"/>
	        <property name="password" value="LWJLWJ20000829"/>
	    </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/ScoreMapper.xml"/>
    </mappers>
</configuration>

还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。 environment 元素体中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。

4. 获取SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件来构建出 SqlSessionFactory 实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例。MyBatis 中有一个 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。但是在这里我是用自定义工具类来获取。

  • 在utils包下新建MyBatisUtils工具类
    image.png
  • 加入以下代码
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 java.io.IOException;
import java.io.InputStream;

/**
 * @author      : lwj
 * createTime  : 2020/6/29 14:05
 * description : Reprint please indicate the source
 */
public class MyBatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        InputStream inputStream = null;
        try {
            // 使用MyBatis 从 XML 文件中构建 SqlSessionFactory 的实例
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 有了 SqlSessionFactory,可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
     * @return SqlSession对象
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

从 SqlSessionFactory 中获取 SqlSession,执行 SQl 语句

既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。

  1. 准备实体类,MyBatis 应用了 ORM(对象关系映射) 思想,实体类字段应于数据库字段一一对应
import java.io.Serializable;

/**
 * @author : lwj
 * createTime  : 2020/6/29 14:15
 * description : Reprint please indicate the source
 */
public final class Score implements Serializable {
    private String sno;
    private String name;
    private Integer Java;
    private Integer C;
    private Integer Algorithm;
    private Integer LinearAlgebra;
    private Integer English;
    private Integer PE;
}

其余方法请自行补充

  1. dao 包下新建 ScoreMapper,
import cn.lwjppz.entites.Score;
import java.util.List;

/**
 * @author : lwj
 * createTime  : 2020/6/29 14:21
 * description : Reprint please indicate the source
 */
public interface ScoreMapper {
    List<Score> getAllScores();
}
  1. resources 下新建 mapper 文件夹,在此文件夹下新建 ScoreMapper.xml
    image.png
    需要注意:
    image.png

    • namespace:对应刚刚写的那个映射语句类 - ScoreMapper (需写全类名)
    • id:对应 ScoreMapper 中的 getAllScores 方法
    • resultType:查询结果类型
  2. 编写测试类测试:

import cn.lwjppz.dao.ScoreMapper;
import cn.lwjppz.entites.Score;
import cn.lwjppz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @author : lwj
 * createTime  : 2020/6/29 14:55
 * description : Reprint please indicate the source
 */
public class MainTest {
    @Test
    public void test() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        ScoreMapper scoreMapper = sqlSession.getMapper(ScoreMapper.class);
        List<Score> scores = scoreMapper.getAllScores();
        for (Score score: scores) {
            System.out.println(score);
        }
    }
}
  1. 测试结果
    image.png

使用注解

使用注解的方法很简单,只需在 ScoreMapper 中的 getAllScores 方法上加入 Select 注解
image.png

public interface ScoreMapper {
    @Select("SELECT * FROM score")
    List<Score> getAllScores();
}

删除 ScoreMapper.xml 中的 select 标签

image.png

测试通过

image.png

总结

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。

支付宝 微信