MyBatis

MyBatis是Apache的一个开源项目iBatis, iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis  提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

Mybatis 是一个 半自动的ORM(Object   Relation  Mapping)框架

sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据

MyBatis全局配置

  MyBatis全局配置文件结构顺序是规定好的,可以省略但不可颠倒位置

1)properties属性

  既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来配置

  还可以创建一个资源文件,通过properties引入外部文件

    resource: 从类路径下引入属性文件

    url:  引入网络路径或者是磁盘路径下的属性文件

<properties>
<property name="driver" value="com.mysql.jdbc.Driver" />
</properties>
<!-- 引入类路径下文件 -->
<properties resource="db.properties"></properties>

2)settings设置

  是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为

<settings>
<!-- 映射下划线到驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置Mybatis对null值的默认处理 -->
<setting name="jdbcTypeForNull" value="NULL"/>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置加载的数据是按需还是全部 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 配置开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>

3)typeAliases 别名处理

  类型别名是为 Java 类型设置一个短的名字,可以方便我们在配置文件中其他位置引用某个类。

  很多的情况下,可以批量设置别名为这个包下的每一个类创建一个默认的别名,就是用简单类名小写的形式

<typeAliases>
<package name="com.mybatis.bean"/>
</typeAliases>

MyBatis已经取好的别名

4)typeHandlers 类型处理器

  无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型

  MyBatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的,所以基本不需设置

  我们也可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型

  1. 实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
  2. 指定其映射某个JDBC类型(可选操作)
  3. 在mybatis全局配置文件中注册

5)objectFactory 对象工厂

6)plugins 插件机制

  我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行

    <plugins>
<!-- 分页插件 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

  四大对象

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)

7)environments 环境配置

  MyBatis可以配置多种环境,根据需要每种环境使用一个environment标签进行配置并指定唯一标识符

  可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境

  id:指定当前环境的唯一标识 transactionManager、和 dataSource 都必须有

<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>

  实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置

8)databaseIdProvider数据库厂商标识

  MyBatis 可以根据不同的数据库厂商执行不同的语句

<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
</databaseIdProvider>

  Type: DB_VENDOR, 使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义.

  配置了databaseIdProvider后,在SQL映射文件中的增删改查标签中使用databaseId来指定数据库标识的别名

<select id="getEmployeeById"
resultType="com.mybatis.bean.Employee"
databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>

  MyBatis匹配规则如下

    ①  如果没有配置databaseIdProvider标签,那么databaseId=null

    ②  如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为null

    ③  如果databaseId不为null,他只会找到配置databaseId的sql语句

    ④  MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带databaseId 的相同语句,则后者会被舍弃。

9)mappers 映射器

  用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件

    resource : 引入类路径下的文件

    url : 引入网络路径或者是磁盘路径下的文件

    class : 引入Mapper接口

  通常情况下使用批量注册,这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下

<mappers>
<package name="com.mybatis.dao"/>
</mappers>

mapper 映射文件

  MyBatis 的真正强大在于它的映射语句,就是针对 SQL 语句构建的

<mapper namespace="main.mapper.BookMapper" >
</mapper>

  SQL 映射文件有很少的几个顶级元素

    cache – 给定命名空间的缓存配置。

    cache-ref – 其他命名空间缓存配置的引用。

    resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

    parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。

    sql – 可被其他语句引用的可重用语句块。

    insert – 映射插入语句

    update – 映射更新语句

    delete – 映射删除语句

    select – 映射查询语

MyBatis 默认不是自动提交,需手动提交:sqlSession.commit();

insert

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
  INSERT INTO users (id,username,PASSWORD) VALUES(NULL,#{username},#{password})
</insert>

delete

<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
</delete>

update

<update id="updateUser">
UPDATE users SET name=#{name},email=#{email} WHERE id = #{id}
</update>

select

<select id="getUserById" resultType="main.beans.User">
SELECT id,username,`password`,`name`,email FROM users WHERE id = #{id}
</select>

主键生成与获取

  数据库分为支持主键自增与不支持的,mysql是支持的

    功能:插入一条新数据时,即可通过其主键id值立马查询这条数据,一般在 insert 中设置 useGeneratedKeys 为 true,返回数据库自动生成的主键 id,keyColumn 用于指定数据库table中的主键,keyProperty 用于指定传入对象的成员变量。

    注意:settings 中设置为全局,在接口映射器(注解)中设置的 useGeneratedKeys 参数值将会覆盖在settings元素中设置全局 useGeneratedKeys 参数值,xml 映射器中配置的 useGeneratedKeys参数只会对 xml 映射器产生影响

@Options(useGeneratedKeys=true,keyProperty="userId",keyColumn="userId")

参数传递

1) 单个普通类型参数

可以接受基本类型,包装类型,字符串类型等。这种情况MyBatis可直接使用这个参数,#{abc},大括号内可随便定义

2)  多个参数

    任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,或者0,1…, #{param1,param2}

    值就是参数的值 #{key1,key2}:获取参数的值,预编译到SQL中。安全。

3) 命名参数

     为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字

public Employee getEmployeeById(@Param("id")Integer id);

4) POJO

   resultType自动映射,当这些参数属于我们业务POJO时,我们直接传递POJO

  autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是结果集列名和javaBean属性名一致

5) Map

  我们也可以封装多个参数为map,直接传递 #{key} 直接传入map中的key值

    1) 查询单行数据返回Map集合

public Map<String,Object> getEmployeeByIdReturnMap(Integer id );

    2) 查询多行数据返回Map集合

@MapKey("id") // 指定使用对象的哪个属性来充当map的key
public Map<Integer,Employee> getAllEmpsReturnMap();

6) Collection/Array

会被MyBatis封装成一个 map 传入, Collection 对应的 key 是 collection , Array 对应的 key 是 array . 如果确定是 List 集合,key 还可以是 list.

resultMap自定义映射

      自定义 resultMap,可以实现高级结果集的映射

    1) id :用于完成主键值的映射

    2) result :用于完成普通列的映射

  id、result属性

<resultMap id="getBookById" type="main.beans.User">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
</resultMap>

  3) association :一个复杂的类型关联,当一个对象的某个属性是一个对象时,一般将结果包装成此类型

      我们可以使用联合查询,并以级联属性的方式封装对象.使用 association 标签定义对象的封装规则

<select id="getEmployeeAndDept" resultMap="myEmpAndDept" >
    SELECT e.id eid, e.last_name, e.email,e.gender ,d.id did, d.dept_name FROM tbl_employee e , tbl_dept d
    WHERE e.d_id = d.id AND e.id = #{id}
</select>
<resultMap type="com.mybatis.beans.Employee" id="myEmpAndDept">
  <id column="eid" property="id"/>
  <result column="last_name" property="lastName"/>
  <result column="email" property="email"/>
  <result column="gender" property="gender"/>
  <!-- 级联的方式 -->
  <result column="did" property="dept.id"/>
  <result column="dept_name" property="dept.departmentName"/>
</resultMap>

    对于每个实体类都应该有具体的增删改查方法,也就是DAO层,因此我们也可以使用 association 分步查询

   在分步查询的基础上,可以使用延迟加载来提升查询的效率,只需要在全局的 Settings 中配置

<select id="getEmployeeAndDeptStep" resultMap="myEmpAndDeptStep">
    select id, last_name, email,gender,d_id from tbl_employee where id =#{id}
</select>
<resultMap type="com.mybatis.beans.Employee" id="myEmpAndDeptStep">
  <id column="id" property="id" />
  <result column="last_name" property="lastName"/>
  <result column="email" property="email"/>
  <result column="gender" property="gender"/>
  <association property="dept"
          select="com.mybatis.dao.DepartmentMapper.getDeptById" //mapper包中定义的查询方法全类名
column="d_id" fetchType="eager">
  </association>
</resultMap>

  4) collection :复杂类型的集,当一个对象的某个属性是一个集合对象时

        我们可以使用联合查询,并以级联属性的方式封装对象.使用 collection 标签定义对象的封装规则

      property: 关联的属性名

  ofType: 集合中元素的类型

  实际的开发中经常可以通过分步的方式完成查询.

<select id="getDeptAndEmpsByIdStep" resultMap="myDeptAndEmpsStep">
  select id ,dept_name from tbl_dept where id = #{id}
</select>
<resultMap type="com.mybatis.beans.Department" id="myDeptAndEmpsStep">
  <id column="id" property="id"/>
  <result column="dept_name" property="departmentName"/>
  <collection property="emps"
select="com.mybatis.dao.EmployeeMapper.getEmpsByDid"  //mapper包中定义的查询方法全类名
   column="id">
  </collection>
</resultMap>

分步查询多列值的传递

  如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成 Map来进行传递,语法如下: {k1=v1, k2=v2....}

  在所调用的查询方法取值时,就要参考Map的取值方式,需要严格的按照封装map 时所用的key来取值.

fetchType属性

  在<association> 和 <collection> 标签中都可以设置 fetchType,指定本次查询是否要使用延迟加载。默认为 fetchType=”lazy” ,如果本次的查询不想使用延迟加载,则可设置为 fetchType=”eager”.

Java框架之MyBatis 06-全局配置-mapper映射-分步查询的更多相关文章

  1. java框架之mybatis

    一.简介 1.基本概念 mybatis 是一个半自动轻量级的一个 orm 框架 将 java 与 sql 分离,解决了 jdbc 的硬编码问题: sql 由开发人员控制,更加方便 sql 的修改调优: ...

  2. Java框架之MyBatis框架(一)

    一.框架介绍: MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建sta ...

  3. Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件

    MyBatis 今天大年初一,你在学习!不学习做什么,斗地主...人都凑不齐.学习吧,学习使我快乐!除了诗和远方还有责任,我也想担当,我也想负责,可臣妾做不到啊,怎么办?你说怎么办,为啥人家能做到你做 ...

  4. mybatis(二)全局配置mybatis-config.xml

    转载:https://www.cnblogs.com/wuzhenzhao/p/11092526.html 大部分时候,我们都是在Spring 里面去集成MyBatis.因为Spring 对MyBat ...

  5. Java框架篇---Mybatis 入门

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果.MyBatis ...

  6. Java框架之Mybatis(二)

    本文主要介绍 Mybatis(一)之后剩下的内容: 1 mybatis 中 log4j的配置 2 dao层的开发(使用mapper代理的方式) 3 mybatis的配置详解 4 输入输出映射对应的类型 ...

  7. Java框架之Mybatis(一)

    一.Mybatis 简介 Mybatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...

  8. java框架之MyBatis(1)-入门&动态代理开发

    前言 学MyBatis的原因 1.目前最主流的持久层框架为 Hibernate 与 MyBatis,而且国内公司目前使用 Mybatis 的要比 Hibernate 要多. 2.Hibernate 学 ...

  9. java框架之MyBatis(2)-进阶&整合Spring&逆向工程

    进阶内容 准备 jdbc.url=jdbc:mysql://192.168.208.192:3306/test?characterEncoding=utf-8 jdbc.driver=com.mysq ...

随机推荐

  1. WPF 使用 SharpDx 异步渲染

    本文告诉大家如何通过 SharpDx 进行异步渲染,但是因为在 WPF 是需要使用 D3DImage 画出来,所以渲染只是画出图片,最后的显示还是需要 WPF 在他自己的主线程渲染 本文是一个系列,希 ...

  2. 【33.28%】【BZOJ 1195】[HNOI2006]最短母串

    Time Limit: 10 Sec  Memory Limit: 32 MB Submit: 1208  Solved: 402 [Submit][Status][Discuss] Descript ...

  3. CSS3 属性学习

    fill-available表示撑满可用空间(包括高度,宽度)[此处包括padding和margin会尽可能的撑满,只对于行内块(inline-block)和块元素(block)起作用,webkit内 ...

  4. 【19.05%】【codeforces 680D】Bear and Tower of Cubes

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 第三阶段:3.Web端产品设计:1.以用户为中心的产品设计2

    从功能到体验.提供不同的附加值.

  6. 金蝶handler中 collection 代码片段理解

    1,AtsOverTimeBillBatchEditHandler中collection的理解 SelectorItemCollection selectors = new SelectorItemC ...

  7. redis 的持久化方式

    redis 持久化的两种方式 RDB:RDB 持久化机制,是对 redis 中的数据执行周期性的持久化. AOF:AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件 ...

  8. 使用spring框架创建最简单的java web程序(IDEA商业版)

    项目目录如下(IDEA社区版好像无法识别webapp目录?原因见https://www.cnblogs.com/bityinjd/p/9284378.html): 工具:  IDEA 1.首先使用ma ...

  9. 什么是特性(Attribute)?

    由面向对象思想,我们诞生了很多种面向对象编程语言,比如常用的Java,C#,这些语言中都共有类(Class)的概念,并用各自的方式去阐述.编写Class,或许方式不同,但它们都有一个共同点,即“类是对 ...

  10. 详解js的bind、call、apply

    详解js的bind.call.apply 说明 虽然bind.call.apply都是js很基础的一块知识,但是我从未认真总结过这三者的区别. 由于公司后端是用的微服务架构,又没有中间层对接,导致前端 ...