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 条评论