MyBatis 介绍和使用

发布于 2024-08-13 05:02:32 字数 5020 浏览 12 评论 0

Mybatis 说白了就是操作数据库的工具,对象关系映射。MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生 Map 使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象) 映射成数据库中的记录。

Mybatis-Spring : Mybatis 针对 Spring 的适配版本, 可以用依赖注入的方式调用 SqlSession。

一般是 controller 接受前端传进来的 url 及参数,调用 service 层的核心代码, service 层调用 dao 层的接口,并通过 mybatis 访问数据库

  • controller: 对应的实例是 model 层
  • dao: 对应的实例是 po 层,dao 层编写 interface 后会由 spring boot 内部帮忙实现
  • mybatis: 自动实现的是 dao 文件夹下的 interface 与数据库的交互

MyBatis 必知必会

  • 通过 Mapper 访问数据库
    • 这里有两层意思:
      • 具体的 sql 都写在 mapper 中
      • 上层需要获得 mapper 去访问数据库
  • sql 写在哪儿
    • 可以写在定义 mapper 的 interface 中
    • 可以写在 Mapper.xml 中: 个人感觉写在 xml 文件中,能更加方便的使用 mybatis 的动态 sql 特性
  • SqlSession
    • 我们需要 SqlSession 去打开一个会话.之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭 session.使用 MyBatis-Spring 之后,你的 bean 可以通过一个线程安全的 SqlSession 来注入,基于 Spring 的事务配置 来自动提交,回滚,关闭 session. 不再需要手动关闭 SqlSession.
  • mybatis 配置的 xml 问题
    • SelectKey 在 Mybatis 中是为了解决 Insert 数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式
      属性描述
      keyPropertyselectKey 语句结果应该被设置的目标属性
      resultType结果的类型.MyBatis 通常可以算出来,但是写上也没有问题.MyBatis 允许任何简单类型用作主键的类型,包括字符串
      order这可以被设置为 BEFORE 或 AFTER.如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句.如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
      statementType和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型
      <insert id="insert">
        insert into people (
        name,
        age,
        sex
        )
        values (
        #{name,jdbcType=VARCHAR},
        #{age,jdbcType=VARCHAR},
        #{sex,jdbcType=VARCHAR}
        )
        <selectKey resultType="Long" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS id
        </selectKey>
      </insert>
      

动态 sql

Mybatis 动态 sql

foreach

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

其中 foreach 中的 item 属性对应的是内部的 #{item} 元素,collection 属性对应的是参数的名称,如果是 HashMap 就是对应的 key 如果是对象就是属性名.

foreach 和 if 混用时要主要 if 的判断条件,如果要判断是否为空然后拼接动态 sql 要用 <if test="item != null"> <foreach> ... </foreach> </if> ,不能使用 <if test="item != ''"> 因为 list 不能和 String 比较

插入多条记录

mybatis 可以提供批量的功能,以插入功能为例,指定集合是 List ,item 是 item ,调用的时候 item.column 就算定义完了,interface

<insert id="insert">
    insert into table (column)
    values
    <foreach collection ="list" item="item" index= "index" separator =",">
    (#{item.column,jdbcType=INTEGER})
    </foreach>
</insert>

Mybatis SQL xml 处理大于号小于号(判断处理)

Mybatis 需要通过 xml 格式处理 sql 语句时,经常会用到<, <=, >, >=等符号,但是会引起 xml 格式的错误,这样会导致后台将 xml 字符串转换为 xml 文档时报错,从而导致程序错误.我们需要将原符号改成 xml 中可是被且不会报错的替换符号.

原符号替换符号
<<
<=<=
>>
>=>=
&&
''
""

Mybatis 做等值判断时一直报错,因为一开始写的是 fwbdh = 'BAK' ,应该是 fwbdh == 'BAK' ,同时 Mybatis 的 if when 对 test 表达式对参数进行判断时,可以调用 java.lang.String 中定义的方法

<if test="fwbdh != null and fwbdh == 'BAK'">
    fwbdh=#{fwbdh}
<if>

FAQ

resulttype 是指一条记录的类型

Mybatis 使用 xml 的话,resulttype 是指一条记录的类型,而不是全部记录的类型

dao 层传多个参数需要绑定 @Param

如果 xml 只用了多个参数而不是 map,或者一个参数,那么 dao 层需要使用 @Param 绑定 xml 中的变量名

// 如果只有一个参数, `@Param` 参数是可选的
List<Entry> selectById(int id);
List<Entry> selectById(@Param("id") int id);

// 如果有多个参数要传递到 xml `@Param`参数是必填的
List<Entry> selectByRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

深海少女心

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

qq_Yqvrrd

文章 0 评论 0

2503248646

文章 0 评论 0

浮生未歇

文章 0 评论 0

养猫人

文章 0 评论 0

第七度阳光i

文章 0 评论 0

新雨望断虹

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文