欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系。本系列教程希望您能站在上帝的角度去观察(了解)Java体系。使Java的各种后端技术在你心中模块化;让你在工作中能将Java各个技术了然于心;能够即插即用。本章我们来一起了解ORM(对象关系映射关系)框架之Mybatis(Ibatis)。

主流ORM框架有Mybatis和Hibernate,本章我们将对Mybatis的核心要点进行了解。
 

什么是ORM(对象映射关系)框架?

ORM(Object Relational Mapping)对象关系映射,是 一种为了解决面向对象与关系型数据库不匹配而出现的技术,使开发者能够用面向对象的方式使用关系型数据库。

Mybatis和Hibernate有什么异同?

  1. Mybatis简单,Hibernate较复杂,门槛高。
  2. Mybatis自定制Sql,比Hibernate灵活,可控
  3. Mybatis与数据库映射得到的PO与Hibernate映射PO意义不同

Mybatis入门起步   Mybatis入门起步完整示例下载

  1. /**
  2. * @Author:jimisun
  3. * @Description:
  4. * @Date:Created in 08:37 2018-09-24
  5. * @Modified By:
  6. */
  7. public class Main {
  8.  
  9. public static void main(String[] args) throws IOException {
  10. String resource = "mybatis-config.xml";
  11. InputStream inputStream = Resources.getResourceAsStream(resource);
  12. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  13. SqlSession sqlSession = sqlSessionFactory.openSession();
  14. TestUserMapper mapper = sqlSession.getMapper(TestUserMapper.class);
  15. TestUser testUser = mapper.selectOne(1);
  16. System.out.println(testUser.toString());
  17. }
  18. }
PS:Mybatis支持注解开发,但需要保留空的XML文件,也就是保留空的命名空间 ; 如下所示
  1. @Select(" SELECT * from user where id = #{id};")
  2. MyDto selectOne(Integer id);
  1. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  2. <mapper namespace="com.jimisun.dao.TestUserMapper">
  3. <!--空-->
  4. </mapper>

Mybatis和Spring的集成 Myabtis和Spring整合完整示例代码下载

如果你使用Mybatis那么一定会使用Spring,最常见的框架组合就是SSM(SpringMvc+Spring+Mybatis),那么Mybatis针对和Spring的整合提供了一个类库(jar包)
  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis-spring</artifactId>
  4. <version>1.2.2</version>
  5. </dependency>
以前我们配置在mybatis里面的配置,现在我们可以将这些配置转移到了Spring配置中;统一交给Spring进行管理, Mybatis的配置文件留空,但是不能删除哟
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  8.  
  9. <!-- 加载配置文件 -->
  10. <context:property-placeholder location="classpath:db.properties"/>
  11.  
  12. <!-- 数据库连接池 -->
  13. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
  14. destroy-method="close">
  15. <property name="driverClassName" value="${jdbc.driver}"/>
  16. <property name="url" value="${jdbc.url}"/>
  17. <property name="username" value="${jdbc.username}"/>
  18. <property name="password" value="${jdbc.password}"/>
  19. <property name="maxActive" value="10"/>
  20. </bean>
  21.  
  22. <!-- mapper配置 -->
  23. <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
  24. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  25. <!-- 数据库连接池 -->
  26. <property name="dataSource" ref="dataSource"/>
  27. <!-- 加载mybatis的全局配置文件 -->
  28. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  29. <!-- 扫描entity包 使用别名 -->
  30. <property name="typeAliasesPackage" value="com.jimisun.domain"/>
  31. <!-- 扫描sql配置文件:mapper需要的xml文件 -->
  32. <property name="mapperLocations" value="classpath:mapper/*.xml" />
  33. </bean>
  34.  
  35. <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
  36. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  37. <!-- 注入sqlSessionFactory -->
  38. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  39. <!-- 给出需要扫描Dao接口包 -->
  40. <property name="basePackage" value="com.jimisun.dao"/>
  41. </bean>
  42.  
  43. </beans>

Spring和Myabtis整合的有两个关注点

  1. Myabtis将SqlSessionFactory交付Spring管理
  2. Spring将XML对应的接口进行接手管理

Mybatis结果映射 Myabtis自定义结果映射完整示例代码下载

在实际项目中我们通过使用mybatis查询数据库经常使用多表查询,关联查询,或者实体的属性名和数据库列名不符等情况...所以查询的结果存在不定性,我们可以自定义Dto类,在mapper.xml文件中自定义<resultMap>标签即可。
  1. <resultMap id="MyDto" type="com.jimisun.domain.dto.MyDto">
  2. <result property="myid" column="id"></result>
  3. <result property="myusername" column="username"></result>
  4. </resultMap>

Mybatis二级缓存 Mybatis的二级缓存测试示例代码

虽然很多时候我们在开发中并不经常Mybatis的二级缓存 , 但是如果针对个别SQL进行优化设置能够极大提升访问数据库效率 . mybatis支持一级缓存和二级缓存,默认开启一级缓存,一级缓存使SqlSession级别的,Session结束缓存就清空了,二级缓存使Mapper级别的,需要我们手动开启。
  1. <!--开启二级缓存-->
  2. <cache/>
针对不需要使用二级缓存的方法设置useCache=false
  1. <select id="selectOne" parameterType="java.lang.Integer" resultType="com.jimisun.domain.TestUser" useCache="false">
  2. SELECT * from user where id = #{id}
  3. </select>

我们进行简单的测试 , 观察Mybatis二级缓存是否开启

  1. public static void main(String[] args) {
  2. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
  3. TestUserMapper testUserMapper = (TestUserMapper) context.getBean("testUserMapper");
  4. /*测试缓存:先查询此时username为jimisun*/
  5. TestUser testUser = testUserMapper.selectOne(1);
  6. /*测试缓存:修改username为lisi*/
  7. Integer integer = testUserMapper.updateOne(1);
  8. /*测试缓存:最后查询查看是否从数据库获取还是从缓存获取*/
  9. TestUser resultUser = testUserMapper.selectOne(1);
  10. System.out.println(resultUser.toString());
  11. }

Mybatis其他使用技巧

  • 在mapper.xml编写sql时对于重复的sql我们可以使用<include refid="id">引用代码
  • 对于Mybatis非空判断我们建议这样使用 <if test="param !=null and param != ''">
  • 一个Mapper.xml中可以直接引用另一个Mapper.xml的resultMap , 不需要重复定义

勘误&感谢

  本系列文章资料来源很多出自于互联网和在下本身的见解,受限于个人技术能力水平和其他相关知识的限制,相关见解错误或者资料引用错误请各位帮助留言校正!引用资料多来自于互联网,在下在引用前会遵循各位前辈或者博主的引用说明表示感谢,但互联网资料多是转发再转发或存在遗漏请原作者内信联系指正。

JavaORM框架之Mybatis篇(Ibatis)的更多相关文章

  1. JAVAORM框架之Mybatis (Ibatis) 详解

    目录 Mybatis基础概念 Mybatis开放方式演进 Mybatis框架核心要点 关联查询 延迟加载(懒加载) 动态SQL Mybatis缓存 Mybatis逆向工程 PageHelper分页插件 ...

  2. JAVA-ORM框架整理➣Mybatis操作MySQL

    概述 在Java中,对数据库操作的框架很多,上节概述Hibernate的简单使用,这里简单整理Mybatis的使用.Mybatis也是简单的数据库操作框架,通过IOC方式,获取操作类对象,进行数据的操 ...

  3. 开源顶级持久层框架——mybatis(ibatis)——day02

    mybatis第二天    高级映射 查询缓存 和spring整合          课程复习:         mybatis是什么?         mybatis是一个持久层框架,mybatis ...

  4. 【持久化框架】Mybatis简介与原理

    从这篇博文开始我们学习一下Mybatis,希望大家提出宝贵的建议. 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache softwar ...

  5. Hibernate框架与Mybatis框架的对比

    学习了Hibernate和Mybatis,但是一直不太清楚他们两者的区别的联系,今天在网上翻了翻,就做了一下总结,希望对大家有帮助! 原文:http://blog.csdn.net/firejuly/ ...

  6. 【持久化框架】Mybatis与Hibernate的详细对比

        前言 这篇博文我们重点分析一下Mybatis与hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Myba ...

  7. mybatis和ibatis区别

     ibatis本是apache的一个开源项目,2010年这个项目由apache software foundation 迁移到了google code,并且改名为mybatis.  1.Mybat ...

  8. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  9. Java框架之Mybatis(一)

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

随机推荐

  1. Incentivizing exploration in reinforcement learning with deep predictive models

    Stadie, Bradly C., Sergey Levine, and Pieter Abbeel. "Incentivizing exploration in reinforcemen ...

  2. struts2中struts.xml和web.xml文件解析及工作原理

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp ...

  3. JDK中的序列化和反序列化

    题外话:诸事缠身,不知不觉距离上一篇就将近一个月了,读书不易,学习不易,唯有坚持. 写来写去始终不满意,索性贴一个比较好的文章吧! 参考: [Java基础]序列化与反序列化深入分析

  4. 第三百一十八节,Django框架,信号

    第三百一十八节,Django框架,信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时, ...

  5. 在安装ZooKeeper之前,请确保你的系统是在以下任一操作系统上运行

    在安装ZooKeeper之前,请确保你的系统是在以下任一操作系统上运行: 任意Linux OS - 支持开发和部署.适合演示应用程序. Windows OS - 仅支持开发. Mac OS - 仅支持 ...

  6. PNG透明兼容IE6的几种方法(转)

    png 透明针对 IE6 一直是件挺麻烦的事情,使用的方法也是各有不同,大多的原理是用 IE 的滤镜来解决的. 语法: filter:progid:DXImageTransform.Microsoft ...

  7. 转载: erlang连接mysql

    转自:http://blog.csdn.net/flyinmind/article/details/7740540 项目中用到erlang,同时也用到mysql.惯例,google. 但是,按照网上说 ...

  8. 【转载】关于quartus ii软件中注释乱码问题的解决方法

    最近在看Verilog代码,由于我的quartus版本打开他们的文件注释会全部乱码,痛苦万分!从网上找了下原因,解决方法基本没有,不过看到有人提出是编码的问题,立马我就想到一个解决方法,经过实验果然有 ...

  9. js 动态设置 option 的selected 选项

    思路:通过for循环判断每个选项,一旦满足条件则设置其selected属性为true即可,关键代码: var obj = document.getElementById(select_id); for ...

  10. storm深入研究

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:He Ransom链接:http://www.zhihu.com/question/23441639/answer/28075 ...