欢迎查看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. Javascript实现浏览器菜单命令

    每当我们看到别人网页上的打开.打印.前进.另存为.后退.关闭本窗口.禁用右键等实现浏览器命令的链接,而自己苦于不能实现时,是不是感到很遗憾?是不是也想实现?如果能在网页上能实现浏览器的命令,将是多么有 ...

  2. ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)

    我的原因是在配置文件my.ini [mysqld]项,在其后加入了一句:skip-name-resolve 导致授权出现这个错误,把skip-name-resolve这项屏蔽了就好了. 场景2:对所有 ...

  3. e621. Activating a Keystroke When Any Child Component Has Focus

    Normally, a keystroke registered on a component is activated when the component has the focus. This ...

  4. ‘,’之后要留空格,如 Function(x, y, z)

    ‘,’之后要留空格,如 Function(x, y, z).如果‘;’不是一行的结束 符号,其后要留空格,如 for (initialization; condition; update). #inc ...

  5. circRNA 序列提取中的难点

    在预测circRNA时,都是检测breakpoint 处的reads 数,最后给出的环状RNA的ID 都是诸如 chr14:106994222-107183708 这样的形式,给出了起始和终止位置: ...

  6. 【Java面试题】5 Integer的int 的种种比较?详细分析

    如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...

  7. php对gzip的使用(实例)

    代码如下: if (!function_exists('gzdecode')) { function gzdecode ($data) { $flags = ord(substr($data, 3, ...

  8. js得到当前文档的编码:document.characterSet

    <!DOCTYPE HTML> <html > <head> <meta charset="utf-8"> <!--meta ...

  9. Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?

       很多新用户在安装了Chrome浏览器或者更新过的的时候,经常提示“ adobe flash player 已过期”的问题,反复提示,导致无法观看视频.于是从网上也找了很多办法都没有解决.这里给大 ...

  10. 移动端web开发技巧 -- 转载

    META相关 1. 添加到主屏后的标题(IOS)<meta name="apple-mobile-web-app-title" content="标题"& ...