MyBatis入门

MyBatis

回顾JDBC

  1. 注册驱动
  2. 获取连接
  3. 获取数据库操作对象
  4. 执行SQL,操作数据库
  5. 处理结果集
  6. 关闭连接

Connection可以获得PreparedStatement或者Statement

ResultSet是SQL语句执行后返回的对象

PreparedStatement和Statement是用来执行SQL语句的对象

两者的区别:

PreparedStatement对SQL语句做了预编译,很好的解决了SQL注入的问题。

Statement是单纯的对字符串进行拼接,会产生SQL注入的问题

简介

Def: MyBatis是一个优秀的持久层的框架,支持定制化SQL语句,存储过程以及高级映射,大大简化了JDBC的笨重的代码。

MyBatis可以使用XML配置文件或者注解的方式来配置和映射原生类型、接口和pojo(Plain Object Java Object)

持久层是什么?持久层是一个将应用中产生的数据保存到数据库的过程

思路:导入依赖—》编写代码—》测试

1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>

入门

MyBatis中最重要的三个类

  1. SqlSessionFactoryBuilder
  2. SqlSessionFactory
  3. SqlSession

每个基于MyBatis的应用都是以一个SqlSessionFactory实例为核心的。这个实例需要通过SqlSessionFactoryBuilder加载配置文件获得。这个配置文件可以通过两种方式获得,第一种是以XML文件的形式存在,第二种是在java代码对象的形式存在

构建SqlSessionFactory

mybatis-config.xml配置构建SqlSessionFactory所需要的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${userName}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>

在java中加载配置文件,通过SqlSessionFactoryBuilder构建SqlSessionFactory实例

1
2
3
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

通过java代码配置不推荐,略

构建SqlSession

SqlSession,通过此对象获得接口的映射器实例,该映射对象对标JDBC中接口的实现类

1
2
3
4
5
6
//开启一个sqlSession对象,默认关闭自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession();
//开启自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);

TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);

映射SQL语句

通过XML配置文件的方式和接口做绑定,实现接口方法

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lizhi.mapper.TeacherMapper">
<select id="listTeachers" resultType="com.lizhi.pojo.Teacher">
SELECT * FROM teacher
</select>
</mapper>
  • mapper标签的namespace属性指向被绑定的接口
  • 标签内书写SQL语句,id为接口中的方法名
    • select标签实现select方法
    • insert标签实现insert方法
    • update标签实现update方法
    • delete标签实现delete方法

通过注解的方式实现SQL映射

1
2
@Select("SELECT * FROM teacher WHERE id = #{id}")
Teacher getTeacherById(int id);

选择何种方式实现SQL映射,取决于自身。

但是如果SQL复杂的情况下,尽量不要使用注解开发,使用XML的方式去做SQL映射

三个对象的作用域(Scope)

  • SqlSessionFactoryBuilder

该对象就一个作用,通过读取一些配置获取SqlSessionFactory实例对象。

我们没有理由一直保留它,因为SqlSessionFactory将被保存在全局作用域中,以保证所有的XML解析资源可以被释放给做其他事情,所以它的作用域应该是局部变量

  • SqlSession

该对象就一个作用,通过getMapper方法获取映射器实例。

每个线程都应该有它自己的SqlSession对象,因为该对象不是线程安全的,因此它是不能被共享的,所以它的最佳作用域是局部变量。

在web框架中,可以将其放到request的作用域中,返回一个响应前,关闭SqlSession对象,这个关闭操作很重要

  • SqlSessionFactory

该对象就一个作用,通过openSession方法获取SqlSession对象。

因为SqlSession对象是线程不安全的,所以每次查询数据库都需要一个新的SqlSession对象,既然SqlSessionFactoryBuilder的作用域为局部变量,那么在我们第一次创建出来SqlSessionFactory对象的时候,就可以将其保存在全局作用域中,下次就不需要再创建SqlSessionFactoryBuilder对象了,所以SqlSessionFactory的最佳作用域是全局唯一变量。

给作者买杯咖啡吧~~~