什么是Mybatis?

Mybatis是一款优秀的持久层框架,用于简化JDBC开发。

传统JDBC开发的缺点

1
2
3
4
5
6
7
8
9
10
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://192.168.31.5:3306/mydb?characterEncoding=utf-8";
String user="root";
String password="password";
conn=DriverManager.getConnection(url, user, password);
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery("select * from user");
while (rs.next()) { //遍历结果
System.out.println(rs.getString("user_name"));
}
  1. 硬编码 => 将字符串放到代码外

    • 注册驱动
    • 获取连接
    • SQL语句
  2. 操作繁琐

快速入门

普通mybatis项目

  1. 创建表,添加数据

  2. 定义pojo类

成员变量对应数据库中的字段,注意类型也要。

设置getter和setter方法,养成习惯重写toString()方法。
3. 创建模块,导入坐标(maven项目)

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>x.x.x</version>
</dependency>
  1. 配置核心配置文件mybatis-config.xml

配置文件解决了硬编码的问题

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"
"https://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>
<mappers>
<mapper resource="org/mybatis/example/Mapper.xml"/>
</mappers>
</configuration>

mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。

!!! info mapper命名规范
一般习惯为表名+Mapper.xml

  1. 配置Mapper,SQL映射文件

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.Mapper">
<select id="selectTable" resultType="Blog">
select * from table where id = #{id}
</select>
</mapper>
  1. 加载核心配置文件,获取SqlSessionFactory对象

1
2
3
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  1. 获取SqlSession对象或Map对象,执行SQL语句,操作数据库
1
2
3
SqlSession session = sqlSessionFactory.openSession();
//操作session执行sql语句
//如:session.selectList("selectTable")
  1. 释放资源

1
sqlSession.close()

增删改查

mapper中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<insert id="addCategory" parameterType="Category" >
insert into category_ ( name ) values (#{name})
</insert>

<delete id="deleteCategory" parameterType="Category" >
delete from category_ where id= #{id}
</delete>

<select id="getCategory" parameterType="_int" resultType="Category">
select * from category_ where id= #{id}
</select>

<update id="updateCategory" parameterType="Category" >
update category_ set name=#{name} where id=#{id}
</update>
<select id="listCategory" resultType="Category">
select * from category_
</select>

java代码

1
2
3
4
5
Category c = new Category();
c.setName("新增加的Category");
session.insert("addCategory",c);
session.commit();
session.close();

Spring整合Mybatis

  1. 创建Maven项目,导入依赖

依赖清单

1
2
3
4
5
6
7
8
9
10
Spring核心
MyBatis核心
MySQL JDBC驱动
log4j日志
JUnit单元测试
Lombok插件
Druid数据库连接池
Spring和的MyBatis整合包
Spring和ORM框架的整合包—此依赖项会自动导入spring-orm,spring-jdbc,spring-tx三个jar包
Spring和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
<dependencies>
<!-- Junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MyBatis核心Jar包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- MySql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- Lombok工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.3</version>
</dependency>

<!-- Spring-test测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.3</version>
<scope>test</scope>
</dependency>
<!-- slf4j日志包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!-- druid阿里的数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- Spring整合ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.3</version>
</dependency>
<!-- Spring整合MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
  1. 建表,新建pojo类包和实体类

以银行账户为例

MySQL

1
2
3
4
5
6
7
8
9
10
11
12
# 建表
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int NOT NULL AUTO_INCREMENT,
`account_name` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`money` int DEFAULT NULL,
PRIMARY KEY (`id`,`account_name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

# 插入数据
INSERT INTO `account` VALUES ('1', 'lucy', '5000');
INSERT INTO `account` VALUES ('2', 'tom', '5000');

com.pojo.account

1
2
3
4
5
6
7
package com.pojo;
@Data //使用注解自动生成getter和setter方法
public class Account {
private Integer id;
private String accountName;
private float money;
}
  1. 配置持久层,新建mapper包和对应实体类(AccountMapper)的Mapper接口
1
2
3
4
5
package com.mapper;

public interface AccountMapper {

}
  1. 新建resource资源文件夹(用于存放配置文件),新建jdbc.properties,设置数据库驱动以及连接信息
1
2
3
4
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.31.5:3306/managerSys?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=root
  1. 新建mybatis.xml配置文件

在spring中集成

使用Spring集成Mybatis可以摒弃mybatis.xml配置文件,也可以只设置如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>
<!-- 开启延迟加载 该项默认为false,即所有关联属性都会在初始化时加载
true表示延迟按需加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>

默认内容

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="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource=""/>
</mappers>
</configuration>
  1. 新建log4j.properties日志配置文件(可选)

内容为日志的输出类型和其他配置信息

1
2
3
4
5
6
7
8
9
10
log4j.rootLogger=DEBUG, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
  1. 新建对应实体类(Account)的映射文件mapper.xml(AccountMapper.xml)
  • 在resources下新建包
  • 包名和上方的mapper接口的包名要一致

image-20230330105448655

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
<?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属性相当于映射文件的名称 属性值任意
接口代理方式,属性值要写成接口的完整类名-->
<mapper namespace="com.mapper.UserMapper">


<!-- 开启二级缓存 -->
<!--

<cache
size="1024" //缓存对象的最大个数,默认是1024个
eviction="LRU" //缓存对象的回收策略,默认是LRU算法
//LRU Least Recently Used 最近最少使用,移除最长时间不被使用的对象
//FIFO First In First Out 先进先出,按对象进入缓存的顺序来移除它们
//SOFT 软引用,移除基于垃圾回收器状态和软引用规则的对象
//WEAK 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象

flushInterval="60000" //自动清空缓存的间隔时间,单位为毫秒,默认是0,表示无穷大

readOnly="true" //缓存对象是否只读,默认为false
//true 从缓存中获取的数据都是只读的,为了加快查询速度,直接返回数据在缓存中的引用,缺点是不安全
//false 从缓存中获取的数据可能会被修改,为了安全起见,利用序列化和反序列的技术克隆一份新的数据返回,缺点是速度慢
/>

-->
<!-- 开启MyBatis自带的二级缓存 -->
<cache
size="1024"
eviction="LRU"
flushInterval="60000"
readOnly="true"
/>

<!-- resultType属性指定结果的类型的完整包名
目前写的是user是因为后期会起一个别名,
默认的别名就是类名的首字母小写 -->
<select id="findAcountList" resultType="Account">
select * from account
</select>
</mapper>
  1. 在Mapper接口(AccountMapper接口)中编写映射文件对应的方法
1
2
3
4
5
6
7
8
9
package com.mapper;

import java.util.List;

import com.pojo.Account;

public interface AccountMapper {
List<Account> findAccountList();
}
  1. 配置spring主配置文件(applicationContext.xml或SpringConfig配置类)

applicationContext.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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!--<context:component-scan base-package="com.bean"/> -->
<!-- 加载数据库连接信息的属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置Druid数据源的Bean -->
<bean id="dataSource"
class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>


<!-- 配置SessionFactory的Bean -->
<bean id="sessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 指定MyBatis配置文件的位置 -->
<property name="configLocation"
value="classpath:mybatis.xml" />
<!-- 给实体类起别名 -->
<property name="typeAliasesPackage"
value="com.pojo" />
</bean>
<!-- 配置mapper接口的扫描器,将Mapper接口的实现类自动注入到IoC容器中 实现类Bean的名称默认为接口类名的首字母小写 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage属性指定自动扫描mapper接口所在的包 -->
<property name="basePackage" value="com.mapper" />
</bean>
</beans>

  1. 测试

SpringBoot整合Mybatis

方法一

  1. 创建SpringBoot项目,勾选Mybatis FrameworkMysql Driver

“”

用什么勾选什么

  1. 配置连接信息 application.properties或application.yml

application.yml

1
2
3
4
5
6
spring: 
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb
username: root
password: root

application.properties

1
#暂时不介绍
  1. 定义pojo类

  2. 定义mapper的接口类和映射配置

增删改查在接口中定义的方法上实现,可以采用配置文件的形式,也可以采用注解的形式。

1
2
3
4
5
@Mapper
public interface UserMapper{
@Select("...")
<pojo类> listAll();
}
  1. 测试

方法二,使用Mybatis Plus

  1. 创建SpringBoot项目,勾选Mysql Driver

  2. 在pom.xml中手动导入Mybatis Plus

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
  1. 定义pojo类
  2. 定义mapper接口类和映射配置

但是!不需要再手动写对应的方法了,直接继承BaseMapper<泛型>(泛型为定义的pojo类)

1
2
3
4
@Mapper
public interface UserMapper extends BaseMapper<User>{
//不用再写方法啦~
}