MyBatis
MyBatis是一个实现了JPA规范的用来连接数据库并对其进行增删改查操作的开源框架 (就和传统的JDBC一样,就是个连接数据库的东西),其实,它底层就是一个JDBC封装的组件。MyBatis的前身是Ibatis,Ibatis创建与2002年最初为Apache下面的一个开源项目,2010迁移到google code下面并改名为MyBatis。
ORM:Object realaction mapper
MyBatis:半自动化ORM
MyBatis优点
- 简单易学,容易上手(相比于Hibernate) ---- 基于SQL编程
- 消除了JDBC大量冗余的代码,不需要手动开关连接
- 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库
- MyBatis都支持,而JDB提供了可扩展性,所以只要这个数据库有针对Java的jar包就可以就可以与MyBatis兼容),开发人员不需要考虑数据库的差异性。
- 提供了很多第三方插件(分页插件 / 逆向工程)
- 能够与Spring很好的集成
MyBatis开发环境的搭建
- mybatis-3.4.1.jar
- mysql-connector-java-5.1.24.jar
- druid-1.1.5.jar(阿里的数据库连接池)
配置文件:- database.properties
- database.properties
- UserMapper.xml(写SQL)
- mybatis-cfg.xm(mybatis主配置文件)
MyBatis的类
- 实体类
- 测试类
- pom文件
- 写测试代码来获取SqlSession实例:
- 项目结构
SQL映射文件
-
cache配置给定命名空间的缓存。
-
cache-ref从其它命名空间引用缓存配置。
-
resultMap最复杂,也是最有力量的元素。用来描写叙述怎样从数据库结果集中来载入你的对象。
-
insert映射插入语句。
-
update映射更新语句。
-
delete映射删除语句。
-
select映射查询语句
select
- 查询语句是使用 MyBatis 时最经常使用的元素之中的一个。
-
<select id=”selectPerson” parameterType=”int” resultType=”hashmap”> SELECT * FROM PERSON WHERE ID = #{id} </select>
使用一个int(或Integer)类型的參数,并返回一个HashMap类型的对象,当中的键是列名,值是列相应的值。
-
select
元素有非常多属性同意你配置,来决定每条语句的作用细节。 -
id=”selectPerson” 在命名空间中唯一的标识符,能够被用来引用这条语句。
-
parameterType=”int” 将会传入这条语句的參数类的全然限定名或别名。
-
resultType=”hashmap” 从这条语句中返回的期望类型的类的全然限定名或别名。
-
使用resultType或resultMap,但不能同一时候使用。
-
resultMap=”personResultMap” 命名引用外部的resultMap。返回map是MyBatis最具力量的特性,对其有一个非常好的理解的话,很多复杂映射的情形就能被攻克了。使用 resultMap 或 resultType,但不能同一时候使用。
-
flushCache=”false” 将其设置为true。不论语句什么时候被调用,都会导致缓存被清空。默认值: false。
-
useCache=”true” 将其设置为 true。将会导致本条语句的结果被缓存。默认值: true。
-
timeout=”10000” 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)。
-
fetchSize=”256” 这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)。
statementType=”PREPARED” STATEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis使用选择使用 Statement, PreparedStatement 或 CallableStatement。默认值: PREPARED。 -
resultSetType=”FORWARD_ONLY” FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)。
insert、delete、update
id="insertAuthor" 在命名空间中唯一的标识符,能够被用来引用这条语句。
parameterType="domain.blog.Author" 将会传入这条语句的參数类的全然限定名或别名。
flushCache="true" 将其设置为 true。不论语句什么时候被调用,都会导致缓存被清
空。默认值: false。
parameterType详解
在MyBatis的select、insert、update、delete这些元素中都提到了parameterType这个属性。MyBatis现在可以使用的parameterType有基本数据类型和JAVA复杂数据类型:
① 基本数据类型:包含int,String,Date等。基本数据类型作为传参,只能传入一个。通过#{参数名} 即可获取传入的值
② 复杂数据类型:包含JAVA实体类、Map。通过#{属性名}或#{map的KeyName}即可获取传入的值
@Param注解实现多参数入参
Mapper接口方法:
SqlMapper.xml文件:
说明:
1、当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以,当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错
2、使用#{注解名称},如#{productName}
不使用@Param注解
使用@Param注解时,最好传递 Javabean。在SQL语句里就可以直接引用JavaBean的属性,而且只能引用JavaBean存在的属性
Mapper接口方法:
对应Sql Mapper.xml文件:
resultMap配置
- 指定resultMap标签的id值
- id:映射主键
- result:映射非主键(不存在嵌套)
- association:一对一映射改造pojo类需要添加单个属性即可
-
<association property="permission"> <id column="permissionId" property="id"></id> <result column="pname" property="name"></result> <result column="level" property="level"></result> </association>
- 一对多映射:collection
-
<collection property="实体类字段名" ofType="list的数据类型"> <id column="permissionId" property="id"></id> <result column="pname" property="name"></result> </collection>
- resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。
如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中
resultType
- 当前sql的返回值类型
- 可以是自定义实体类,也是基本数据类型
1、返回一般数据类型
mapper 接口:
SQL 映射文件:
2、返回 JavaBean 类型
mapper 接口:
SQL 映射文件:
3、返回List类型
mapper 接口:
SQL 映射文件:
4、返回Map类型 - 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中
mapper 接口:
SQL 映射文件:
- 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map
mapper 接口:
SQL 映射文件:
mybatis的行为
- 通过settings
-
<settings> <setting name="key" value="value" /> </setting>
- autoMappingBehavior:
- NONE 表示取消自动映射;
- PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。
- FULL 会自动映射任意复杂的结果集(无论是否嵌套)。
动态SQL完成多条件查询
- if:利用if实现简单的条件选择.
- choose(when,otherwise):相当于Java中的switch语句,通常与when和otherwise搭配.
- when:简化SQL语句中的where条件判断
- set:解决动态更新语句
- 可以灵活地去除多余的关键字
- foreach:迭代一个集合,通常用于in条件
使用if+where实现多条件查询
1、if
封装User对象入参,进行查询.
使用了@Param注解,并将参数roleId重名名为userRole,故UserMapper.xml的代码如下:
测试
2、where
测试
3、if+trim
trim标记是一个格式化的标记,可以完成set或者是where标记的功能
-
select * from user <trim prefix="WHERE" prefixoverride="AND |OR"> <if test="name != null and name.length()>0"> AND name=#{name}</if> <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if> </trim>
prefix:前缀
prefixoverride:去掉第一个and或者是or
-
update user <trim prefix="set" suffixoverride="," suffix=" where id = #{id} "> <if test="name != null and name.length()>0"> name=#{name} , </if> <if test="gender != null and gender.length()>0"> gender=#{gender} , </if> </trim>
suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)
suffix:后缀
4、if+set
update时set和if的用法 每个修改都加逗号 set能够智能的去掉最后一个逗号
foreach查询
对应的mapper.xml
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
2.单参数array数组的类型:
3.自己把参数封装成Map的类型
choose(when、otherwise)
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似
当 title!=null 的时候就输出 and titlte = #{title},不再往下判断条件,当title为空且 content!=null 的时候就输出 and content = #{content},当所有条件都不满足的时候就输出 otherwise 中的内容
MyBatis分页
(1).引入分页插件
引入分页插件有下面2种方式,推荐使用 Maven 方式。
(2). 使用 Maven
在 pom.xml 中添加如下依赖:
(3).配置拦截器插件
- 1.在 MyBatis 配置 xml 中配置拦截器插件
接口:
mapper文件里的SQL语句为:
编写测试类: