您现在的位置是:首页 >技术交流 >MyBatis:使用 MyBatis 实现增删改查、各种配置解析网站首页技术交流
MyBatis:使用 MyBatis 实现增删改查、各种配置解析
文章目录
MyBatis:Day 01
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
一、简介
MyBatis 参考文档官网:点此进入。
注意:
- 数据持久化:程序的数据在持久状态和瞬时状态转化的过程。因为内存中的数据断电即失,所以要将一些数据持久化。数据持久化的方式例如:通过 JDBC 可以将数据持久化到数据库中,通过 IO 可以将数据持久化到文件中;
- 持久层:完成持久化工作的代码块,MyBatis 是一款优秀的持久层框架。
MyBatis 作用:帮助程序员将数据存入到数据库中,传统的 JDBC 代码复杂,MyBatis 是框架,进行了简化。
MyBatis 特点:
二、第一个 MyBatis 程序
1. 步骤
- 准备好一个数据库
mybatis
,建表,插入数据
- 新建 Maven 项目,删除
src
文件夹,导入依赖,创建子模块
<!-- mysql 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 在资源
resources
包下,编写 Mybatis 核心配置文件mybatis-config.xml
(可以在官网的参考文档找到,依据情况修改参数)
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration 核心配置文件 -->
<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/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="1142553864qq"/>
</dataSource>
</environment>
</environments>
<!-- 每一个 Mapper.xml 都需要在 Mybatis 核心配置文件中注册 -->
<mappers>
<mapper resource=""/>
</mappers>
</configuration>
- 编写 mybatis 工具类(固定的)
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
// 第一步:获取 sqlSessionFactory 对象
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
// 第二步:获取 sqlSession 对象
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
}
- 编写代码(实体类、Dao 接口、接口实现类)
- 实体类
User
:每一个表都对应了一个实体类,实体类中的属性对应了表中的字段; - Dao 接口
UserMapper.java
; - 接口实现类
UserMapper.xml
:Dao 接口的实现类,用xml
类型的文件配置。
<!-- 实现类 XML 头部和文档类型声明,可以从参考手册中找到 -->
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 绑定一个对应的 Dao/Mapper 接口 -->
<mapper namespace="com.Sun3285.dao.UserMapper">
<select id="getUserList" resultType="com.Sun3285.pojo.User">
select * from mybatis.user
</select>
</mapper>
- 注册:每一个
Mapper.xml
都需要在 Mybatis 核心配置文件中注册
<!-- 第三步中的 Mybatis 核心配置文件:mybatis-config.xml -->
<configuration>
<environments default="development">
</environments>
<!-- 每一个 Mapper.xml 都需要在 Mybatis 核心配置文件中注册 -->
<mappers>
<mapper resource="com/Sun3285/dao/UserMapper.xml"/>
</mappers>
<configuration>
- 测试,使用
Test
注解,测试代码写在test
文件夹下
public class UserMapperTest {
@Test
public void test() {
// 第一步:获取 sqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 第二步:调用方法 getMapper 方法
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 获得接口
List<User> userList = userMapper.getUserList(); // 对象调用接口中的方法,得到全部的 userList 对象集合
for (User user : userList) {
System.out.println(user); // 每一个对象对应每一行数据
}
// 第三步:关闭 sqlSession
sqlSession.close();
}
}
- 测试结果
2. 注意
- 在配置文件
mybatis-config.xml
和UserMapper.xml
中头部和文档类型声明中,把编码encoding
改为UTF8
; - 在 Mybatis 核心配置文件
mybatis-config.xml
中注册Mapper.xml
时,resouce 路径用/
; - resource 的路径中,如果是在资源文件夹
resource
的 xml 文件,就可以直接写文件名;如果是在java
文件中的,就得写完整路径,如:com/Sun3285/dao/UserMapper.xml
;
-
sqlSession 对象相当于 connection 对象;
-
注意命名规范:
- Mybatis 核心配置文件命名:
mybatis-config.xml
; - 实体类命名:
表名
; - 接口(一个接口对应一个实体类)的命名:
表名 + Mapper
; - 接口实现类命名:
表名 + Mapper.xml
。
- Mybatis 核心配置文件命名:
-
在
pom.xml
文件中,要在 build 中配置 resources,来防止我们资源导出失败的问题。
<!-- 在 build 中配置 resources,来防止我们资源导出失败的问题 -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
三、增、删、改、查
步骤:
- 在
Mapper
接口中编写方法; - 在实现类中编写对应
Mapper
中的 sql 语句(实现接口中的方法); - 测试。
注意:
- 在写实现类的 sql 语句时:
id
:接口中的方法名;parameterType
:参数类型,没有可以不写,注意不要写成:parameterMap
;resultType
:结果类型,只有查询才有;- 自定义的类需要写全限名,如:
com.Sun3285.pojo.User
。- 增、删、改操作需要提交事务:
sqlSession.commit();
;- 每个实现方法只能写一条语句;
#{}
相当于占位符,{}
中的名字要和实体类中的属性名一一对应(因为这里的参数是从实体类拿出来的)。
代码实现:
四、扩展
1. Map
问题:在上面的修改用户中,参数为 User
对象,因此在测试时,要 new 一个用户对象,并且要传入全部的参数,再进行修改。如果只是要修改其中一个字段(属性),就会比较麻烦。
解决方法:使用 Map
。
举例:
- 根据多个参数(ID 和姓名)查询用户;
- 修改用户。
总结:
- 参数类型
parameterType
为 Map,即使用 map 传递参数,#{键}
会直接在 sql 中取出键对应的值;- 参数类型
parameterType
为实体类,即使用对象传递参数,#{属性}
会直接在 sql 中取出属性的值;- 参数类型若为一个基本数据类型,
#{变量}
会直接在 sql 中取到变量的值。- 使用 Map 集合传参的情况:方法的参数过多、实体类的属性过多(避免 new 对象时,传入所有的参数)。
2. 模糊查询
模糊查询:在 Java 代码执行的时候,传递通配符 %
或 _
。
举例:查询带有“张”的用户。
总结:本质还是执行 sql 语句,传递参数正确,使得 sql 语句正确就可以执行完成。
五、配置解析(参考手册)
注意:在配置文件
xml
中,所有的标签都可以规定其顺序(以上的顺序)。
1. 环境配置:environments
MyBatis 可以配置成适应多种环境,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
注意一些关键点:
- 默认使用的环境 ID(比如:default=“development”);
- 每个
environment
元素定义的环境 ID(比如:id=“development”); - 事务管理器
transactionManager
的配置(比如:type=“JDBC”); - 数据源
dataSource
的配置(比如:type=“POOLED”)。
2. 属性优化:properties
-
属性可以在外部进行配置,并可以进行动态替换;
-
既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置;
-
设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。
步骤:编写一个外部配置文件 db.properties
、在核心配置文件中引入。
3. 类型别名:typeAliases
-
类型别名可为 Java 类型设置一个缩写名字;
-
它仅用于 XML 配置,意在降低冗余的全限定类名书写。
两种实现方式:
- 直接给实体类起别名:
<typeAlias type="com.Sun3285.pojo.User" alias="user"/>
; - 指定一个包名,Mybatis 会在包下搜索需要的 JavaBean:
<package name="com.Sun3285.pojo"/>
。
注意:
- 第一种方式,是指定到具体的实体类;第二种方式,是指定到包名就可以;
- 第二种方式,在没有注解的情况下,会默认使用 Bean 的首字母小写的非限定类名来作为它的别名,例如:
com.Sun3285.pojo.User
的别名为user
;若有注解,则别名为其注解值。- 使用情形:
- 实体类较少时,使用第一种;
- 实体类较多时,使用第二种,并分别在每个实体类上加注解
@Alias("别名")
,不加注解则为默认别名。
4. 设置:settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
5. 映射器:mappers
-
每一个
Mapper.xml
都需要在 MyBatis 核心配置文件中注册; -
映射器:告诉 MyBatis 到哪里去找映射文件。
三种实现方式:
- 【推荐使用】使用相对于类路径的资源引用:
<mapper resource="com/Sun3285/dao/UserMapper.xml"/>
; - 使用映射器接口实现类的完全限定类名:
<mapper class="com.Sun3285.dao.UserMapper"/>
; - 将包内的映射器接口全部注册为映射器:
<package name="com.Sun3285.dao"/>
。
注意:
- 方式一是路径,用
/
;方式二是实现类的全限名,用.
;方式三具体到包;- 使用方式二和方式三的前提:接口和实现类必须同名、必须在同一个包下。
注意:
-
MyBatis 参考文档官网(中文):https://mybatis.org/mybatis-3/zh/index.html
-
技术没有高低之分。
-
学习思路:搭建环境 --> 导入包 --> 编写代码 --> 测试。
-
可以在 mybatis 工具类创建的时候实现自动提交事务:
sqlSessionFactory.openSession(true);
,这样在增、删、改操作的时候就不需要手动提交事务了。