欢迎查看 Java 开发之上帝之眼系列教程, 如果您正在为 Java 后端庞大的体系所困扰, 如果您正在为各种繁出不穷的技术和各种框架所迷茫, 那么本系列文章将带您窥探 Java 庞大的体系. 本系列教程希望您能站在上帝的角度去观察 (了解)Java 体系. 使 Java 的各种后端技术在你心中模块化; 让你在工作中能将 Java 各个技术了然于心; 能够即插即用. 本章我们来一起了解 ORM(对象关系映射关系) 框架之 Mybatis(Ibatis).
主流 ORM 框架有 Mybatis 和 Hibernate, 本章我们将对 Mybatis 的核心要点进行了解.
什么是 ORM(对象映射关系)框架?
ORM(Object Relational Mapping)对象关系映射, 是 一种为了解决面向对象与关系型数据库不匹配而出现的技术, 使开发者能够用面向对象的方式使用关系型数据库.
Mybatis 和 Hibernate 有什么异同?
Mybatis 简单, Hibernate 较复杂, 门槛高.
Mybatis 自定制 Sql, 比 Hibernate 灵活, 可控
Mybatis 与数据库映射得到的 PO 与 Hibernate 映射 PO 意义不同
Mybatis 入门起步 Mybatis 入门起步完整示例下载
- /**
- * @Author:jimisun
- * @Description:
- * @Date:Created in 08:37 2018-09-24
- * @Modified By:
- */
- public class Main {
- public static void main(String[] args) throws IOException {
- String resource = "mybatis-config.xml";
- InputStream inputStream = Resources.getResourceAsStream(resource);
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- SqlSession sqlSession = sqlSessionFactory.openSession();
- TestUserMapper mapper = sqlSession.getMapper(TestUserMapper.class);
- TestUser testUser = mapper.selectOne(1);
- System.out.println(testUser.toString());
- }
- }
PS:Mybatis 支持注解开发, 但需要保留空的 xml 文件, 也就是保留空的命名空间 ; 如下所示
- @Select("SELECT * from user where id = #{id};")
- MyDto selectOne(Integer id);
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.jimisun.dao.TestUserMapper">
- <!-- 空 -->
- </mapper>
Mybatis 和 Spring 的集成 Myabtis 和 Spring 整合完整示例代码下载
如果你使用 Mybatis 那么一定会使用 Spring, 最常见的框架组合就是 SSM(SpringMvc+Spring+Mybatis), 那么 Mybatis 针对和 Spring 的整合提供了一个类库(jar 包)
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>1.2.2</version>
- </dependency>
以前我们配置在 mybatis 里面的配置, 现在我们可以将这些配置转移到了 Spring 配置中; 统一交给 Spring 进行管理, Mybatis 的配置文件留空, 但是不能删除哟
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd">
- <!-- 加载配置文件 -->
- <context:property-placeholder location="classpath:db.properties"/>
- <!-- 数据库连接池 -->
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
- destroy-method="close">
- <property name="driverClassName" value="${jdbc.driver}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- <property name="maxActive" value="10"/>
- </bean>
- <!-- mapper 配置 -->
- <!-- 让 spring 管理 sqlsessionfactory 使用 mybatis 和 spring 整合包中的 -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!-- 数据库连接池 -->
- <property name="dataSource" ref="dataSource"/>
- <!-- 加载 mybatis 的全局配置文件 -->
- <property name="configLocation" value="classpath:mybatis-config.xml"/>
- <!-- 扫描 entity 包 使用别名 -->
- <property name="typeAliasesPackage" value="com.jimisun.domain"/>
- <!-- 扫描 sql 配置文件: mapper 需要的 xml 文件 -->
- <property name="mapperLocations" value="classpath:mapper/*.xml" />
- </bean>
- <!-- 配置扫描 Dao 接口包, 动态实现 Dao 接口, 注入到 spring 容器中 -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <!-- 注入 sqlSessionFactory -->
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
- <!-- 给出需要扫描 Dao 接口包 -->
- <property name="basePackage" value="com.jimisun.dao"/>
- </bean>
- </beans>
Spring 和 Myabtis 整合的有两个关注点
Myabtis 将 SqlSessionFactory 交付 Spring 管理
Spring 将 xml 对应的接口进行接手管理
Mybatis 结果映射 Myabtis 自定义结果映射完整示例代码下载
在实际项目中我们通过使用 mybatis 查询数据库经常使用多表查询, 关联查询, 或者实体的属性名和数据库列名不符等情况... 所以查询的结果存在不定性, 我们可以自定义 Dto 类, 在 mapper.xml 文件中自定义 < resultMap > 标签即可.
- <resultMap id="MyDto" type="com.jimisun.domain.dto.MyDto">
- <result property="myid" column="id"></result>
- <result property="myusername" column="username"></result>
- </resultMap>
Mybatis 二级缓存 Mybatis 的二级缓存测试示例代码
虽然很多时候我们在开发中并不经常 Mybatis 的二级缓存 , 但是如果针对个别 SQL 进行优化设置能够极大提升访问数据库效率 . mybatis 支持一级缓存和二级缓存, 默认开启一级缓存, 一级缓存使 SqlSession 级别的, Session 结束缓存就清空了, 二级缓存使 Mapper 级别的, 需要我们手动开启.
- <!-- 开启二级缓存 -->
- <cache/>
针对不需要使用二级缓存的方法设置 useCache=false
- <select id="selectOne" parameterType="java.lang.Integer" resultType="com.jimisun.domain.TestUser" useCache="false">
- SELECT * from user where id = #{id}
- </select>
我们进行简单的测试 , 观察 Mybatis 二级缓存是否开启
- public static void main(String[] args) {
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
- TestUserMapper testUserMapper = (TestUserMapper) context.getBean("testUserMapper");
- /* 测试缓存: 先查询此时 username 为 jimisun*/
- TestUser testUser = testUserMapper.selectOne(1);
- /* 测试缓存: 修改 username 为 lisi*/
- Integer integer = testUserMapper.updateOne(1);
- /* 测试缓存: 最后查询查看是否从数据库获取还是从缓存获取 */
- TestUser resultUser = testUserMapper.selectOne(1);
- System.out.println(resultUser.toString());
- }
Mybatis 其他使用技巧
在 mapper.xml 编写 sql 时对于重复的 sql 我们可以使用 < include refid="id">引用代码
对于 Mybatis 非空判断我们建议这样使用 <if test="param !=null and param !=''">
一个 Mapper.xml 中可以直接引用另一个 Mapper.xml 的 resultMap , 不需要重复定义
Java 开发之上帝之眼系列教程其他文章
Java 开发之上帝之眼系列教程前言和章节目录汇总
JavaIOC 框架之 Spring Framework
勘误 & 感谢
本系列文章资料来源很多出自于互联网和在下本身的见解, 受限于个人技术能力水平和其他相关知识的限制, 相关见解错误或者资料引用错误请各位帮助留言校正! 引用资料多来自于互联网, 在下在引用前会遵循各位前辈或者博主的引用说明表示感谢, 但互联网资料多是转发再转发或存在遗漏请原作者内信联系指正.
来源: https://www.cnblogs.com/jimisun/p/9717124.html