目录
一.Sring项目中关于MyBatis的配置
1.在pom.xml中引入框架依赖
2.配置文件配置相关信息
3.设置mapper中的xml文件内容
4.根据以上配置实现的查询示例
(1)添加实体类
(2)添加mapper接口
(3)添加UserMapper.xml
(4)server层的调用
(5)controller层的调用
(6)前端访问后端路径
二.有关mybatis中xml对于数据库操作的具体使用
1.插入操作
2.删除操作
3.修改操作
4.查询操作
三.Mybatis进阶操作
1.参数占位符
2.like查询
3.多表查询
(1)一对一查询
(2)一对多查询
4.动态查询(if,trim,where,set,foreach的使用)
(1)if
(2)trim
(3)where
(4)set
(5)foreach
这里手动进行添加,通过在已有的spring项目中的pom.xml文件中引入以下依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
mysql
mysql-connector-java
runtime
在application.properties中配置以下内容
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
#配置mybatis的xml文件路径
mybatis.mapper-locations=classpath:mapper/**Mapper.xml
这里关于xml文件路径配置的匹配规则是在当前mapper下所有文件名以Mapper.xml结尾的文件。
如下所示:
其中mapper中需要配置的内容有如下:
mapper里面就是对于CRUD操作的一些语句,只不过这些语句头需要遵守一些约束和规定,之后才能转化为java对象,并作为返回值返回给java中调用的方法。
查询前的配置:
将查询到的结果集会自动装配到配置的resultMap中
mapper里面的指定方法被调用后会通过之前配置的xml和对应的路径会执行xml文件中的方法
上面就是使用mybatis来对数据库操作的整个流程,接下来就是一些有关xml中关于CRUD语句的具体操作和配置。
seGeneratedKeys: MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,默认值:false。
keyColumn:设置生成键值在数据库表中的列名;如果生成列不止一个,可以用逗号分隔多个属性名称。
keyProperty:指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
controller层
service层
mapper层
通过接口插入成功的显示
UserMapper.xml中的sql代码:
insert
into
user(username, password, nickname)
values (#{username},#{password},#{nickname})
基于xml文件配置好的前提下,然后在xml文件中写sql操作
通过构造前端接口,来调用mybatis中的sql来进行验证,执行顺序如下:
对于查询操作来说,需要在xml中配置结果集映射,因为需要将查找中的数据映射为一个java对象。
首先在xml文件中使用resultMap,然后设置id,之后的查询语句需要根据该id来进行转化为type中的对象,其中type中为model类的位置(类路径),然后里面就是关于映射关系的指定,其中id是数据库中关于主键的映射,如果不是主键,就使用result,对于属性中的参数,如column是数据库中的字段名,而property是类的成员变量。
#{}是预编译占位符,在处理是,会将该位置的数据先转化为?,然后在执行PreparedStament中的set方法时,将?替换变量值。如果是字符串,会添加""。
${}是直接进行替换为变量的值,存在sql注入问题。
假如传递的数据是sort ,对于#{},最终会处理成"sort",而${}就是sort。
在使用like的时候,一般是模糊查询,在mybatis中需要使用concat函数来将%与#{变量值}来进行拼接。
concat(str1, str2, str3...)是将str1和str2和str3等全部进行拼接起来。
对于多表查询时,都需要使用resultMap来进行配置,在配置前还需要给对象中添加新的属性。例如一个用户登录表和用户信息表之间的关系是一对一,在进行关联查询的时候首先需要给User类中添加一个Message类型的成员变量,然后再在resultMap中除了配置有关User信息的属性外,还需要添加一个
property是在User中新添加的成员message, resultMap是需要关联的结果集的映射,而columnPrefix是对于查询的结果字段添加前缀,如果两个表中右重复字段,可以通过该字段进行区分,之后在associate中配置的resultMap中会去除掉前缀进行匹配。
对于一个用户表和文章表的关系是一对多,一个用户可以有多篇文章,Mybatis中也是通过resultMap来对查询结果集进行配置,然后再对查询结果中映射的对象中添加一个新的集合属性(因为是一对多关系),和一对一不同的是resultMap中设置的是collection属性,其他的配置规则基本不变。
标签为:
如果对于一个参数是否传递是不确定的(可能为空或不为空),我们可以使用if来进行判断,如果传了就在sql中显示,没有传就不显示。
如注册用户时,有些信息可以不用传递,如头像等,这时候就可以在mybatis中使用if来进行过滤该参数。
insert into user(
username,
nickname,
password
,head
,github
)
values (
#{username},
#{nickname},
#{password}
,#{head}
,#{github}
)
首先trim标签中有多个参数,分别为:
prefix=“” 表示整个语句块以prefix中的内容作为前缀
suffix=“” 表示整个语句块以suffix中的内容作为后缀
prefixOverrides=“” 表示整个语句块要去掉的前缀
suffixOverrides=“” 表示整个语句块要去掉的后缀
以之前的选择插入语句为例,来使用上面的参数:
insert into user
username,
nickname,
password,
github
#{username},
#{nickname},
#{password},
#{github},
如下所示,如果传递的password和username不为空,就根据这两个条件进行过滤:
用于sql修改中,会自动去除掉set中的if属性中的.
update user
username=#{username},
nickname=#{nickname},
password=#{password},
where id=#{id}
可以对于传入的集合进行遍历,里面的参数如下所示:
collection:用于绑定方法参数中的集合
item:遍历时的每一个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间的分隔符
示例,根据list中的id号来进行批量删除:
delete from user where id in
#{item}