使用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 +
'}';
}
}
4、创建测试方法
在数据库中,查询用户信息表user中性别为“女性”,“1996”年出生的记录并输出
该例是一个多条件查询,需要向SQL配置中传入两个参数。 如果SQL是单条件查询,则parameterType指定为基础数据类型 如果是多条件查询,则parameterType指定为复杂数据类型。
多条件查询时,parameterType的参数类型可以为如下两种:
使用Java自定义实体类
parameterType指定为自定义实体类” UserCnd”
#{sex}表示性别条件的值取自实体类对象中sex属性的值
#{birthYear}表示出生年份条件的值取自实体类对象中birthYear属性的值
使用map或者hashmap
查询结果映射是指MyBatis自动将SQL语句查询出来的结果映射到指定的对象中。
MyBatis通过resultType属性来实现查询结果的自动映射
resultType的值可以指定为两种类型:
基本数据类型(int、string、long等等) 复杂数据类型(Java实体类、map/hashmap)
实体类”entity.User”中的属性名和SQL查询结果列名不一致,无法完成数据自动映射
”强制”与”entity.User”中的属性名保持一致,以满足自动映射的要求
(1)在映射文件”UserMapper.xml”中,加入
(2)在映射文件”UserMapper.xml”中,将select配置的resultType属性修改为resultMap,并指定值为”userMap”
使用MyBatis框架在用户信息表user中插入一条记录
因为是insert语句,因此加入一个
insert语句需要传递5个参数,因此parameterType=”entity.User”
#{uname}表示用户名的值取自参数对象的uname属性
#{upass}表示密码的值取自参数对象的upass属性
对于增删改操作默认resultType=”int”,代表数据操作匹配的行数,因此不需要定义resultType属性
如果执行测试方法,数据库中并未成功插入一条数据
这里就涉及到mybatis的事务,对于增删改操作,默认不会自动提交到数据库执行
手动提交,需要在insert操作后加入如下代码完成手动提交: sqlSession.commit();
自动提交,需要将sqlSession设置为自动提交事务,
因为是update语句,因此加入一个
update语句需要传递3个参数,因此parameterType=”map”
#{XXX}里的参数名必须要和map对象里键的名称一一对应
第一步:在src下新建一个包,命名为”dao”。在包下新建一个接口,命名为”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标签用于定义实体类型属性的映射关系。
在
javaType =”entity.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
数据库里有顾客表(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 >标签内部的
3)在”dao”包下新建接口”CustomerDao”以及接口方法
接口需要与”CustomerMapper.xml”通过namespace属性关联
4)新建测试类”SelectTest”,并加入测试方法
resultMap标签用于自定义查询结果映射关系
子节点id和result仅用于指定基础数据类型属性的映射关系
子节点id用于指定主键属性,result用于指定其他属性
子节点
子节点
数据库里有学生表(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
多对多的关联通过使用中间表可以转化为两个一对多的关系,因此解决多对多的查询配置和一对多是一样的
动态SQL是MyBatis的一个强大特性 可以运用动态SQL语句标签方便我们在SQL中实现各种逻辑
常用标签如下:
where 标签的作用:去除多余的 where
当使用 if 标签进行动态 SQL 拼接时,如果 if 标签的判断条件不满足的话,便不拼接 if 标签中的内容,这便导致了 SQL 语句的 where 子句缺失,造成 SQL 错误。
使用 where 标签便可以解决上述问题,使用 where 标签将 if 标签包裹起来,当 if 标签的判断条件不满足,动态 SQL 不拼接时,便不会向 SQL 语句中插入 where 子句,从而避免该错误。
习惯上在
choose 标签的作用:去除多余条件
在使用 if 标签编写需要判断的条件时,如果表达式内容的判断结果为 true 那么条件就满足。当有多个条件满足,并且实际业务并不需要这么多的条件或者只需要一个条件时便可以使用此标签去除条件。
choose 标签是按顺序判断其内部 when 标签中的 test 条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的 sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
set 标签的作用:去除多余逗号
当我们去编写动态修改 SQL 语句时,会使用 if 标签去动态拼接修改的内容,并且动态拼接的修改条件通常都会有 “,” 的存在,但是因为是动态拼接无法保证那一条拼接的修改条件是最后一条,这就导致了拼接完成后可能存在多余的 “,” ,造成 SQL 错误。
使用 set 标签将这些动态拼接修改的内容的 if 标签包裹起来,便可以去除多余的 “,” 。
使用set标签与if标签组合,可以智能增减要修改的字段,并智能判断逗号是否有必要存在
trim标签:可用于拼接动态SQL语句
该标签有以下属性:
prefix:前缀
suffix:后缀
prefixOverrides:前缀覆盖,可用于智能的处理”and”,”or”关键字
suffixOverrides:后缀覆盖,可用于处理update语句中中多余的”,”
作用:可以利用trim来代替
将
替换
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的键名或者对象的属性名