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

使用MyBatis之前,需要先下载jar包并导入到项目库中。

mybatis框架主要是围绕着SqlSessionFactory来进行的,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。SqlSessionFactory的创建过程大致如下:

  1. 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
  2. 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
  3. 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
  4. SqlSessionFactory的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作
MyBatis配置

MyBatis与数据库的连接通过.xml配置文件来完成,我们只需要填写配置文件的一些属性和信息就可以,非常方便。
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
``

<?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/study"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper url="file:mappers/TestMapper.xml"/>
        <!-- 这就添加了一个映射器 -->
    </mappers>
</configuration>

DOCTYPE configuration说明这是一个配置文件。http://mybatis.org/dtd/mybatis-3-config.dtd是一个文档定义类型文件(.dtd),它里面规定了我们如何使用标签来正确进行配置。在上面的xml文件中有四个叶节点property,分别指定连接数据库的驱动,URL,登录用户名,密码。

创建session

配置好之后可以开始使用MyBatis。SqlSessionFactoryBuilder通过配置文件来创建一个SqlSessionFactory实例,每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,它是线程安全的。SqlSessionFactory又可以通过openSession方法来创建一个session对象,session可以创建多个,供不同线程使用,它是线程不安全的。

SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection。它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。使用完SqlSsesion之后关闭Session很重要,应该确保使用finally块来关闭它。

public static void main(String[] args) throws FileNotFoundException {
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
    try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){     // 这里的true表示开启自动提交,若false则进入事务模式,需手动commit
            //暂时还没有业务
    }
}

openSession(boolean b)方法里的一个参数表示是否开启自动提交autoCommit。

SqlSession几乎可以完成所有的数据库操作,接口中定义了大量的方法。

映射器mapper

现在我们想读取一张表并将其内容映射为一个实体类,首先编写实体类。

import lombok.Data;

@Data
public class Student {
    int sid;
    String name;
    String sex;
}

然后需要在根目录下创建一个mapper文件夹,创建新的xml文件来作为映射器。
TestMapper.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="TestMapper">
    <select id="selectStudent" resultType="com.test.entity.Student">
        select * from student
    </select>
</mapper>

其中namespace就是命名空间,每个Mapper都是唯一的,因此需要用一个命名空间来区分,它还可以用来绑定一个接口。我们在里面写入了一个select标签,表示添加一个select操作,同时id作为操作的名称,resultType指定为我们刚刚定义的实体类,表示将数据库结果映射为Student类,然后就在标签中写入我们的查询语句即可。

这样就写好了一个映射器,然后再将此映射器添加到MyBatis配置文件中即可。

<!-- 在mappers标签内部添加多个映射器 -->
<mappers>
    <mapper url="file:mappers/TestMapper.xml"/>
    <!-- 这就添加了一个映射器,除了url还可以用resource -->
</mappers>

使用selectList方法来获取多行数据。

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
        try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){

            List<Student> list=  sqlSession.selectList("selectStudent");
            list.stream()
                    .forEach(System.out::println);
        }
    }
}
分类: Mybatis

0 条评论

发表评论

邮箱地址不会被公开。