MyBatis故事:
官方网站:http://www.mybatis.org
官方文档:http://www.mybatis.org/mybatis-3/
GitHub:https://github.com/mybatis
通过在MyBatis的官方网站,我们会看到和MyBatis相关的一些软件产品:
MyBatis Migrations 是一款数据库迁移工具 http://www.mybatis.org/migrations;
MyBatipse (Eclipse plugin) ,Eclipse插件提供在编写xml配置文件时的内容提示和验证;
MyBatis Generator 代码生成工具;
What is MyBatis?
MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis SQL mapper framework for Java可以将其称之为Java持久层框架.
MyBatis 的前身是apache下的一个开源项目iBatis, iBATIS是一个由Clinton Begin在2002年发起的开源项目,是一个基于Java的持久层框架。
iBATIS:http://ibatis.apache.org
iBATIS这个项目于2010年6月16号由apache迁移到了google code,iBatis3.x并且改名为MyBatis 。
MyBatis: http://code.google.com/p/mybatis/ (现在已经无法打开)
2013年11月MyBatis又从google code将代码迁移到Github。
MyBatis和Hibernate
MyBatis的作者:Clinton Begin 加拿大人 https://www.linkedin.com/in/clintonbegin
Hibernate 2001年推出的Java持久层框架,澳大利亚人 Gavin King https://www.linkedin.com/in/GavinKing
人们经常喜欢比较这两款优秀的持久层框架的特点:
技术 | 优点 | 缺点 |
jdbc | 简单,纯粹,一切均可见,最基础的一种技术 | 1:需要手动关闭连接 2:结果集不能自动映射为对象 3:SQL夹杂在代码中,耦合度高,导致硬编码内伤 4:实际开发中SQL经常随需求变动,导致频繁修改,不易维护 |
jdbcTemplate | 简单、纯粹、自动会话管理、结果集映射 |
需要手动拼装SQL,SQL与Java代码混合在一起,长的SQL管理混乱 |
Hibernate JPA |
编程效率高,无需编写SQL。 较完善的二级缓存、自动防SQL注入 |
完全掌握的门槛高; |
MyBatis | 学习成本低、可以进行更为细腻的SQL优化,减少查询字段、统一的SQL管理 |
需要手动编写维护SQL、表结构变更之后需要手动维护SQL与映射; |
MyBatis的定位
MyBatis专注于SQL本身,其为SQL映射,而非完整的SQL映射,它是一个半自动的ORM框架,需要自己编写SQL语句,这是其优点,也是缺点.
优点:SQL语句单独维护,便于SQL优化,便于发挥SQL的最大性能.
缺点:当数据库表和字段更改后,实体和数据库的映射关系需要手动维护,耗费时间长.
使用场景:是用于性能要求高,有大量的查询操作,适用于互联网项目,如:电商,O2O
互联网项目对持久层的需求:
1:对数据库的访问更加纯粹
2:尽可能不要使用数据库做运算
3:SQL语句尽可能命中索引(字段排序,查询字段,查询条件,尽可能命中索引)
MyBatis实战应用:
Mybatis框架就一个jar包;要使用 MyBatis, 只需将 mybatis-3.5.1.jar 文件置于 classpath 中即可。
使用Maven构建项目
org.mybatis mybatis 3.5.1
下载MyBatis源码,构建MyBatis项目;https://codeload.github.com/mybatis/mybatis-3/zip/mybatis-3.5.1
如果不出意外,我们解压下载的压缩包,然后通过pom.xml导入IDEA中,通过Maven的compiler就可以正常编译成功,首次编译可能需要一定时间。
为了验证我么编译的项目是否可用,我们可以写一个简单的案例项目去测试一下,也方便后续的断点跟踪源码分析。
创建普通的Maven项目,添加Maven依赖
junit junit 4.11 test mysql mysql-connector-java 5.1.47 org.projectlombok lombok 1.18.8 org.slf4j slf4j-api 1.7.26 org.apache.logging.log4j log4j-api 2.11.2 org.apache.logging.log4j log4j-slf4j-impl 2.11.2 cglib cglib 3.3.0 org.javassist javassist 3.27.0-GA
添加resources编译,个人建议添加
src/main/java **/*.xml src/main/resources **/*.*
添加jdbc.properties,根据自身配置
jdbc.username=xxx jdbc.password=xxxxx jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://xxxx:3306/xxx?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
最后贴上mybatis的xml配置
"1.0" encoding="UTF-8" ?> DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">"D:\mybatis-3-mybatis-3.5.1\mybatis3-test\src\main\resources\jdbc.properties"/> "logImpl" value="SLF4J"/> "cacheEnabled" value="true"/> "com.xxx.model.User" alias="User"/> "com.xxx.type.CryptHandlerType" javaType="com.xxx.model.IdCardType"/> default="development"> "development"> "org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory"/> "POOLED"> "driver" value="${jdbc.driver}"/> "url" value="${jdbc.url}"/> "username" value="${jdbc.username}"/> "password" value="${jdbc.password}"/> "test"> "JDBC"/> "POOLED"> "driver" value="${jdbc.driver}"/> "url" value="${jdbc.url}"/> "username" value="${jdbc.username}"/> "password" value="${jdbc.password}"/> "product"> "JDBC"/> "POOLED"> "driver" value="${jdbc.driver}"/> "url" value="${jdbc.url}"/> "username" value="${jdbc.username}"/> "password" value="${jdbc.password}"/> "com/xxx/mapper/UsersMapper.xml"/>
日志配置
"1.0" encoding="UTF-8"?>"debug"> "Console" target="SYSTEM_OUT"> "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> "debug"> ref="Console"/>
贴上本人的项目结构,仅供参考
MyBatis独立使用
//通过配置文件获取输入流 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); //构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //打开session SqlSession sqlSession = sqlSessionFactory.openSession(); //第四步 获取Mapper接口对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //第五步 调用Mapper接口对象的方法操作数据库 User user = mapper.selectByPrimaryKey(1); //获取结果,处理业务 log.info("查询结果:",user.getId());
当我们数据库配置等都设置完毕,正常来说查询数据是不会出现异常的,这样就说明我们的源码编译是成功的。
MyBatis Generator (MBG)
MyBatis Generator 简称MBG,是用Java语言开发的一个代码生成工具,可以深入分析你的数据库和表,帮助你生成基本的对数据库的CRUD操作代码以及QBC风格的条件查询,但是表连接、存储过程等这些复杂SQL的定义需要我们手工编写。
MyBatis Generator 生成3个东西:
1、POJO
2、Mapper XML Files
3、Mapper interface
MyBatis Generator 生成代码不需要依赖任何第三方jar包,仅仅需要一个jdbc驱动包;
文档:http://www.mybatis.org/generator/
Github:https://github.com/mybatis/generator
原来MyBatis Generator老版本:ibator,用于iBatis代码生成;
1、配置MyBatis Generator (MBG) 的配置文件;
"1.0" encoding="UTF-8"?> DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">"jdbc.properties"/> "F:/mysql-connector-java-5.1.46.jar"/> "tables" targetRuntime="MyBatis3"> "suppressAllComments" value="true" /> "driverClass" value="${jdbc.driver}"/> "connectionURL" value="${jdbc.url}"/> "userId" value="${jdbc.username}"/> "password" value="${jdbc.password}"/> "org.mybatis.model" targetProject="src/main/java"> "enableSubPackages" value="false" /> "trimStrings" value="false" /> "org.mybatis.mapper" targetProject="src/main/java"> "enableSubPackages" value="false" /> "XMLMAPPER" targetPackage="org.mybatis.mapper" targetProject="src/main/java"> "enableSubPackages" value="false" /> "user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
1、生成代码
--通过命令行生成 java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml (用得比较少)
--通过Ant生成 (ant几乎被淘汰了)
--通过java程序生成
--通过maven生成
org.mybatis.generator mybatis-generator-maven-plugin 1.3.7 src/main/resources/generatorConfig.xml true true --通过Eclipse生成
建议不要用mysql驱动8.0, 用5.1.x系列的驱动;
使用maven插件通过以下方式即可自动生成。
在源码分析的前面,我会分享一些MyBatis的常规应用