MyBatis

MyBatis是一款基于Java语言的持久层 持久层是指一个软件系统中负责对数据进行持久化存储和操作的模块或组件,通常用于将业务对象映射到底层数据库中的表结构,以便于对数据进行增、删、改和查等操作 框架,它通过优秀的SQL映射支持,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作,使得开发者可以将精力更多地放在业务逻辑的处理上面。同时,它还可以与Spring等主流框架集成使用,提高了应用的扩展性

要使用MyBatis,你需要以下几个步骤:

通过 Maven 构建工具引入 MyBatis 的依赖包。

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

resources包下 编写 MyBatis 配置文件,配置 SQL 映射关系、数据库连接信息等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
配置数据库连接的db.properties
resource:配置数据库连接文件路径(本地文件)
url:数据库连接文件路径(线上)
properties: 标签用于定义动态属性
resource:配置数据库连接文件路径(本地文件)
可以是 classpath 下的文件或文件系统路径。
可以在属性文件中定义键值对然后在 SQL 映射文件或配置文件中使用 ${key} 的方式引用。
-->
<properties resource="db.properties"> </properties>
<!--
MyBatis 中的 typeAliases 标签用于定义类型别名,可以简化 SQL 语句中的参数类型,使其更加简洁易读
type: 属性表示需要定义别名的类的 全限定类名(从com根目录开始 到 目标包的路径)
类型别名可以为java类创建缩写
-->
<typeAliases>
<!--
单个类取别名
<typeAlias type="com.Miku_39.pojo.TSysUser" alias="user"/>
-->
<!--批量取别名-->
<package name="com.Miku_39.pojo"/> <!--实体类包的完全限定名-->
</typeAliases>

<environments default="development">
<!--
MyBatis 可以配置成适应多种环境
default: 指定默认使用的数据库ID
environment: 数据库ID
每个 environment 子标签表示一个环境的配置,必须指定一个唯一的 id,这里分别为 dev 和 prod。在每 个 environment 标签中,可以定义一个事务管理器(transactionManager)和一个数据源 (dataSource),这里使用的是 MyBatis 内置的 POOLED 数据源类型和 JDBC 事务管理器类型。
-->
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!--驱动-->
<property name="driver" value="${db.driver}" />
<!--连接字符串-->
<property name="url" value="${db.url}" />
<!-- 数据库连接用户名-->
<property name="username" value="${db.user}" />
<!-- 数据库连接密码-->
<property name="password" value="${db.pwd}" />
</dataSource>
</environment>
</environments>
<!--
在MyBatis框架中,mappers标签用于指定MyBatis Mapper文件的位置
-->
<mappers>
<!--
mappers:单个加载映射文件
package:批量注册映射文件
-->
<mappers resource="mapper/TestMyBatis.xml"/><!--mapper包下的文件一一对应-->
</mappers>
</configuration>

如果要使用批量注册但不使用其他框架 mapper.xml文件需要放置在主要文件夹后 比如: com\Miku_39\mapper

1
2
3
4
5
6
# 数据库配置配置文件
db.driver=com.mysql.cj.jdbc.Driver
# MySql数据库连接字符串
db.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Beijing
db.user=root
db.pwd=root

编写 SQL 映射文件,定义 SQL 语句、参数映射以及结果映射等。

src > main > java > com > Miku_39 > Mapper 下添加Mapper接口

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface UserMapper {
//根据Id查询
User selectUserById(Integer id);
//查询所有
List<User> selectUserAll()
//插入
Integer insertUser(User user);
//删除
Integer deleteUser(User user);
//修改
Integer update(User user);

}

resources > mapper包下编写映射文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?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:指定对应的Mapper接口路径 / 只可用完全限定名
-->
<mapper namespace="com.Miku_39.Mapper.UserMapper">

<!--
Select: 查询标记
id:唯一标识 / 与Mapper接口名一一对应
resultType: 指定返回值类型
resultMap: 指定自定义返回值类型 / 一般适用于多表查询返回值
-->
<select id="selectUserById" resultType=""> <!-- 返回值类型查询一般返回为实体类 -->
SELECT * FROM ???? WHERE id=#{id}
</select>

<select id="selectUserAll" resultType=""> <!-- 返回值类型查询一般返回为实体类 -->
SELECT * FROM ????
</select>

<!--insert: 插入标记-->
<insert id="insertUser"><!-- 增删改方法一般返回受影响行数 所以一般不指定返回值 -->
INSERT INTO ???? () VALUES (#{????})
</insert>

<!--update : 修改标记-->
<update id="updateUser" >
UPDATE ???? SET ???? = #{ ???? } WHERE ????=#{ ???? }
</update>

<!--Delete: 删除标记-->
<delete id="deleteUser">
DELETE FROM ???? WHERE ?? =#{ ?? }
</delete>

</mapper>

在 Java 代码中通过 MyBatis 工厂模式获取 SqlSession 对象, SqlSession 执行 SQL。

使用MavenMaven 是一款自动化构建工具,Maven 能够帮助开发者管理和构建 Java 项目,让项目开发更加规范化和自动化,提高开发效率和代码质量 导入JUnit JUnit 是一个 Java 的单元测试框架,,帮助开发者编写、运行和管理单元测试任务。

使用JUnit 编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

import java.util.Date;
import java.util.List;

public class MybTest {
SqlSession session = null;
//JUnit 的测试注解,标注在方法上,指定该方法在每个测试方法执行前运行
//如果有多个 @Before 注解的方法,它们的执行顺序是按照它们在代码中的定义顺序执行的
@Before
public void MapperBefore() throws IOException {
//定义MyBatis核心配置文件变量
String resource = "mybatis-config.xml";
//创建流 装载MyBatis核心配置文件

/* 这是 MyBatis 提供的一个工具类 Resources 的静态方法 getResourceAsStream()
用于读取指定资源文件路径的输入流对象,一般读取例如 mybatis-config.xml、mapper.xml 等文件 */
InputStream inputStream = Resources.getResourceAsStream(resource);
/*
创建 SqlSessionFactory 并且实例化SqlSessionFactoryBuilder 装载 MyBatis 全局配置文件和映射文件
装载后 构建生成 SqlSession 实例对象
并将配置信息加载到 SqlSession 中
SqlSession 实例代表了一次数据库连接会话
通过 SqlSession 对象可以调用 select、delete、insert、update 等方法来操作数据库
一般情况下一个应用只需要一个 SqlSessionFactory 对象就足够了,不建议频繁创建。
同时 SqlSessionFactory 对象是线程安全的,可以被多个线程共享使用
*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//获取 SqlSession 对象 并且把自动提交事务打开
//有除查询外的SQL语句就要打开
session=sqlSessionFactory.openSession(true);
}

// @After 注解则是在每个测试方法执行后执行清理操作,例如关闭数据库连接等... ...
@After
public void MapperAfter() {
session.close();
}

@Test
public void Usertest() throws IOException {
//调用UserMapper中的selectUserById方法
// 实体类 对象名 获取SQLSession对象.(获取 Mapper 接口的实例对象).查询方法(id)
User user=session.getMapper(UserMapper.class).selectUserById(1);//Mapper接口名称
//输出实体类对象
System.out.println(user);
}


@Test
public void addUserTest() throws IOException {
//实例化实体类对象 传递要添加的值 或者使用.set方法赋值
User user=new User( ?? , ?? );
//使用SQLSession对象调用添加方法将赋值后的对象传入
int count = session.getMapper(UserMapper.class).insertUser(user);
//判断是否添加成功
if (count > 0) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
}



}