Mybatis

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了

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值