Mybatis

Mybatis

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
MyBatis内部封装了jdbc,开发者仅需关注sql语句本身,不需要花更多的精力去处理加载驱动、创建连接、创建statement等繁杂的过程。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的实体类映射成数据库中的记录。

注解

@MapperScan
@Mapper
@param
@Insert
@Delete
@Update
@Select
@Intercepts
@Signature

数据访问层接口

使用Mybatis框架时,访问数据的抽象方法必须定义在接口中!因为Mybatis框架是通过“接口代理”的设计模式,生成了接口的实现对象!
Mybatis框架声明数据访问层接口的方法有2种做法,如下:
@Mapper用于声明数据访问层接口。
@MapperScan在配置类中配置数据访问接口所在的包,该包中的接口都是数据访问层接口。

抽象方法

返回值类型:如果要执行的SQL操作是增、删、改类型的,使用int作为返回值类型,表示“受影响的行数”,不建议使用void,如果要执行的SQL操作是查询类型的,只需要保证返回值类型可以封装必要的结果即可,如果查询结果可能超过1条,必须使用List类型。
方法名称:自定义的,但推荐遵循规范,不要使用重载。
参数列表:取决于需要执行的SQL语句需要哪些参数,在抽象方法中,可以将这些参数一一列举出来,也可以将这些参数封装到自定义类中,使用自定义类作为抽象方法的参数,在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
@param作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
抛出异常:无

配置SQL语句

在Spring Boot中,整合了Mybatis框架后,可以在数据访问接口的抽象方法上使用@Insert、@Delete、@Update、@Select(在不是Spring Boot项目中,需要额外的配置,否则将不识别抽象方法上的这些注解。)来配置SQL语句;也可以使用XML文件来配置SQL语句。

XML文件配置SQL

根标签必须是
在标签上必须配置namespace属性,此属性的值是接口的全限定名(包名与类名)
在标签内部,使用 / / / 标签来配置增 / 删 / 改 / 查的SQL语句
配置SQL语句的标签必须配置id属性,取值为对应的抽象方法的名称
配置SQL语句的标签内部是配置SQL语句的,SQL语句不需要使用分号表示结束,不可以添加注释。
标签配置插入数据的SQL语句,在配置建议配置useGeneratedKeys和keyProperty获取自动编号的主键值,如果主键不是自动编号的,则不配置这2个属性。
标签配置删除数据的SQL语句。
标签配置修改数据的SQL语句。
标签配置查询数据的SQL语句。
使用标签封装SQL语句片段,通常用于封装字段列表,在标签上必须配置id属性,取值应与标签的refid属性的值一致。
使用调用封装SQL语句片段,在标签上必须配置refid属性,取值应与标签的id属性的值一致。

解决列名和属性名不一致

当Mybatis处理查询的结果集时,会自动将列名(Column)与属性名(Property)相同的数据进行封装,默认情况下,对于列名与属性名不同的数据,不予处理!
使用配置将结果封装到抽象方法的返回结果类型的对象中,配置列名与属性名的对应关系,列名与属性名本来就相同的部分,可以不必在进行配置。
在标签上必须配置id和type属性
id属性取值应与对应标签的resultMap属性的值一致
type属性取值是返回值的全限定名(包名与类名)
实体类中主键属性,要使用标签进行映射,实体类中一般属性,要使用标签进行映射,实体类中集合类型属性,要使用标签进行映射
标签中的各个属性的作用
property属性:指定实体类中映射为集合类型的属性的名称
javaType属性:指定当前映射集合的类型,默认就是List类型
ofType属性:指定当前集合泛型的类型的全限定名
需要配置如何创建出一个个元素对象
标签的子级

动态SQL

Mybatis的动态SQL机制表现为:根据参数的不同,生成不同的SQL语句。
使用标签实现对参数的遍历:
collection属性表示被遍历的参数列表,如果抽象方法的参数只有1个,当参数类型是List集合类型时,当前属性取值为list,当参数类型是数组类型时,当前属性取值为array
item属性用于指定遍历到的各元素的变量名,并且,在的子级,使用#{}时的名称也是当前属性指定的名字
separator属性用于指定遍历过程中各元素的分隔符(或字符串等)
使用标签结合标签实现动态修改数据:
标签的作用就是对参数进行判断,标签中test属性是布尔值,为真执行标签内的内容,为假则反之。
在Mybatis中,标签并没有对应的类似Java中的else标签!如果需要实现类似Java中if … else …的效果,可以使用2个条件完全相反的标签,以上做法的缺点在于:实际上执行了2次条件的判断,在性能略微有浪费。
使用标签、标签、标签,以实现类似if … else …的效果:
标签的作用就是对参数进行判断,标签中test属性是布尔值,为真执行标签内的内容,为假则执行标签内的内容

Mybatis中的#{}和${}格式的占位符

#{}格式的占位符是预编译的,只能表示某个值,不存在SQL注入风险,不需要考虑值得数据类型(字符串类的值不需要使用一对单引号框住)。
${}格式的占位符不是预编译的,可以表示SQL语句中的任何片段(只需要保证拼接之后的SQL语句是正确的即可),存在SQL注入风险,需要考虑值得数据类型(字符串类的值需要使用一对单引号框住)
另外,对于SQL注入,应该有正确的认识,不需要盲目拒绝!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值