MyBatis - zhongjiajie/zhongjiajie.github.com GitHub Wiki
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
与数据库的交互
- 通过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>
-
<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>
com.github.pagehelper.PageInterceptorPageHelper-使用方法
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>
Mybatis使用xml的话,resulttype是指一条记录的类型,而不是全部记录的类型
如果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);