MyBatis
目录
MyBatis
学习MyBatis
如何学习MyBatis
1.添加MyBatis框架支持
2.设置数据库连接和MyBatis的配置
3.添加业务代码(实现查询功能)
实现crud
实现带参数查询
实现添加
实现添加获得用户的自增id
实现删除
实现修改
查询操作
参数占位符#{}和${}
${}的优点
SQL注入问题
like查询
resultType和resultMap
多表查询
动态SQL
if标签
trim标签
set标签
foreach标签
MyBatis
MyBaits简单来说是更简单完成程序和数据库交互的工具,也是更简单的操作和读取数据库的工具,
MyBatis是一个ORM框架(对象关系映射),在面向对象编程语言中,将关系型数据库中的数据与对象建立映射关系,进而实现操作数据
学习MyBatis
对于后端开发来讲,程序是由两部分组成,后端程序和数据库,而今天要介绍的MyBatis就是程序和数据库连接的工具,在之前使用JDBC比较繁琐,MyBatis能够简化开发
如何学习MyBatis
1.配置MyBatis开发环境
2.使用MyBatis模式和语法操作数据库
这里通过一个程序来学习相关操作步骤
1.添加MyBatis框架支持
注意:除了添加MyBatis框架还需要添加使用的sql驱动
2.设置数据库连接和MyBatis的配置
在没有设置时会提示报错,此时需要设置数据库连接设置和MyBatis的XML文件配置
为什么使用xml这就要说MyBatis的组成了
1.接口(当前类的所有方法的声明)
2.xxx.xml(方法的具体实现,它和接口一一对应,一个类会有一个接口对应实现操作的xml文件)
3.添加业务代码(实现查询功能)
1.创建一个接口
2.创建与上面接口对应的xml文件(实现接口中的所有方法)
注意在yml中定义了文件命名格式这里一定要一一对应
在xml中添加配置文件,namespace表示配置当前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">
<mapper namespace="com.example.demo.mapper.UserMapper">
</mapper>
注意:id表示接口的方法名,resultType表示查询返回对象的类型(包名+类名)
我们可以通过单元测试验证是否成功获取
实现crud
实现带参数查询
注意:如果需要传参要添加注解@parma,并且名称要与sql语句相对应,sql中通过#{}方式获取参数
实现添加
MyBatis是ORM框架,实现的功能是将数据库和程序中的类进行映射,在进行映射时是使用程序中的对象名和数据库表中的字段名进行映射的,所以默认情况下应保证类的属性名与表的字段名一一对应
实现添加获得用户的自增id
我们知道添加默认返回的是受影响的行数,如何那到用户的自增id就需要useGeneratedKeys设置为true,表示获取数据库内部设置的主键,keyProperty是指定能够唯⼀识别对象的属性
实现删除
实现修改
查询操作
在上面的博客中我介绍了通过使用MyBatis的crud,虽然是都将功能实现出来了但是还是有一些细节问题需要介绍
参数占位符#{}和${}
可以看到虽然我使用了两种占位符进行查询操作但是结果都是相同的,所以二者没有区别嘛?答案是否定的,当参数为字符串时结果就发生变化了
通过上面的代码片段我们看到只是修改了${}就导致程序报错了,原因很简单
#{}:预编译处理,MyBatis在处理时将sql中#{}替换为?使用PreparedStatement 的 set 方法来赋值
${}:字符串直接替换,MyBatis直接将${}替换为变量值
${}的优点
在生活中我们会需要使用排序从高到低或者从低到高,这在数据库中就是使用desc 或者 asc来进行排序的我们就可以通过使用${}来完成操作
通过使用${}就可以实现排序查询而使用#{}则无法完成因为当使用#{}并传递的值为String时会添加单引号使得sql语句错误造成查询失败
SQL注入问题
当使用${}可能造成sql注入问题,sql注入代码" 'or 1='1 "
因为1='1'为真所以就可以直接获得数据,当使用${}时就会有sql注入的风险所以在用于查询的字段,尽量使用#{}预查询方式
like查询
我们在模糊查询的时候使用#{}会造成sql语句错误,此时就需要使用mysql内置的函数concat()
resultType和resultMap
我们在使用查询操作时需要给定返回类型,绝大部分是使用resultType,直接定义到返回的实体类即可,但是还提供了另一种方式resultMap(返回字典映射)它就可以解决程序属性名和表中字段名不相同时的问题
使用哪个要看数据库表的字段名和程序类的属性名是否相同,相同使用resultType,不同使用resultMap
多表查询
在进行查询操作时会接触到多个表如何进行多表查询,这里使用两张表演示,分别为userInfo和ArticleInfo,期望在查到文章时显示作者名
通过在ArticleInfo类中添加属性,结合联合查询实现多表联查
动态SQL
动态sql是MyBatis强大的特性之一,可以完成不同条件下的sql拼接,比如一些非必填的数据就可以使用动态标签<if>判断
if标签
我们可以通过使用<if>完成非必要数据的接收,但是如果所有的参数都是非必要数据就需要使用<trim>标签配合<if>标签生成sql语句
trim标签
<where>
<where>标签针对与查询操作,where条件可能有也可能没有
where标签作用
1.根据<where>标签的内容,决定要不要拼接where语句
2.去掉最前面的and关键字,让sql符合数据库的执行标准
set标签
<set>标签针对于修改操作
1.生成set关键字
2.去掉最后的一个" , "
foreach标签
当对集合进行遍历时可以使用该标签,比如在进行批量删除时我们传递的是id集合,如何通过id集合写sql语句就需要使用<foreach>标签,标签有如下属性
collection: 绑定方法参数的集合,如List,Set,Map或数组对象
item: 遍历时的每个对象
open: 前缀 close:后缀
separator: 遍历之间的分隔符
以上就是有关MyBatis相关的基础知识,希望对你有帮助