MyBatis

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
      在这里插入图片描述
  • 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语句为:
    在这里插入图片描述
    编写测试类:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值