一、什么是 MyBatis?
根据官方文档Mybatis官方
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
JDBC就是一种持久化机制。文件IO也是一种持久化机制。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的
内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。
内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。
二、Mybatis的配置
- 用Maven创建一个工程然后引入mybatis依赖,在GItHub上查看版本库:Mybatis版本库
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
- mybatis需要一个xml的配置文件在resources目录下创建一个mybatis-config.xml,加入以下代码。下面代码部分的property标签就是平时需要声名的配置,在这里直接就可以声名。
url的参数 加&符号需要替换成&
<?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">
<!--事务管理器 JDBC 或者MANAGED -->
<transactionManager type="JDBC"/>
<!--数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper都需要在这里声名 不声明的话报错:Type interface com.itcase.dao.UserDao is not known to the MapperRegistry. -->
<mappers>
<!-- 报错:Could not find resource com/itcase/dao/UserMapper.xml-->
<mapper resource="com/itcase/dao/UserMapper.xml"/>
</mappers>
</configuration>
- 我们还需要用上面的mybatis-config.xm构建一个SqlSessionFactory
每个基于 MyBatis 的应用都是以一SqlSessionFactory 的实例为核心的。SqlSessionFactory的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
写一个工具类来加载配置文件和生成SqlSession
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用mybatis创建sqlSessionFactory类
String resources = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resources);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//得到sqlSession
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
三、Mybatis如何使用?
- 创建一个数据库和表
- 需要一个JavaBean用来存储数据库里传来的数据
package com.itcase.domain;
public class user {
private int id;
private String name;
private String psw;
public user(){
}
public user(int id, String name, String psw) {
this.id = id;
this.name = name;
this.psw = psw;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", name='" + name + '\'' +
", psw='" + psw + '\'' +
'}';
}
}
- 设置一个接口作为命名空间和接口内定义需要实现的方法,这个接口就是映射器。
public interface UserMapper{
public List<user> getList();
}
- 按照以前的方式我们就应该写Dao层了,在Dao层里写方法实现和sql语句,但是Mybatis使用另一种简单的方式实现方法:自定义一个UserMapper.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">
<!--namespace 运行空间绑定一个对应的 Dao/Mapper的接口-->
<mapper namespace="com.itcase.dao.UserMapper">
<!-- id就是上面那个接口里的方法名 select标签就相当于实现了这个查询方法 resultType 是返回结果根据方法可以得出来是User-->
<select id="getList" resultType="com.itcase.domain.user"> select * from db3.user </select>
</mapper>
- 测试
sqlSession.getMapper(接口映射器);返回一个Mapper可以直接可以调用接口映射器中的方法,它找到UserMapper.XML里的mapper命名空间获取id直接执行sql语句,并返回这个方法类型。
public class UserDaoTest {
public UserDaoTest(){ }
@Test
public void test1(){
//得到sqlSession对象
SqlSession sqlSession = MybatisUtil.getSqlSession();
//获取到UserDao的对象
UserMappermapper = sqlSession.getMapper(UserMapper.class);
//执行sql操作
List<user> list = mapper.getList();
for (user user : list) {
System.out.println(user);
}
sqlSession.close();
}
}