MyBatis
为啥MyBatis会使用xml
在一个程序中,若需要操作数据表,那么 SQL 语句有两种存放方式:1. 放到 Java 类里面(这个就存在大量的字符串拼接,还有占位符需要处理-----JDBC);2:放到 xml 中(但是 xml 无法被 Java 代码调用的,所以就在 Java代码和 xml 中加了一层 对xml中方法的接口声明)
MyBatis的基本使用
MyBatis 就是一个ORM(对象关系映射)框架,将数据库中的每张表映射成Java中的类,以此可以使用OOP思想来操作数据表了
程序启动时,@Mapper注解会根据配置文件里配置的mybatis路径+命名来讲接口与xml文件进行关联,并将@Mapper注解修饰的接口放入Spring中
配置数据库连接 + MyBatis 的 xml 存放路径 + 命名格式(xml中存放的就是数据表的操作语句)
@Mapper
@Mapper注解比较特殊,虽然是修饰接口的,但是也能将其放入Spring中,然后使用@Autowired进行注入,并直接当作对象来调用其中的方法
查询
-
创建一个接口
-
新建一个 xml 文件,来实现接口中的方法
带参数查询
添加
默认返回受影响的行数,若需要返回自增主键的ID,需要给 Insert 设置参数 useGeneratedKeys=“true” keyProperty=“id”;将会把自增主键的值放入id列,直接对象的 getId 即可拿到
删除
修改
参数传递中#{} 与 ${}的区别
-
#{}:预编译处理(MyBatis 在处理 #{} 的时候,会将其替换为 ? ,底层还是使用 PrepareStatement 的 set 方法进行填充的)
-
${}:直接替换(在判断字符串的时候,就会出问题,除非自己手动添加 引号)这个可以用在参数为关键字的时候,如:线上购物的时候,可以选择价格由低到高,由高到低;这个就需要传递 SQL 关键字了,desc / asc;就可以采用这种方式
SQL注入问题
${} 就存在 SQL 注入问题,它是直接 数值替换的
#{} 就不会存在SQL注入问题,它采用的就是 占位符的方式
like模糊查询
使用 MySQL 内置函数 concat
resultMap
当数据表中的字段名与 类 中的属性名不同时,可以用 resultMap标签来进行映射(只要有一个字段不同,那么所有的字段都需要写,不然多表查询会存在问题)
多表查询
一个讨巧的办法:在一个主要的实体类中,加另外需要的属性名
如下:显示文章表的所有信息(uid 是一个外键,表示用户表的id),需要讲 作者名字 显示出来
动态SQL
主要用于处理表单的必填和选填的时候
当前端没有传递参数的时候,对应的字段就不应该插入值,这就可以用动态SQL来解决了(不需要写多条SQL语句,根据不同的情况调用不同的SQL语句,动态SQl一条语句解决全部的情况)
if 标签
用作某个字段是否拼接上
trim标签
参数:prefix 前缀(语句最前面加的东西) suffix 后缀(语句最后面加的东西)
prefixOverrides(将最前面包含的东西去掉) suffixOverrides(将最后面包含的东西去掉)
where标签
在指定字段进行筛选的时候,就可以用where标签(如:若输入了姓名来查就表示需要where条件;什么都没有输入的情况下,就表示查询所有,就不要where条件)虽然直接加where 1 = 1也可以解决,但并不直观
where 标签默认会去掉筛选条件最前面的 and
相当于 标签
set 标签
主要用于 update 语句中
作用:
- 添加 set 关键字
- 去掉最后一个逗号
foreach标签
为了处理批量删除的情况,如果前端传过来的是一个集合,需要进行批量操作,就用foreach
collections 就是 接口中的参数名 separator 就是分隔符
item 就是遍历的当前对象 就相当于把 list 构造成:(1,2,3)的形式
进行批量操作,就用foreach
collections 就是 接口中的参数名 separator 就是分隔符
item 就是遍历的当前对象 就相当于把 list 构造成:(1,2,3)的形式