dao持久层中用于操作数据库
注解
@Mapper:只需要定义接口,不需要实现对象,框架底层会在运行时自动生成接口的实现类对象,并将该对象交给IOC容器管理
@Select:放在接口类中的方法前,参数为sql语句,调用方法时将执行sql语句
@Delete
返回值为此次操作影响的记录数
@SpringBootTest:Springboot整合单元测试
@Options:
用于获取新增插入数据的自增主键,因为一般的插入是没法获取插入的自增主键的
参数 useGeneratedKeys = true 表示需要获得返回的自增主键,keyProperty = "id" 表示将获得的自增主键封装在emp对象的id字段中
在下面的插入操作中
如果没有在@Insert上使用@Options的话,输出的自增主键Id是null,加上之后才会 输出正确的自增主键
@Update
@Results,@Result
将表结构字段与实体类字段不同的命名进行映射,防止因命名而出现的返回查找值为null
@Slf4j
放在类前,在类中可直接使用log.info()来记录日志
可用参数占位符:
也可用字符串拼接:
配置输出日志
配置mybatis的日志,指定输出到控制台,放在application.properties中
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置映射依赖
用于解决表结构字段与实体类字段命名规则不同,可将表结构下划线命名a_column映射成实体类驼峰命名aColumn
在application.properties搜索camel,选中弹出的项,值选为trye即可
其他解决方案:
lombok
@Data集成了上面四个,只需在类前加上下面三个注解
引入依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
如果是用的老版本idea的话,可能在下载的时候没有下载lombok,需要在插件里搜索下载
数据库连接池
idea中自带的连接池是HikariDataSource,可引入连接池DruidDataSource,下面是其依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
模糊匹配传参问题
为什么不能直接使用#{}
为了模糊匹配,sql语句将写为
但是因为在预编译时#{}会被替换为?,但是?不能出现在''内,会出现报错。关于sql预编译,现在还不是很了解。
解决方法
${}
当需要参数没有被写死时,为了将参数拼接进''内,所以需要使用到${}进行字符串拼接,如进行姓名模糊查询时,不能写'%#{}%',因为#{}不能写进''内,此时需要写为'%${}%',如下:
但是这种解决方法性能低,不安全,存在sql注入问题,所以我们可以使用concat函数进行字符串拼接,如下:
concat()函数
这样就可以正常查询了
XML映射文件
创建xml文件
右键resources->Directory->用/分割而不是用. 且要注意层级,如下:
然后右键创建出来的Directory->New->File,注意File名与mapper接口名要相同,如下:
最终结果如下:
在xml文件中写入约束
浏览器搜索MaBatis中文网->点击左侧的入门->Ctrl+f搜索“探究已映射的 SQL 语句”->复制mapper标签上方的约束粘贴进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">
操作xml
写mapper标签->namespace属性写为对应mapper接口的全类名->写对应操作的标签,以select为例->id属性写为对应mapper接口的方法名->resultType属性写为对应方法的单条记录封装类型的全类名,即保持返回类型一致
获取全类名:鼠标放在mapper接口上->右键->Copy/Patse Special->Copy Reference即可
结果如下:
xml文件:
对应mapper接口:
对应方法的单条记录封装类型,即Emp类:
经测试,可正常查出结果
动态SQL
if标签:用于进行条件判断,在test属性中指定条件,当条件为true时才会拼接子句,需注意,test中的条件参数名与实体类字段名相同,而与表结构字段名不一定相同
where标签:只会在子元素有内容的情况下才会插入where子句,而且会自动去除开头的and或or,可用于去除子元素中部分条件不成立而出现and或or而导致的sql语法错误
需要注意,update操作中,若在set后--where前使用if标签,可能会出现有多余的,(逗号)导致sql语法错误,此时可使用set标签解决,可自动去除更新字段后多余的,(逗号)
foreach标签:批量操作时,用于遍历集合中的元素
五个参数:
其中item名可以自定义
sql&include标签:sql标签可将重复的sql片段抽取出来,再由include标签引入
sql标签中id属性可为抽取出来的sql片段取名,include标签使用时自闭和即可
如下,原片段:
修改后片段:
效果相同
一般来说,简单crud使用注解即可,复杂情况下再使用xml文件
PageHelper分页插件
依赖:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>
示例:
page:页码(第几页)pageSize:每页记录数 p.getTotal():总记录数 p.getResult():结果列表
存在查询的数据比数据库中总数据大,即所查数据的页数比本应能查出数据的页数大时,依旧可以查出数据的问题,是由于:
PageHelper中有个reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
解决方法:
在application.yml中,写入:
pagehelper:
reasonable: false
报错修改
写的时候总是会出现一些爆红,到处找解决方法还是太麻烦了,就在这里小小的总结一下吧
SQL语句提示
连接数据库后在@Select注解中的sql语句,虽然能提示select * from,但是没法提示表名,可以在File->Settings搜SQL Dialects,两个选项都选上MySQL,就能提示表名了
如果select * from都没有提示的话,就可以先去看看其他博主的流程,我这里忘了之前怎么弄的了
@Autowired标红
@Mapper自动将接口UserMapper自动生成的实现类放入IOC容器,但没法通过@Autowired注入进声明的userMapper变量,这个问题很简单,与下面的两个报错解决方法相同
java: 程序包org.junit.jupiter.api不存在
java: 程序包org.springframework.boot.test.context不存在
这三个问题大家可能都是一起出现的,都懂
我是试了下面的方法解决的,具体是哪个起了效果我也不清楚,大家可以跟着一起试一下
先在pom.xml中导入依赖:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
然后删去所有(我当时是两个)依赖的
<scope>test</scope>
再右键pom.xml->Maven->Download Sources,
再File->Settings->Build,Execution,Deployment->Build Tools->Maven->Runner->勾选Delegate IDE build/run actions to Maven
最后File->Project Structure->Project Settings->Modules->选中你的Module->在右边选中src->点亮Sources->Apply->OK
此时就解决了
Type 'java.awt.List' does not have type parameters
可能是用List集合封装时导错了包,将import java.awt.List;改为import java.util.List;即可
class java.util.ArrayList cannot be cast to class com.github.pagehelper.Page (java.util.ArrayList is in module java.base of loader 'bootstrap'; com.github.pagehelper.Page is in unnamed module of loader 'app')
可能是pom引入的插件版本过低,换成高版本的即可
学到这里就能做一些基础的前后端crud了