一、Mybatis概述
Mybatis框架原属于Apache公司下的顶级开源项目。
Mybatis3.0以前叫做ibatis,09年6月项目团队整体转战Google,更名为Mybatis;
Mybatis是一个优秀的轻量级持久层框架。--持久层代表数据库,前端是表现层,java是逻辑层。Mybatis属于ORM框架(ORM,全称 Object Relation Mappers,意为对象关系映射,是大多数持久层框架的核心思想)
二、标签常用属性
标签 属性名 描述 属性值
<mapper> namespace 命名空间:作用使java与sql分离。 映射的接口全类名(包名.类名)
增删改查标签 id 唯一标识符 抽象方法名
<select> resultType 声明查询结果的类型,用于关系映射。 如果方法的返回值是基本数据类型,那么属性值是包装类全类名。
如果方法的返回值是引用数据类型,那么属性值是全类名(包括String)。
如果方法的返回值是集合,那么属性值是集合泛型的全类名。
<resultMap> type Mybatis另一种映射规则 声明映射对象(全类名)
id 供调用的唯一标识符
<result> property 成员变量名
column 结果集列名
<association> 用于一对一关联映射(多表),解析对象
property 成员变量名
javaType 成员变量数据类型
<collection> 用于一对多关联映射,解析集合
property 成员变量名
ofType 集合泛型全类名
<if> test 判断条件,主要用于判断参数的成员变量,调用成员变量可直接写变量名。
<where> 取代where关键字,有两个特点:
1.如果where后面的第一个关键字是and/or,那么会将该关键字自动省略
2.如果where后面没有出现任何sql片段,那么会将where自身省略
<set> 取代set关键字;有如下特点:如果set标签中的sql片段以逗号结尾,那么自动省略该逗号
<foreach> collection 参数集合类型
item 循环遍历出的对象,供循环内调用,调用对象中的成员变量,可以直接用,对象.成员变量名
separator 分割两次循环之间的内容(插入两次循环中的内容)
open 循环之前的内容
close 循环结束后的内容
index 当前循环到第几次
#{}和${}
#{}的特点:1.自带单引号 2.有转义功能(防止sql注入);特性同JDBC中的问号(问号特点:1.自带单引号。 2.转义功能,防止注入攻击)
${}的特点:1.不自带单引号 2.自带拼接 3.无转义功能;一般用于模糊查询;因其不能转义,会遭受sql注入攻击,所以不建议使用。
{}中的值:如果参数是实体类,那么{}中写成员变量名
如果参数是简单值(基本数据类型和String),那么#{}中可以写value,也可以写参数名,但${}中只能写value;
例子:'%${value}%' '%' || #{value} || '%'
sql片段
sql语句可以看做由多个sql片段拼合而成的一个句子。
每一个sql片段都可以提取出来,用<sql>标签进行封装。
在sql中,利用<include> 标签的refid属性,来引用某一<sql>的id属性值。
三、高级映射
用于多表查询的技术。其实就是用resultMap标签定义映射规则。
要想实现多表查询,需要在实体类中引入另一个实体类的成员变量。
如果主表的数据与副表的数据一一对应,则使用一对一关联映射,在主表实体类中引入副表实体类的对象即可。<association>
如果主表的数据与副表中多条数据关联,则使用一对多关联映射,在主表实体类中引入副表实体类为泛型的集合即可。<collection>
批量删除的代码
批量删除的mapper.java:int deleteBatch(int[] ids);
批量删除的mapper.xml:
<delete id="deleteBatch">
delete from animal
where animal_id in
<foreach collection="array" open="(" close=")"
separator="," item="id">
#{id}
</foreach>
</delete>
批量增加代码
批量增加的mapper.java:int batchAdd(List<Subject> ss);
批量增加的mapper.xml:
<insert id="batchAdd">
insert into subject
<foreach collection="list" item="sub" separator="union">
select #{sub.no},#{sub.name},#{sub.teacher},#{sub.type} from dual
</foreach>
</insert>
动态查询的代码
动态查询的mapper.java:List<Animal> select(Animal animal);
动态查询的mapper.xml:
<select id="select" resultMap="aaa" >
select
animal_id
, animal_kind ak
, gender
, to_char(birth, 'yyyy-mm-dd') birth
from animal
<where>
<if test="animalId > 0">
animal_id = #{animalId}
</if>
<if test="animalKind != null">
animal_kind like '%${animalKind}%'
</if>
</where>
</select>
后续继续补充