2、MyBatis 框架 顶级标签详解(select、insert、update、delete、sql、typeAliases、resultMap)以及 OGNL 表达式的使用



一、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>



6.2、MyBatis 高级映射(resultMap 标签多表联查,一对多,多对一关系)

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OGNL(Object-Graph Navigation Language,对象图导航语言)是一个强大的表达式语言,可以用于Java的各种应用程序中,包括Struts、JavaServer Faces、JavaServer Pages等。在Mybatis中,OGNL表达式可以用于Mapper XML文件中的各种标签中,例如`<if>`、`<where>`、`<set>`、`<foreach>`等标签中。 OGNL表达式可以用于获取Java对象的属性值、调用Java对象的方法、进行算术运算、比较运算、逻辑运算等。例如: ```xml <select id="selectByCondition" resultType="com.example.User"> select * from user where name like #{keyword} and age >= #{minAge} <if test="maxAge != null"> and age <= #{maxAge} </if> </select> ``` 在这个例子中,`#{keyword}`、`#{minAge}`、`#{maxAge}`都是OGNL表达式,表示获取Java对象中的属性值。例如,如果传入的参数对象是一个`User`对象,那么`#{keyword}`可以表示`user.getKeyword()`方法的返回值,`#{minAge}`可以表示`user.getMinAge()`方法的返回值。 在OGNL表达式中,还可以进行算术运算、比较运算、逻辑运算等。例如,`age >= #{minAge}`表示将`age`和`#{minAge}`进行比较,判断`age`是否大于等于`#{minAge}`;`age <= #{maxAge}`表示将`age`和`#{maxAge}`进行比较,判断`age`是否小于等于`#{maxAge}`。 除了基本的运算符和表达式OGNL还提供了丰富的函数和操作符,例如`in`操作符、`not`操作符、`contains`函数、`size`函数等。这些函数和操作符可以方便地进行集合操作、字符串操作等。在使用OGNL表达式时,需要注意语法的正确性和安全性,以避免可能的安全漏洞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值