基础:https://blog.csdn.net/qq_67832732/article/details/134764134
条件查询
在映射文件的SQL配置中配置参数
使用parameterType来指定参数类型
使用#{参数名}来接收参数的值
parameterType="string" 表示sql语句需要一个参数,类型为字符串
username=#{xxx}表示用户名的值是来自一个变量xxx,这个变量值直接从java代码中传入,变量名可以任意命名,因为只有一个变量,会自动识别传过来的参数
parameterType: 表示查询语句传入参数的类型。
支持基础数据类型和复杂数据类型 如果SQL是单条件查询,则parameterType指定为基础数据类型
单条件查询
练习:在数据库的user表中,新增两个字段 性别( sex ),整型,1代表男性,0代表女性,非空 出生日期( birthDate ),date类型
使用MyBatis查询user表中所有的女性用户并输出 使用MyBatis查询user表中在1996年出生的用户并输出
1、创建user实体类
package entity;
import java.util.Date;
public class User {
private String username;
private String password;
private Integer age;
private String sex;
private String birthDate;
public User() {
}
public User(String username, String password, Integer age, String sex, String birthDate) {
this.username = username;
this.password = password;
this.age = age;
this.sex = sex;
this.birthDate = birthDate;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthDate() {
return birthDate;
}
public void setBirthDate(String birthDate) {
this.birthDate = birthDate;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", birthDate=" + birthDate +
'}';
}
}
2、创建数据库连接
3、创建sql映射
4、创建测试方法
多条件查询
在数据库中,查询用户信息表user中性别为“女性”,“1996”年出生的记录并输出
该例是一个多条件查询,需要向SQL配置中传入两个参数。 如果SQL是单条件查询,则parameterType指定为基础数据类型 如果是多条件查询,则parameterType指定为复杂数据类型。
多条件查询时,parameterType的参数类型可以为如下两种:
使用Java自定义实体类
parameterType指定为自定义实体类” UserCnd”
#{sex}表示性别条件的值取自实体类对象中sex属性的值
#{birthYear}表示出生年份条件的值取自实体类对象中birthYear属性的值
使用map或者hashmap
总结
resultType属性
查询结果映射是指MyBatis自动将SQL语句查询出来的结果映射到指定的对象中。
MyBatis通过resultType属性来实现查询结果的自动映射
resultType的值可以指定为两种类型:
基本数据类型(int、string、long等等) 复杂数据类型(Java实体类、map/hashmap)
自定义查询结果映射
实体类”entity.User”中的属性名和SQL查询结果列名不一致,无法完成数据自动映射
解决方案1:定义别名 为SQL查询出的字段定义别名,
”强制”与”entity.User”中的属性名保持一致,以满足自动映射的要求
解决方案2:使用resultMap自定义映射关系
(1)在映射文件”UserMapper.xml”中,加入<resultMap>标签:
(2)在映射文件”UserMapper.xml”中,将select配置的resultType属性修改为resultMap,并指定值为”userMap”
<select>节点中使用resultMap属性来指定需要使用的自定义映射关系,resultMap不能和resultType同时使用
数据新增
使用MyBatis框架在用户信息表user中插入一条记录
因为是insert语句,因此加入一个<insert>标签
insert语句需要传递5个参数,因此parameterType=”entity.User”
#{uname}表示用户名的值取自参数对象的uname属性
#{upass}表示密码的值取自参数对象的upass属性
对于增删改操作默认resultType=”int”,代表数据操作匹配的行数,因此不需要定义resultType属性
提交事务
如果执行测试方法,数据库中并未成功插入一条数据
这里就涉及到mybatis的事务,对于增删改操作,默认不会自动提交到数据库执行
方案一
手动提交,需要在insert操作后加入如下代码完成手动提交: sqlSession.commit();
方案二
自动提交,需要将sqlSession设置为自动提交事务,
数据修改
因为是update语句,因此加入一个<update>标签
update语句需要传递3个参数,因此parameterType=”map”
#{XXX}里的参数名必须要和map对象里键的名称一一对应
使用接口来完成Mybatis数据操作
第一步:在src下新建一个包,命名为”dao”。在包下新建一个接口,命名为”UserDao”
第二步:在”UserDao”中定义接口方法
接口方法定义规则如下:
必须保持与相应的SQL配置参数一致
方法名与id一致 方法参数与parameterType指定类型一致
方法返回值与resultType/resultMap指定映射类型一致
第三步:修改SQL映射文件”UserMapper.xml”,将其与接口”UserDao”关联,通过namespace属性关联
第四步:在测试类中加入测试方法”testDao”,通过接口来执行SQL
测试类
关联查询
数据库里有学生表(student)和学生证信息表(student_card)
要求用mybatis框架查询所有的学生信息以及每位学生的学生证信息
需求涉及两张表,因此需要使用多表连接查询
原始方法
方案一:关联查询实现步骤
(1)创建实体 在“entity”包下新建学生(Student)实体类和学生证(StudentCard)实体类 因为两个实体类是1对1的关系,所以在Student中增加一个StudentCard类型的属性 设计如下
(2)在SQL映射文件”StudentMapper.xml”中加入SQL配置如下
说明
id标签是定义数据库主键与实体中简单数据类型属性的映射关系
result标签是定义非主键字段与实体中简单数据类型属性的映射关系
association标签用于定义实体类型属性的映射关系。
在<association>标签中,property= ”studentCard” 指定复杂数据类型属性的名称。
javaType =”entity.StudentCard”表明该属性的类型
<association>标签内部的<id>、<result>标签用于指定查询结果列和StudentCard类型中每一个属性的映射关系
(3)在”dao”包下新建接口”StudentDao”以及接口方法
接口需要与”StudentMapper.xml”通过namespace属性关联
(4)新建测试类”SelectTest”,并加入测试方法
方案二:嵌套查询实现
1、执行主查询:select * from student,获取所有学生
2、遍历主查询的结果,执行子查询:select * from student_card where stu_id=?
具体操作
(1)在SQL映射文件”StudentMapper.xml”中配置子查询SQL: select * from student_card where stu_id=?
(2)在SQL映射文件”StudentMapper.xml”中配置主查询SQL:select * from student
关联查询【1对多】
数据库里有顾客表(customer)和订单表(orders)
要求用mybatis框架查询所有的顾客信息以及每位顾客的订单信息
题目需求涉及两张表,因此需要使用多表连接查询 分析表与表之间的关系以及如何关联的 cutomer表与orders表是1对多的关系,通过cutomer.id和orders.customer_id进行关联
select c.*,o.* from customer c left join orders o on c.id=o.customer_id
方案一:关联查询实现步骤
(1)创建实体 在“entity”包下新建顾客(Customer)实体类和订单(Order)实体类 因为两个实体类是1对多的关系,所以在Customer中增加一个Order类型的列表属性 设计如下
2)新建SQL映射文件”CustomerMapper.xml”中加入SQL配置如下
id标签是定义数据库主键与实体中简单数据类型属性的映射关系
result标签是定义非主键字段与实体中简单数据类型属性的映射关系
collection标签用于定义集合类型属性的映射关系。
在<collection>标签中,property= ”orders” 指定集合数据类型属性的名称。 javaType =”ArrayList”表明该属性的类型为集合。ofType=”entity.Order”表明集合中存放的数据类型。
< collection >标签内部的<id>、<result>标签用于指定查询结果列和Order类型中每一个属性的映射关系。
3)在”dao”包下新建接口”CustomerDao”以及接口方法
接口需要与”CustomerMapper.xml”通过namespace属性关联
4)新建测试类”SelectTest”,并加入测试方法
resultMap标签使用总结
resultMap标签用于自定义查询结果映射关系
子节点id和result仅用于指定基础数据类型属性的映射关系
子节点id用于指定主键属性,result用于指定其他属性
子节点<association>标签用于处理实体类型属性的映射关系,体现实体间1对1的关系
子节点<collection>用于处理集合类型属性的映射关系,体现实体间1对多或者多对多的关系
关联查询【多对多】
数据库里有学生表(student)、课程表(course)以及一个中间表(student_course),
题目需求涉及三张表,因此需要使用多表连接查询
student表与course表是多对多的关系,通过中间表来进行关联 select c.*,stu.* from course c left join student_course sc on c.course_id=sc.course_id left join student stu on stu.stu_id=sc.stu_id
多对多的关联通过使用中间表可以转化为两个一对多的关系,因此解决多对多的查询配置和一对多是一样的
mybatis动态sql
动态SQL是MyBatis的一个强大特性 可以运用动态SQL语句标签方便我们在SQL中实现各种逻辑
常用标签如下: <if>:条件选择
<choose>:相当于Java中的switch,用于条件选择
<where>:简化SQL中的where
<set>:解决动态更新语句
<trim>:灵活的去除多余的关键字
<foreach>:迭代遍历一个集合
具体介绍
where标签
where 标签的作用:去除多余的 where
当使用 if 标签进行动态 SQL 拼接时,如果 if 标签的判断条件不满足的话,便不拼接 if 标签中的内容,这便导致了 SQL 语句的 where 子句缺失,造成 SQL 错误。
使用 where 标签便可以解决上述问题,使用 where 标签将 if 标签包裹起来,当 if 标签的判断条件不满足,动态 SQL 不拼接时,便不会向 SQL 语句中插入 where 子句,从而避免该错误。
<where>标签能够智能的处理where、and、or,不必担心关键字导致的语法错误。
习惯上在<where>标签中的每一个条件前都加一个and或or
choose标签
choose 标签的作用:去除多余条件
在使用 if 标签编写需要判断的条件时,如果表达式内容的判断结果为 true 那么条件就满足。当有多个条件满足,并且实际业务并不需要这么多的条件或者只需要一个条件时便可以使用此标签去除条件。
choose 标签是按顺序判断其内部 when 标签中的 test 条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的 sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
set标签
set 标签的作用:去除多余逗号
当我们去编写动态修改 SQL 语句时,会使用 if 标签去动态拼接修改的内容,并且动态拼接的修改条件通常都会有 “,” 的存在,但是因为是动态拼接无法保证那一条拼接的修改条件是最后一条,这就导致了拼接完成后可能存在多余的 “,” ,造成 SQL 错误。
使用 set 标签将这些动态拼接修改的内容的 if 标签包裹起来,便可以去除多余的 “,” 。
使用set标签与if标签组合,可以智能增减要修改的字段,并智能判断逗号是否有必要存在
trim标签
trim标签:可用于拼接动态SQL语句
该标签有以下属性:
prefix:前缀
suffix:后缀
prefixOverrides:前缀覆盖,可用于智能的处理”and”,”or”关键字
suffixOverrides:后缀覆盖,可用于处理update语句中中多余的”,”
作用:可以利用trim来代替<where>或者<set>的功能
将
替换
foreach标签
foreach标签的属性主要有 item,index,collection,open,separator,close。
item表示对集合进行迭代时每一个对象的别名
index指定一个名字,用于表示在迭代过程中,每次迭代的位置
open是前缀,表示该语句以什么开始
separator表示在每次迭代元素之间以什么符号作为分隔符,
close是后缀,表示以什么结束。
collection指定需要遍历的集合
例如在StudentMapper.xml中新增SQL配置
(1)如果是单参数且参数类型是集合时,collection的值为list
(2) 如果是单参数且参数类型是数组时,collection的值为array
(3) 如果是多参数且参数类型是map或者实体类对象时,collection的值为对应map的键名或者对象的属性名