最近在知乎读书复习刘增辉老师所著的《MyBatis从入门到精通》一书,颇有收获,因而将本身学习的过程以博客形式输出,若有错误,欢迎指正!知乎读书能够经过火狐浏览器另存页面为“网页,所有”的方式永久保存你借阅的电子书。html
做为一个正在自学Java的自动化专业本科生,在学习和实践过程当中”趟了很多雷“,“走了很多弯路”。这本书首先是适合刚学完JavaSE知识后入门,不足之处是未能在整合过程当中集成spring框架测试。为此我会将更新的IDEA版源码给出。java
MyBatis是一款支持自定义SQL查询、存储过程和高级映射的持久层框架。消除了几乎全部JDBC代码和参数的手动设置以及结果集的检索。mysql
MyBatis可使用XML或注解进行配置和映射。它经过将参数映射到配置的SQL最终造成执行的SQL语句,最后将执行的SQL的结果映射成Java对象返回。git
与其余的ORM(对象关系映射)框架不一样,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。github
MyBatis 支持声明式数据缓存( declarative data caching )。当一条 SQL 语句被标记为“可缓存”后,首次执行它时从数据库获取的全部数据会被存储在高速缓存中,后面再执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。spring
- MyBatis官方GitHub地址为:https://github.com/mybatis
Maven是一个项目构建和管理工具。目前市面上不少(2018年之前出版)陈旧的Java参考书还停留在讲如何使用Eclipse开发工具,包括本书。不过自2018年以后IT培训毕业班的双元视频都在介绍如何使用IntelliJ IDEA开发。sql
所以咱们要新建个Maven项目,使用IntelliJ IDEA 2018.3.6 新建Maven项目的过程以下:数据库
+ Create New Projectapache
注:JDK1.8 和 Maven3.6.2是须要用户解压安装并配置好系统环境变量,相关教程请参考黑马双元视频课的介绍。api
咱们新建完的Maven项目结构以下图所示:
默认生成的pom.xml文件其内容以下所示。
(此处省略,工具自动生成->无需记忆)
首先,设置源代码编码方式为UTF-8,配置以下。(推荐新手看:尚硅谷Java开发利器:IntelliJ IDEA的安装、配置与使用 ->编码格式如何在IDEA中配置成UTF-8)
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties>
接着,设置编译源代码的JDK版本,为了增大兼容范围使用的是JDK 1.8,配置以下。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version><!-- May, 2019 --> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build>
还须要在配置文件pom.xml中添加一些依赖才能使接下来的工做顺利进行。
这里要添加最重要的Mybatis3依赖、接着还须要添加会用到的 MySql驱动、JUnit、、Log4j的依赖。
注:数据库依赖的version要和本身电脑安装的实际状况一致->高版本的数据库驱动好比8.0.17兼容5.6.45数据库,可是url具体的一些链接规则有变化。(好比须要serverTimezone=Asia/Shanghai)
能够经过 http://search.maven.org/ 或 http://mvnrepository.com/ 来查找依赖坐标。
junit 是一个单元测试框架,那么使用 Junit 能让咱们快速的完成单元测试。下载地址: https://www.mvnjar.com/junit/junit/4.12/detail.html
mysql是一个数据库,Navicat是数据库可视化操做工具,二者须要先自行安装后再进行本实验流程。下载地址: https://www.mysql.com/downloads/
log4j是一个一款开源的日志框架,在项目中,咱们通常会结合slf4j和log4j一块儿使用。 下载地址: http://logging.apache.org/log4j/1.2/download.html
slf4j是一个简单日记门面(simple logging Facade for java)能够为各类loging APIs提供一个简单统一的接口。 下载地址: https://www.slf4j.org/download.html
最终的pom.xml文件内容以下:
完成这个步骤后,MyBatis的基本开发环境就已经准备好了。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.bjut.mybatis</groupId> <artifactId>example</artifactId> <version>0.1-SNAPSHOT</version> <packaging>jar</packaging> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <!--日志相关--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version><!-- May, 2019 --> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
注:首先须要安装mysql软件,而且记下root管理员的密码。而后再安装Navicat这个有图形界面的MySQL客户端工具,此处命令行代码的录入建议用文本编辑器 Notepad++。
SQL语句学习,推荐看 《MYSQL必知必会》。
经过执行下面的SQL语句建立一个名为 testmybatis的数据库,而后再建立一个名为country的表并插入一些简单的数据。
CREATE DATABASE testmybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; -- mysql语句单行注释使用 "-- " 注意,--后跟有一个空格 use testmybatis; -- 表头的字符串用` `括起来 CREATE TABLE `country`( `id` int NOT NULL AUTO_INCREMENT , `countryname` varchar(255) NULL , `countrycode` varchar(255) NULL , PRIMARY KEY (`id`) ); -- 表的字符串内容用' '括起来,格式使用同MATLAB insert country (`countryname`,`countrycode`) values ('中国','CN'),('美国','US'),('俄罗斯','RU'), ('英国','GB'),('法国','FR');
首先点击【链接】弹出窗体 肯定->建立了一个名为‘MyBatis从入门到精通’的【链接】->右键单击选择【打开链接】->右键菜单选择【命令列界面】->输入上述SQL语句并回车获得结果以下:
咱们检查一下 数据库testmybatis 表country的内容以下图所示:
除XML方式外,在后面介绍MyBatis集成Spring会使用spring bean方式进行配置。
若是是SpringBoot开发构建微服务项目,还能够经过Java编码方式进行配置。
本节使用XML形式进行配置,首先在 src/main/resources 下面建立 mybatis-config.xml配置文件。
也能够叫作 SqlMapConfig.xml(对文件名没有强制要求,但公司内部通常有默认的标准约定)。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!--配置日志输出接口--> <setting name="logImpl" value="LOG4J"/> <!--其余 mybatis配置--> <setting name=" mapUnderscoreToCamelCase" value="true"/> </settings> <!--存储查询结果实体类包的全路径--> <typeAliases> <package name="cn.bjut.simple.model"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/testmybatis?serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/bjut/simple/mapper/CountryMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/UserMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/RoleMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/PrivilegeMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/UserRoleMapper.xml"/> <mapper resource="cn/bjut/simple/mapper/RolePrivilegeMapper.xml"/> <!--<package name="cn.bjut.example.mapper"/>--> </mappers> </configuration>
MyBatis是一个 结果映射框架 ,这里建立的实体类是一个数据值对象(Data Value Object)。在实际应用中,一个表通常会对应一个实体。
package cn.bjut.simple.model; public class Country { //实体类的成员变量 private Long id; private String countryname; private String countrycode; //Alt+Insert 生成get/set方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getCountryname() { return countryname; } public void setCountryname(String countryname) { this.countryname = countryname; } public String getCountrycode() { return countrycode; } public void setCountrycode(String countrycode) { this.countrycode = countrycode; } @Override public String toString() { return "Country{" + "id=" + id + ", countryname='" + countryname + '\'' + ", countrycode='" + countrycode + '\'' + '}'; } }
在 src/main/resources 目录下面建立 cn/bjut/simple/mapper 目录,再在该目录下面建立 CountryMapper.xml文件,添加以下内容。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cn.bjut.simple.mapper.CountryMapper"> <select id="selectAll" resultType="Country"> select id,countryname,countrycode from country </select> </mapper>
SQL定义在 CountryMapper.xml文件中,里面的配置做用以下。
建立好实体和Mapper.xml后,接下来要有针对性地配置 Log4j ,让MyBatis在执行数据库操做时将有关信息输出到控制台。
在 src/main/resources 中添加 log4j.properties配置文件,输入以下内容。
#全局配置 log4j.rootLogger=ERROR, stdout #MyBatis 日志配置 log4j.logger.cn.bjut.simple.mapper=TRACE #控制台输出配置 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在MyBatis的日志实现中,所谓的包名其实是XML配置中 namespace 属性值的一部分。因为namespace属性值必须和接口全限定类名相同(只有这样框架才能自动建立接口的实现类)。
MyBatis日志的 最低级别是 TRACE ,在这个日志级别下,会输出执行SQL过程当中的详细信息,这个级别特别适合 开发时使用。
首先在 src/test/java 中建立 cn.bjut.simple.mapper 包 ,而后建立 CountryMapperTest1测试类 ,代码以下。
package cn.bjut.simple.mapper; import java.io.IOException; import java.io.Reader; import java.util.List; import cn.bjut.simple.model.Country; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.BeforeClass; import org.junit.Test; public class CountryMapperTest1 { //静态成员方法只能访问静态成员变量 private static SqlSessionFactory sqlSessionFactory; @BeforeClass public static void init(){ try { Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); reader.close(); } catch (IOException ignore) { ignore.printStackTrace(); } } @Test public void testSelectAll(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { List<Country> countryList = sqlSession.selectList("selectAll"); //直接调用在this类里定义的私有成员方法 this.printCountryList(countryList); } finally { sqlSession.close(); } } private void printCountryList(List<Country> countryList){ for(Country country : countryList){ System.out.printf("%-4d%4s%4s\n",country.getId(), country.getCountryname(), country.getCountrycode()); } } }
调用这个类里定义的私有成员方法时,能够省略this关键字。
这样就获得了最后的查询结果 countryList ,简单将结果输出到控制台。最后必定不要忘记关闭 SqlSession 。不然致使数据库链接数过多,形成系统崩溃。
1. Junit 入门使用教程 https://www.cnblogs.com/ysocean/p/6889906.html#_label2
2. log4j 日志框架使用 https://blog.csdn.net/king_kgh/article/details/80430002
3. slf4j学习小结 https://imshare.iteye.com/blog/772770
4. MyBatis从入门到精通 https://mybatis3.github.io/downloads.html
=========================
end