文章目录
一、MyBatis 框架 顶级标签以及 ognl 表达式的作用以及使用方式
顶级标签是除却最外层的 mapper 标签之外最高级别元素,直接编写的外层标签内部。
1、select 标签
select 标签的作用主要是用来映射数据库的查询语句
-
select 标签基本属性
-
id 属性: 指定 mapper 接口中的抽象方法名称,与之形成映射关系(注:必须是mapper标签指定的mapper 接口中的抽象方法)
-
parapeterType 属性: 配置传入到 SQL 语句中的参数类型,可以理解为用来接收参数的属性。如果不配置,mybatis 会通过 ParamterHandler 根据参数类型默认选择合适的类型进行处理。
-
resultType 属性: 配置返回结果集返回的类型,指定的类型可以是基本类型,也可以是java容器,也可以是 javaBean 对象(实体类对象)。
-
resultMap 属性: 用于引用 resultMap 标签定义的映射类型,这也是mybatis组件高级复杂映射的关键(resultType 与 resultMap 二选一配置,不可同时出现)。
-
-
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">
<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="com.demo.mapper.XXXMapper" >
<!-- id名必须与dao中的方法名相同 -->
<select id="接口方法名称" parapeterType ="传入参数类型" (resultType ="返回值参数类型" resultMap="标签定义的映射类型")>
select 字段 from 表名 where 字段 = ${参数}
</select>
</mapper>
1.1、ognl 表达式 : ${参数} & #{参数}
${参数} 就是ognl表达式,当我们使用标签映射 SQL 语句时,可以通过 ognl 表达式向 sql 中传参。
当我们使用 ognl 表达式向 SQL 中传参时,其实就是获取 parameterType 属性所指定的参数类型中的某个属性所对应的值。
打个比方,如果 parameterType 属性所指定的属性是实体类(User)其中有 id,name这些属性,当我们在 select 标签中使用 ${id} 时,其实就是获取实体类中存储的属性值,就相当于调用 parameterType指定User类对象的 getId()方法,即:user.getId()。
注:调用 ${id} 时 User 类中必须有 id 属性 或者 getId() 方法(二者有其一即可),否则报错。
- ognl 表达式的编写格式:#{} 和 ${}
- 两种格式的区别
- #{} :占位符:通过praparedStatment对象预编译处理
- ${} :拼接符:sql拼接,通过statement对象处理,没有预编译处理,有sql注入的风险
- 两种格式的区别
推荐使用的格式: #{} 。
2、insert 标签
insert 标签的作用主要是用来映射数据库的新增语句
-
insert 标签基本属性
-
id 属性: 与select 标签的ID属性同理
-
parapeterType 属性: 与 select 标签的 parapeterType 属性同理
-
-
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">
<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="com.demo.mapper.XXXMapper" >
<!-- id名必须与dao中的方法名相同 -->
<insert id="接口方法名称" parapeterType ="传入参数类型" >
insert into 表名 (字段....) values(${参数}....)
</insert>
</mapper>
3、update 标签
insert 标签的作用主要是用来映射数据库的新增语句
-
update 标签基本属性
-
id 属性: 与select 标签的ID属性同理
-
parapeterType 属性: 与 select 标签的 parapeterType 属性同理
-
-
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">
<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="com.demo.mapper.XXXMapper" >
<!-- id名必须与dao中的方法名相同 -->
<update id="接口方法名称" parapeterType ="传入参数类型" >
update 表名 set 列名 = ${参数} where 修改条件
</update >
</mapper>
4、delete 标签
delete 标签的作用主要是用来映射数据库的新增语句
-
delete 标签基本属性
-
id 属性: 与select 标签的ID属性同理
-
parapeterType 属性: 与 select 标签的 parapeterType 属性同理
-
-
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">
<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="com.demo.mapper.XXXMapper" >
<!-- id名必须与dao中的方法名相同 -->
<delete id="接口方法名称" parapeterType ="传入参数类型" >
delete from 表名 where 字段 = ${参数}
</delete>
</mapper>
5、sql 标签
配置可以重复使用的 sql 代码块,类似于 Java 的全局变量,以此来实现 SQL 语句的动态拼接。
-
sql 标签基本属性
- id 属性: 自定义一个 sql 代码块别名,用于后续引用
-
搭配 sql 标签使用的标签
-
include 标签: 引入 sql 标签定义的 sql 代码块
- refid 属性: 对应 sql 标签的 id 属性,用于指定 sql 标签
-
- 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">
<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="com.demo.mapper.XXXMapper" >
<sql id="代码块别名">id,username,password</sql>
<!-- id名必须与dao中的方法名相同 -->
<select id="接口方法名称" parapeterType ="传入参数类型" resultType ="返回值参数类型">
SELECT
<include refid="代码块别名"/>
FROM
表名
</select>
</mapper>
6、resultMap 标签
resultMap标签是 MyBatis 框架中最强大,最复杂的标签元素,为 MyBatis 提供了结果集映射的能力。
简单映射:MyBatis 在映射查询结果时,如果实体类中的属性和数据库的列名存在出入,就会出现查询的结果集无法赋值到对应的实体类属性当中,导致结果缺失,这种状况使用 resultMap 标签的子标签(id 标签、result 标签)将实体类的属性和数据库列名相互映射,即可解决。
复杂映射:实现多表联查,多对一、一对多等复杂关系的映射,这也是体现这个标签复杂与强大功能。
-
resultMap 标签属性
-
id 属性: 定义 resultMap 标签的唯一标识,在同一个 XML 文件中允许存在多个 resultMap 标签,但是这些标签的 id 属性必须唯一。在使用 resultMap 的时候,通过 id 引用 resultMap 内定义的内容。
-
type 属性: 映射的实体类对象的绝对路径
-
extends 属性: 继承其他 resultMap 标签(通常 resultMap 标签都代表了一个实体类,在多表联查时候,如果都需要配置 resultMap 的话,子类的 resultMap 就可以继承父类的 resultMap,然后父类有的那一部分属性标签(id、result标签)就不用在重写了)
-
resultMap 标签的子标签
-
id 标签: 用于标注这个 javabean 对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键)
-
id 标签的属性
-
property 属性: 配置 java Bean 的属性名(实体类字段名)
-
column 属性: 配置数据库表的列名,与 property 属性形成映射关系。(注:如果SQL中使用字段别名,那么此属性也可以指定字段别名,当然也可以使用数据库原本的列名)
-
-
- result 标签: 将实体类的普通属性与数据库列名形成映射关系,该标签的属性和 id标签一致,只是不标注 javabean 对象的唯一性
6.1、匹配实体类属性与数据库字段(简单映射)
- 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.demo.mapper.UserMapper" >
<!-- 将实体类与数据库列形成对应关系,将查询出的结果根据相对的关系对 User 类的相关属性进行赋值 -->
<resultMap id="UserMap" type="com.modules.dto.User">
<id property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
</resultMap>
<select id="quertUser" resultMap="UserMap">
SELECT
user_id,user_name,password
FROM
user
</select>
</mapper>