MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
使用MyBatis之前,需要先下载jar包并导入到项目库中。
mybatis框架主要是围绕着SqlSessionFactory来进行的,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。SqlSessionFactory的创建过程大致如下:
- 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings
- 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
- 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
- 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);
}
}
}
0 条评论