MyBatis 入门

2019/07/08 JavaWeb

MyBatis中文官网

Why MyBatis

传统 JDBC 缺点

传统 JDBC :

public class DBHelper {
    public static final String URL = "jdbc:mysql://localhost:3306/helloworld";

    public static final String NAME = "com.mysql.jdbc.Driver";

    public static final String USER = "root";
    public static final String PASSWORD = "root";

    private Connection connection;
    public PreparedStatement preparedStatement;

    public DBHelper(String sql) {
        try {
            Class.forName(NAME);
            connection = DriverManager.getConnection(URL, USER, PASSWORD);
            preparedStatement = connection.prepareStatement(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            this.connection.close();
            this.preparedStatement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

public class DeveloperDao {
    public List<DeveloperModel> getAllDevelopers() {
        List<DeveloperModel> developerList = new ArrayList<>();
        String sql = "select * from developer";
        DBHelper dbHelper = new DBHelper(sql);
        ResultSet resultSet = null;
        try {
            resultSet = dbHelper.preparedStatement.executeQuery();
            while (resultSet.next()) {
                developerList.add(buildDeveloperModel(resultSet));
            }
            resultSet.close();
            dbHelper.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return developerList;
    }
}

ConnectionStatementResultSet → 获取字段的值 → close

缺点,硬编码太多:

  1. 数据库驱动类名
  2. db 连接地址
  3. db 账号、密码
  4. SQL 语句
  5. 查询结果硬编码为表字段

还有数据库的频繁连接和断开。

任何一个有变动都需要修改 Java 代码、编译、重新发布。

MyBatis 的优点

MyBatis 采用配置文件动态管理 SQL 语句,并含有输入映射、输出映射机制,和数据库连接池配置的持久层框架,让开发人员将精力集中于 SQL 语句上。

优点:

  1. 可以将 SQL 语句配置在 XML 文件里
  2. 在 SQL 语句配置文件中提供输入参数的映射,实现参数动态配置
  3. 输出映射机制,可以将结果集的检索自动隐射成对应的 Java 对象
  4. 还可以创建自己的数据库连接池,在 XML 里进行配置管理

MyBatis 的整体架构

MyBatis 主要组成:

  1. 数据源配置文件
  2. SQL 映射配置文件
  3. 会话工厂 SqlSessionFactory
  4. 会话 SqlSession
  5. 执行器
  6. 底层封装对象

MyBatis 的核心就是基于 SQL 配置的 Mapper 映射文件,所有数据库操作都会基于该映射文件和配置的 SQL 语句。

会话工厂 SqlSessionFactory 可以根据数据库配置信息,产生可以连接数据库并交互的 会话 SqlSession 实例。

MyBatis 运行流程

MyBatis 的简单使用

MyBatis 的使用场景:对 SQL 优化要求较高,或者是项目需求经常变动。

增删改查

这次提交完成了 MyBatis 项目的基本搭建

<mapper namespace="test">
    <select id="findUserById" parameterType="int" resultType="Developer">
        SELECT * FROM DEVELOPER WHERE id=#{id}
    </select>
</mapper>

在这里插入图片描述

模糊查询

<mapper namespace="test">
    <!--模糊查询使用关键字 LIKE 再加上 '%${value}%'-->
    <select id="findUserByUserName" parameterType="java.lang.String" resultType="Developer">
        SELECT * FROM DEVELOPER WHERE name LIKE '%${value}%'
    </select>
</mapper>

在这里插入图片描述

映射配置里的 #{name} 表示取传入实体类的对应名称属性:

    <update id="updateUserName" parameterType="Developer">
        UPDATE DEVELOPER set NAME=#{name} WHERE id=#{id}
    </update>

运行时会根据名称反射获取值,如果和实体类的属性名不匹配,就会报错:

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'namer' in 'class top.shixinzhang.mybatis.po.DeveloperModel'

在 SQL 配置里需要拼接 SQL 语句时,需要使用 ${}

在 MyBatis 中,${} 可以在原有的 SQL 语句上拼接新的符合 SQL 语法的语句。

当接受简单类型时,${} 中只能写 value,而不能写其他任意名称。

MyBatis 配置文件的属性

SqlMapConfig 的属性

<?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>
    <!--1.配置属性-->
    <properties resource="db.properties">
        <!--<property name="password" value="123"/>-->
    </properties>
    <!--2.全局配置参数 *-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <!--是否启用缓存-->
        <setting name="cacheEnabled" value="true"/>
        <!--是否启动懒加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

    <!--3.配置别名的几种方式 **-->
    <typeAliases>
        <!--a.具体指定某个类的别名-->
        <!--<typeAlias type="top.shixinzhang.mybatis.po.DeveloperModel" alias="Developer"/>-->
        <!--b.该文件夹下,使用 @Alias 为具体类设置别名-->
        <package name="top.shixinzhang.mybatis.po"/>
    </typeAliases>

    <!--4.类型转换,输入参数到 db,db 到输出参数-->
    <typeHandlers>
        <typeHandler handler="top.shixinzhang.mybatis.typehandler.DateTypeHandler"
                     javaType="java.util.Date" jdbcType="TIMESTAMP"/>
    </typeHandlers>

    <!--5.对象工厂,创建对象之前调用-->
    <objectFactory type="top.shixinzhang.mybatis.objectfactory.MyObjectFactory">
        <property name="email" value="[email protected]"/>
    </objectFactory>

    <!--6.拦截 MyBatis 核心类的方法执行-->
    <plugins>
        <plugin interceptor="top.shixinzhang.mybatis.plugin.QueryPlugin">
            <property name="max" value="100"/>
        </plugin>
    </plugins>

    <!--7.有关数据库连接的数据 ***-->
    <!--和 Spring 整合后 environments 配置将被废除-->
    <environments default="development">
        <!--可以配置多个数据库连接环境,每个环境包括 事务管理器 和 数据源-->
        <environment id="development">
            <!--使用 JDBC 事务管理-->
            <transactionManager type="JDBC"/>
            <!--数据库连接池,POOLED  使用池来合理控制数据库的链接、关闭次数-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>

        </environment>
    </environments>

    <!--8.配置需要加载的 SQL 映射配置文件 ***-->
    <mappers>
        <!--相对路径-->
        <mapper resource="sqlmap/UserMapper.xml"/>
        <!--绝对路径-->
        <mapper url="file:///Users/zhangshixin/Documents/grow/backend/projects/MyBatisTest/src/main/resources/sqlmap/UserMapper.xml"/>
        <!--使用接口信息进行配置-->
        <mapper class=""/>
    </mappers>

</configuration>

Mapper 映射文件

Thanks

  • 《SpringMVC + MyBatis 开发从入门到项目实战》

Search

    Table of Contents