MyBatis 介绍和使用
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 数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式属性 描述 keyProperty
selectKey 语句结果应该被设置的目标属性 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
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 技术交流群。
上一篇: Java List 介绍和使用
下一篇: Java 参数验证 validator
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论