MyBatis从入门到精通(1):MyBatis入门
作为一个自学Java的自动化专业211大学本科生,在学习和实践过程中”趟了不少雷“,所以有志于建立一个适合同样有热情学习Java技术的参考“排雷手册”。
最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正!
第1章 MyBatis入门
1.1 MyBatis简介
MyBatis是一款支持自定义SQL查询、存储过程和高级映射的持久层框架。消除了几乎所有JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或注解进行配置和映射。MyBatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行的SQL的结果映射成Java对象返回。
与其他的ORM(对象关系映射)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。
1.2 创建Maven项目
Maven是一个项目构建和管理工具。目前市面上很多陈旧的Java参考书还停留在讲如何使用Eclipse开发工具,不过据我观察IT培训班的视频都更新在使用IDEA。
因此我们要新建个Maven项目,使用IntelliJ IDEA 2018.3.6 x64新建Maven项目的过程如下:
+ Create New Project
注:JDK1.8u211 是需要用户安装并配置好环境变量,相关教程请参考其他博客的介绍。
我们新建完的Maven项目结构如下图所示:
默认生成的pom.xml文件其内容如下所示:
<?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> </project>
以上是Maven项目的基本配置信息,我们还需要为它添加一些常用配置。
首先,设置源代码编码方式为UTF-8,配置如下。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
接着,设置编译源代码的JDK版本,本人使用的是JDK 1.8,配置如下。
<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
还需要在配置文件pom.xml中添加一些依赖才能使接下来的工作顺利进行。
这里要添加最重要的MyBatis依赖、接着还需要添加会用到的 JUnit、mysql、Log4j驱动的依赖。
注:各种依赖的version要和自己电脑安装的实际情况一致!
可以通过 http://search.maven.org/ 来查找依赖坐标。
MyBatis 下载地址: https://mybatis3.github.io/downloads.html
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文件内容如下。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>cn.bjut.mybatis</groupId> 8 <artifactId>example</artifactId> 9 <version>0.1-SNAPSHOT</version> 10 11 <properties> 12 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 13 <java.version>1.8</java.version> 14 </properties> 15 16 <build> 17 <plugins> 18 <plugin> 19 <artifactId>maven-compiler-plugin</artifactId> 20 <configuration> 21 <source>${java.version}</source> 22 <target>${java.version}</target> 23 </configuration> 24 </plugin> 25 </plugins> 26 </build> 27 28 <dependencies> 29 <dependency> 30 <groupId>junit</groupId> 31 <artifactId>junit</artifactId> 32 <version>4.12</version> 33 <scope>test</scope> 34 </dependency> 35 <dependency> 36 <groupId>org.mybatis</groupId> 37 <artifactId>mybatis</artifactId> 38 <version>3.3.0</version> 39 </dependency> 40 <dependency> 41 <groupId>mysql</groupId> 42 <artifactId>mysql-connector-java</artifactId> 43 <version>5.1.38</version> 44 </dependency> 45 <dependency> 46 <groupId>org.slf4j</groupId> 47 <artifactId>slf4j-api</artifactId> 48 <version>1.7.12</version> 49 </dependency> 50 <dependency> 51 <groupId>org.slf4j</groupId> 52 <artifactId>slf4j-log4j12</artifactId> 53 <version>1.7.12</version> 54 </dependency> 55 <dependency> 56 <groupId>log4j</groupId> 57 <artifactId>log4j</artifactId> 58 <version>1.2.17</version> 59 </dependency> 60 </dependencies> 61 62 63 </project>
当对Maven的配置进行修改后,还需要来(一些操作技巧)来更新外部依赖的jar包。
完成上述步骤后,MyBatis的基本开发环境就已经准备好了。
1.3 简单配置让MyBatis跑起来
1.3.1 准备数据库
注:首先需要安装mysql软件,并且记下root管理员的密码。然后再安装Navicat这个有图形界面的MySQL客户端工具,此处命令行代码的录入建议用文本编辑器 Notepad++。
SQL语句学习,推荐看 《MYSQL必知必会》。通过执行下面的SQL语句创建一个名为 mybatis的数据库,然后再创建一个名为country的表并插入一些简单的数据。
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; -- mysql语句单行注释使用 "-- " 注意,--后跟有一个空格 use mybatis; -- 表头的字符串用` `括起来 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语句并回车得到结果如下:
我们检查一下 数据库mybatis 表 的内容如下图所示
1.3.2 配置MyBatis
使用XML形式进行配置,首先在 src/main/resources下面创建 mybatis-config.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"/>
</settings>
<typeAliases>
<package name="cn.bjut.example.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis ?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/bjut/example/mapper/CountryMapper.xml"/>
</mappers>
</configuration>
- <settings>中的logImpl属性配置 指定使用LOG4J输出日志。
- <typeAliases>在MyBatis中需要频繁用到类的全限定名称,为了方便使用,我们配置了 cn.bjut.example.model包,这样后在使用类的时候不需要写包名的部分,只使用Country即可。
- <environments>环境配置中主要配置了数据库连接,数据库的url为: jdbc:mysql://localhost:3306/mybatis 使用的本机MySQL中的mybatis数据库。
- 如果使用本地数据库要改的格式: jdbc:mysql://localhost:3306/mybatis
- com.mysql.jdbc.Driver 会报错应该改成: com.mysql.cj.jdbc.Driver
- 按照上述改完之后报错显示没填写默认时区修正方法: <property name=”url” value=”jdbc:mysql://localhost:3306/mybatis ?serverTimezone=GMT“/>
- <mappers>中配置了一个 包含完整类路径的 CountryMapper.xml ,这是一个MyBatis的SQL语句和映射配置文件。
1.3.3 创建实体类和Mapper.xml文件
MyBatis是一个 结果映射框架 ,这里创建的实体类是一个数据值对象(Data Value Object)。在实际应用中,一个表一般会对应一个实体。
根据MyBatis官方的习惯,一般用Mapper作为XML和接口类名的后缀。通常称XML为Mapper.xml文件,称接口为Mapper接口。
- 在src/main/java 下创建一个基础的包 cn.bjut.example ,在这个包下面再创建model包。
- 根据数据库表 country ,在model包下创建实体类Country ,代码如下。
1 package tk.mybatis.simple.model; 2 3 public class Country { 4 private Long id; 5 private String countryname; 6 private String countrycode; 7 8 public Long getId() { 9 return id; 10 } 11 12 public void setId(Long id) { 13 this.id = id; 14 } 15 16 public String getCountryname() { 17 return countryname; 18 } 19 20 public void setCountryname(String countryname) { 21 this.countryname = countryname; 22 } 23 24 public String getCountrycode() { 25 return countrycode; 26 } 27 28 public void setCountrycode(String countrycode) { 29 this.countrycode = countrycode; 30 } 31 32 }
在 src/main/resources 下面创建 cn/bjut/mybatis/example/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="tk.mybatis.simple.mapper.CountryMapper">
<select id="selectAll" resultType="Country"> select id,countryname,countrycode from country </select>
</mapper>
SQL定义在 CountryMapper.xml文件中,里面的配置作用如下。
- <mapper>: XML的根元素,属性namespace定义了当前XML的命名空间。
- <select>元素: 我们所定义的一个 SELECT查询。
- id属性: 定义了当前SELECT查询的 唯一 一个id。
- resultType: 定义了当前查询的返回值类型,此处就是指 实体类Country。
创建好实体和Mapper.xml后,接下来要有针对性地配置 Log4j ,让MyBatis在执行数据库操作时将有关信息输出到控制台。
1.3.4 配置Log4j以便查看MyBatis操作数据库的过程
在 src/main/resources 中添加 log4j.properties配置文件,输入如下内容。
1 #\u5168\u5C40\u914D\u7F6E 2 log4j.rootLogger=ERROR, stdout 3
4 #MyBatis \u65E5\u5FD7\u914D\u7F6E 5 log4j.logger.cn.bjut.example.mapper=TRACE 6
7 #\u63A7\u5236\u53F0\u8F93\u51FA\u914D\u7F6E 8 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 9 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 10 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在MyBatis的日志实现中,所谓的包名实际上是XML配置中 namespace 属性值的一部分。由于namespace属性值必须和接口全限定类名相同,因此才会真正对应到Java中的包。
MyBatis日志的 最低级别是 TRACE ,在这个日志级别下,会输出执行SQL过程中的详细信息,这个级别适合 开发时使用。
配置好Log4j,接下来就可以编写 测试代码让MyBatis跑起来了。
1.3.5 编写测试代码 让MyBatis跑起来
首先在 src/test/java 中创建 cn.bjut.example.mapper 包 ,然后创建 CountryMapperTest测试类 ,代码如下。
1 package tk.mybatis.simple.mapper; 2
3 import java.io.IOException; 4 import java.io.Reader; 5 import java.util.List; 6
7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory; 10 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 11 import org.junit.BeforeClass; 12 import org.junit.Test; 13
14 import tk.mybatis.simple.model.Country; 15
16 public class CountryMapperTest { 17
18 private static SqlSessionFactory sqlSessionFactory; 19
20 @BeforeClass 21 public static void init(){ 22 try { 23 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); 24 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 25 reader.close(); 26 } catch (IOException ignore) { 27 ignore.printStackTrace(); 28 } 29 } 30
31 @Test 32 public void testSelectAll(){ 33 SqlSession sqlSession = sqlSessionFactory.openSession(); 34 try { 35 List<Country> countryList = sqlSession.selectList("selectAll"); 36 printCountryList(countryList); 37 } finally { 38 sqlSession.close(); 39 } 40 } 41
42 private void printCountryList(List<Country> countryList){ 43 for(Country country : countryList){ 44 System.out.printf("%-4d%4s%4s\n",country.getId(), country.getCountryname(), country.getCountrycode()); 45 } 46 } 47 }
- 通过 Resources 工具类 将mybatis-config,xml配置文件读入 Reader。
- 再通过 SqlSessionFactoryBuilder 建造类使用Reader创建 SqlSessionFactory工厂对象。这个过程中会读取全部的Mapper.xml进行 具体 方法的解析。
- 使用时通过 SqlSessionFactory工厂对象获取一个 SqlSession。
- 通过SqlSession的 selectList 方法查找到 CountryMapper.xml中id=’selectAll’的方法,执行SQL查询。
- MyBatis底层使用 JDBC执行SQL,获取查询结果集ResultSet后,根据 resultType的配置,将结果映射为Country类型的集合,返回查询结果。
这样就得到了最后的查询结果 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
相关文章