Mybatis

Mybatis简介

其实就是应用于Dao持久层的,封装了JDBC的一个框架,那Mybatis和JDBC差在哪里为什么要用Mybatis不用JDBC,因为Mybatis支持事务管理,而且更多API操作更加方便。

文明用语:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官网地址:MyBatis中文网

关系映射:

ORM框架:java是一个面向对象的OOP编程语言,那我们操作的是一个个对象,而数据库是一个个表结构,ORM框架就是将表结构的记录映像为java对象,那么我们操作表结构就更加的灵活了。

Mybatis和hibernate的比较对象

Mybatis Hibernate
半自动ORM框架 全自动ORM框架
必须写SQL 可以不写
事务处理 事务处理
缓存都支持 缓存都支持,二级缓存比mybatis好

Mybatis的基本使用

1、创建maven项目添加对应的依赖

添加mybatis的依赖然后要操作MySQL的表结构所以我们需要加载MYSQL的驱动依赖

这个操作类似于JDBC中的导入jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--添加MYSQL的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>

2、创建全局配置文件

这个操作类似于JDBC中的创建连接数据库的Connection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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/mytestdb3?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>

3、定义user对象

我们将mybatis是一个orm框架,那么会将表结构中的数据映射为java中的对象,所以我们需要创建该对象与其对应

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
package com.bitzh.pojo;

/**
* @Auther: oyy0v0
* @Date: 2024/4/15 - 04 - 15 - 22:41
* @Description: com.bitzh.pojo
* @version: 1.0
*/
public class User {
private String id;
private String username;
private String address;
private String gender;

@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", address='" + address + '\'' +
", gender='" + gender + '\'' +
'}';
}

public User(String id, String username, String address, String gender) {
this.id = id;
this.username = username;
this.address = address;
this.gender = gender;
}

public User() {
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}
}

4、创建映射文件

mybatis要操作数据库,那么我们需要映射文件中来写sql语句。

1
2
3
4
5
6
7
8
9
10
<?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="com.bitzh.pojo.User">
<!--添加用户信息-->
<insert id="addUser" parameterType="com.bitzh.pojo.User">
INSERT into user (id,username,address,gender) values(#{id},#{username},#{address},#{gender})
</insert>
</mapper>

5、将映射文件关联配置文件

上述的映射文件和配置文件是没有关联的我们需要再主配置文件中添加相关的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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/mytestdb3?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--关联我们自定义的映射文件-->
<mapper resource="com/bitzh/pojo/UserMapper.xml"/>
</mappers>
</configuration>

6、测试代码运行

在Maven项目中默认的src/main/java目录下面只会打包java编译后的class文件,所以对于UserMapper.xml文件不会打包进去

测试代码

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
package com.bitzh.test;

import com.bitzh.pojo.User;
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.Test;

import java.io.InputStream;

/**
* @Auther: oyy0v0
* @Date: 2024/4/16 - 04 - 16 - 23:10
* @Description: com.bitzh.test
* @version: 1.0
*/
public class TestDemo01 {
/**
* Mybatis案例
*/
@Test
public void test01() throws Exception{
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");

// 获取一个SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

//获取一个SqlSession对象
SqlSession sqlSession = factory.openSession();

//添加数据 ORM获取
User user = new User("1","小明","深圳宝安","男");

//执行数据库操作 statement = namespace + id
int count = sqlSession.insert("com.bitzh.pojo.User.addUser", user);
System.out.println("影响的行数"+ count);
}
}

image-20240416232938560

出现这种情况怎么办,需要我们在pom文件中特别指出要处理的资源文件

1
2
3
4
5
6
7
8
9
10
11
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

修改url

1
jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF8&amp;serverTimezone=Asia/Shanghai"/>

这次运行没出错但是数据库中并没有数据

因为Mybatis默认是不会自动提交DML操作的

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
public class TestDemo01 {
/**
* Mybatis案例
*/
@Test
public void test01() throws Exception{
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");

// 获取一个SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

//获取一个SqlSession对象
SqlSession sqlSession = factory.openSession();

//添加数据 ORM获取
User user = new User("1","小明","深圳宝安","男");

//执行数据库操作 statement = namespace + id
int count = sqlSession.insert("com.bitzh.pojo.User.addUser", user);
System.out.println("影响的行数"+ count);
sqlSession.commit();
sqlSession.close();
}
}

需要手动提交,这时候数据就进入到数据库中了

修改,删除和查询操作