MyBatis文章目录
Mybatis框架的搭建以及使用教程
简介
什么是MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
一,MyBatis框架搭建步骤
1.1,配置XML
使用Maven来构建项目,则需要将下面代码置于pom.xml中:
<!-- mysql 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
1.2,编写MyBatis框架核心配置文件
MyBatis框架的核心配置文件主要应用于配置连接数据库的相关信息以及影响MyBatis框架运行时行为的属性。
为了方便分类管理,常常在项目中新建一个resources资源目录,用来存放各种配置文件。先右击项目创建一个资源目录resources,如图:
再resources目录下右键新建一个file,命名为mybatis.xml,
之后再把下面一段代码赋值到mybatis.xml文件中。
<?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>
<!-- 引入jdbc.properties-->
<properties resource="jdbc.properties"></properties>
<!-- 配置mybatis的log实现为LOG4J-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<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="${pwd}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xinxi2/dao/TSysUserMapper.xml"/>
<mapper resource="com/xinxi2/dao/TSystorageMapper.xml"/>
</mappers>
</configuration>
最后其次,在resources目录下再创建一个连接数据库的驱动配置文件jdbc.properties。再把下面的代码赋值到jdbc.properties中。
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/bianlidain?useUnicode=true&character
username=root
pwd=root
1.3,创建实体类
根据现有的数据库创建实体类
package com.xinxi2.bean;
public class Student {
private int id;
private String name;
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
1.4,创建Mapper接口
在MyBatis框架下,Mapper接口是指用于绑定到SQL映射语句下的接口,又称映射器,通常与SQL映射文件配合使用。对应用而言,Mapper接口即为Dao接口,定义了对数据进行持久化操作的API。命名一般都是遵循“实例类名”+Mapper的规则。一般放在与Dao层下。如图:
StudentMapper代码如下:
package com.demo.dao;
import com.demo.bean.Student;
import java.util.List;
public interface StudentMapper {
public List<Student> getlist();
}
1.5,创建SQL映射文件
如图:
定义与用户操作相关的SQL映射文件,该文件是一个XML文件。SQL映射文件一般与相关的Mapper接口配合使用,属于Dao组件,且针对特定的实体类,所以其命名规则与Mapper接口相同,为“实体类名”+Mapper,且通常与Mapper接口放在同一个包下。现在dao包中创建一个StudentMapper.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">
<mapper namespace="com.demo.dao.StudentMapper">
<select id="getlist" resultType="com.demo.bean.Student">
select * from student
</select>
</mapper>
各元素的含义如下:
mapper:SQL映射文件的根元素,只有一个namespace属性。
namespace:命名空间,用于对SQL映射进行组织和管理,实现了SQL映射的隔离,取值应是全局唯一。
select:表示查询语句,MyBatis框架的SQL映射中常用的元素之一,部分属性如下:
id:SQL语句的标识符,取值在该命名空间下唯一,一般与接口名相同。
resultType:SQL语句的返回值类型。
注意
SQL映射文件的路径信息需要添加到MyBatis框架的核心配置文件mybatis-config.xml中。如下代码所示:
<mappers>
<mapper resource="com/demo/dao/StudentMapper.xml"/>
</mappers>
1.6,编写测试类
为了方便测试类管理,我们一般会在项目中创建一个test文件夹,用来存放测试相关的代码。右击项目创建test文件夹,然后右击test文件夹创建test类。如图:
然后开始在这个测试类中编写代码:
package com.demo.test;
import com.demo.bean.Student;
import com.demo.dao.StudentMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class test {
public static void main(String[] args) {
// 加载mybatis.xml文件
String resource = "mybatis.xml";
InputStream inputStream = null;
SqlSession sqlSession = null;
StudentMapper studentMapper = null;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 开启事务,自动提交事务(无参--手动提交)
sqlSession = sqlSessionFactory.openSession();
studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getlist();
for (Student student1 : students) {
System.out.println(student1.getName() + student1.getAge());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭sqlSession,从当前线程移除
sqlSession.close();
}
}
}
测试代码如下:
二,实现方式
2.1,SQL映射的xml文件
MyBatis真正的特色在于SQL映射语句,功能强大,使用简单
SQL映射文件的几个顶级元素
- mapper
- namespace属性,区别不同的mapper
- namespace和子元素的id联合保证唯一
- 绑定DAO接口
- namespace的命名必须跟某个接口同名
- 接口中的方法与映射文件中SQL语句id一一对应
<mapper namespace="com.demo.dao.StudentMapper">
<select id="getlist" .....>
.......
</select>
</mapper>
2.2,sleect标签
- select是MyBatis中最常用的元素之一
- select元素有很多属性,可以详细配置每一条查询语句
- id
- 命名空间中唯一的标识符
- 接口中的方法与映射文件中的SQL语句id一一对应
- parameterType
- 传入SQL语句的参数类型
- resultType
- SQL语句返回值类型的完整类名或别名
- id
<mapper namespace="com.demo.dao.StudentMapper">
<select id="getlist" parameterType="int" resultType="com.demo.bean.Student">
select * from student
</select>
</mapper>
2.3,传递多个参数:
- 使用Map传递参数
- 使用注解传递参数
- 使用JavaBean传递参数
2.4,insert标签:
MyBatisinsert 标签用来定义插入语句,执行插入操作。当 MyBatis 执行完一条插入语句后,就会返回其影响数据库的行数。
在StudentMapper.xml映射文件中,增加节点,插入语句,代码如下
<insert id="addStudent" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="com.xinxi2.bean.Route">
INSERT INTO route(`name`,`pwd`,`age`)
values (#{name},#{pwd},#{age})
</insert>
在 StudentMapper接口中定义一个 addStudent() 方法,代码如下:
int addStudent(Student student );
三,动态SQL:
3.1,概述:
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
3.2,if:
if 语句使用方法简单,常常与 test 属性联合使用。语法如下:
<if test="判断条件">
SQL语句
</if>
3.3,choose标签:多重条件分支:
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
MyBatis 中动态语句 、、 类似于 Java 中的 switch-case-default多重分支条件语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到…… 的效果,可以借助 、、 来实现。
动态语句 、、 语法如下:
<choose>
<when test="判断条件1">
SQL语句1
</when >
<when test="判断条件2">
SQL语句2
</when >
<when test="判断条件3">
SQL语句3
</when >
<otherwise>
SQL语句4
</otherwise>
</choose>
标签按顺序判断其内部 标签中的判断条件是否成立,如果有一个成立,则执行相应的 SQL 语句, 执行结束;如果都不成立,则执行 中的 SQL 语句。这类似于 Java 的 switch 语句, 为 switch, 为 case, 则为 default。
3.4,where标签:处理查询条件:
如果在多重if条件的查询过程中,如果在where条件中,没有设置条件1=1那么可能就会变成下面这样一条错误的语句:
SELECT id,name,url,age,country FROM website AND name LIKE CONCAT('%',#{name},'%')
显然以上语句会出现 SQL 语法异常,但加入“1=1”这样的条件又非常奇怪,所以 MyBatis 提供了 where 标签。主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件,语法如下:
<where>
<if test="判断条件">
AND/OR ...
</if>
</where>
if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。
3.5,set标签:动态更新:
在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。
<update id="updateRoute" parameterType="com.xinxi2.bean.Route">
update route
<set>
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
`name`=#{name},
</if>
<if test="mileage!=null">
mileage=#{mileage},
</if>
</set>
where id=#{id}
</update>
3.6,foreach 标签:迭代遍历:
当SQL 语句中含有 in关键字进行列表值匹配时,需要迭代条件集合来生成的情况,可以使用 foreach来实现 SQL 条件的迭代。
Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set接口的集合,并对此提供遍历的功能。语法格式如下:
<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
参数值
</foreach>
foreach 标签主要有以下属性,说明如下。
- item:表示集合中每一个元素进行迭代时的别名。
- index:指定一个名字,表示在迭代过程中每次迭代到的位置。
- open:表示该语句以什么开始,既然是 in 条件语句,所以必然以(开始。
- separator:表示在每次进行迭代之间以什么符号作为分隔符,既然是 in 条件语句,所以必然以,作为分隔符。
- close:表示该语句以什么结束,既然是 in 条件语句,所以必然以)结束。
使用 foreach 标签时, collection属性是必选,但在不同情况下该属性的值是不一样的,主要有以下 3种情况 - 如果传入的是单参数且参数类型是一个 List,collection属性值为 list。
- 如果传入的是单参数且参数类型是一个 array 数组,collection的属性值为 array。
- 如果传入的参数是多个,需要把它们封装成一个Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
四,关联查询:
4.1,概述:
关联关系是一个数据库实体的概念,有 3 种级联关系,分别是一对一级联、一对多级联以及多对多级联。例如,一个角色可以分配给多个用户,也可以只分配给一个用户。大部分场景下,我们都需要获取角色信息和用户信息,所以会经常遇见以下 SQL。
SELECT r.*,u.* FROM t_role r
INNER JOIN t_user_role ur ON r.id = ur.id
INNER JOIN t_user u ON ur.user_id = u.id
WHERE r.id = #{id}
在级联中存在 3 种对应关系。
- 一对多,例如:角色和用户、项目组和软件工程师、用户和收货地址。
- 一对一,例如:商品简介和商品详情、学生基本信息和学籍档案信息。
- 多对多,例如:订单与商品、玩家与组队,例如:订单与商品、玩家与组队
4.2,一对一关联查询:
一对一级联关系在现实生活中是十分常见的,例如:一个学生基本信息对应一个学籍档案。
在 MyBatis 中,通过 元素的子元素 处理一对一级联关系。示例代码如下:
<association property="studentCard" column="cardId"
javaType="com.apesource.entity.StudentCard"
select="com.apesource.mapper.StudentCardMapper.selectStuCardById" />
在 元素中通常使用以下属性。
- property:指定映射到实体类的对象属性。
- column:指定表中对应的字段(即查询返回的列名)。
- javaType:指定映射到实体对象属性的类型。
- select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询
一对一关联查询可采用以下两种方式: - 分步查询,通过两次或多次查询,为一对一关系的实体 Bean 赋值。
- 单步查询,通过关联查询实现。
4.3,多对多关联查询:
实际应用中,由于多对多的关系比较复杂,会增加理解和关联的复杂度,所以应用较少。MyBatis没有实现多对多级联,推荐通过两个一对多级联替换多对多级联,以降低关系的复杂度,简化程序。
例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系。可以使用一个中间表(订单记录表)将多对多级联转换成两个一对多的关系。