1.3 简单配置让MyBatis跑起来
1.3.1 准备数据库
首先创建一个数据库,编码方式设为UTF-8,可以使用MySQL客户端工具来实现。通过执行下面的SQL语句创建一个名为mybatis的数据库。
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8_general_ci;
然后再创建一个名为country的表并插入一些简单的数据,代码如下。
use mybatis;
CREATE TABLE `country` (
`id` int NOT NULL AUTO_INCREAMENT ,
`countryname` varchar(255) NULL ,
`countrycode` varchar(255) NULL ,
PRIMARY KEY (`id`)
);
insert country(`countryname` , `countrycode`)
values (`中国`,`CN`),(`美国`,`US`),(`俄罗斯`,`RU`),(`英国`,`GB`),(`法国`,`FR`);
准备好表和简单的数据后,继续来配置MyBtis。
1.3.2 配置MyBtis
配置MyBtis有多种方式,本节使用最基础最常用的XML形式进行配置。除XML方式外,再后面介绍和Spring集成的时候还会使用Spring Bean方式进行配置。
使用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= " tk.mybatis.simple .model" />
</typeAliases>
<environments default = " development " >
<environment id= " development " >
<transactionManager type =" JDBC " >
<property name = "" value= "" />
< /transactionManager>
< dataSource type = " UN POOLED " >
<property name= " driver " value = " com.mysql.jdbc.Driver " />
<property name= " url "
value = " jdbc:mysql://localhost : 3306/ mybatis " />
<property name= " username " value = " root " />
<property name= " password" value = "root" />
</dataSource >
< /environment>
</environments>
<mappers>
<mapper resource =" tk/mybatis/simple/mapper/CountryMapper.xml " />
</mappers>
</ configuration>
简单讲解一下这个配置。
- <settings>中的logImpl属性配置执行使用LOG4J输出日志。
- <typeAliases>元素下面配置了一个包的别名,通常确定一个类的时候需要使用类的全限定名称,为了方便使用,我们配置了 " tk.mybatis.simple .model" 包,这样配置后,在使用类的时候不需要写包名的部分,只使用Country即可。
- <environments>环境配置中主要配置了数据库连接,数据库的url为 "jdbc:mysql://localhost:3306/mybatis",使用的是本机MySQLzhong de mybtis数据库,后面的username 和 password分别你是数据库的用户名和密码(如果你的数据库用户名及密码和这里不一样,请修改为自己数据库可用的用户名和密码)。
- <mappers>中配置了一个包含完整类路径的CountryMapper.xml ,这是一个MyBtisSQL语句和映射配置文件,这个XML文件会在后面的章节中介绍。
1.3.3 创建实体类和Mapper.xml 文件
MyBatis 是一个结果映射框架,这里创建的实体类实际上是一个数据值对象( Data Value Object ),在实际应用中, 一个表一般会对应一个实体,用于INSERT 、UPDATE 、DELETE 和 简单的SELECT 操作,所以姑且称这个简单的对象为实体类。
【关于Mapper的命名方式:在MyBatis中,根据MyBatis官方的习惯,一般用Mapper作为XML和接口类名的后缀,这里的Mapper和我们常用的DAO后缀类似,只是一种习惯而已,本书中全部使用Mapper后缀。通常称XML 为 Mapper.xml 文件,称接口为 Mapper 接口,在实际应用中可以根据自己的需求来定义命名方式。】
在 src/main/java 下创建一个基础的包 tk.mybatis.simple ,在这个包下面再创建model 包。根据数据库表 country ,在model 包下创建实体类Country ,代码如下。
package tk.mybatis.simple.model;
public class Country {
private long id;
private String countryname;
private String countrycode;
//getter 和setter 方法
}
在 src/main/resources 下面创建 tk/mybatis/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-mappe,dtd" >
<mapper namespace=" tk.mybatis.simple.mapper.CouηtryMapper " >
<select id= "selectAll " resultType=" Country" >
select id , countryname , countrycode from country
</select>
</mapper>
- <mapper> : XML 的根元素, 属性ηamespace 定义了当前XML 的命名空间。
- <select >元素:我们所定义的一个SELECT 查询。
- id 属性:定义了当前SELECT 查询的唯一一个id 。
- resultType :定义了当前查询的返回值类型,此处就是指实体类Country ,前面配置中提到的别名主要用于这里,如果没有设置别名,此处就需要写成resu lt Type=” tk.mybatis.simple.model.Country ” 。
- select id , ...: 查询SQL 语句。
创建好实体和Mapper.xml 后, 接下来要有针对性地配置Log4j ,让MyBatis 在执行数据库操作的时候可以将执行的SQL 和其他信息输出到控制台。
1.3.4 配置 Log4j 以便查看MyBatis 操作数据库的过程
在src/main/resources 中添加log4j .properties 配置文件,输入如下内容。
#全局配置
log4j .rootLogger=ERROR, stdout
#MyBatis 日志配置
log4j.logger.tk.mybatis.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
【日志注意事项!
用过Log4j 日志组件的人可能都会知道,配直中的log4j.logger.tk.mybatis.simple.mapper 对应的是tk.mybatis.simple.mapper 包,但是在这个例子中, Java 目录下并没有这个包名,只在资源目录下有mapper 目录。
在MyBatis 的日志实现中,所谓的包名实际上是XML 配置中的namespace 属性值的一部分。后面章节中介绍结合接口使用的相关内容时,由于namespace 属性值必须和接口全限定类名相同,因此才会真正对应到 Java 中的包。当使用纯注解方式时,使用的就是纯粹的包名。
MyBatis 日志的最低级别是TRACE ,在这个日志级别下, MyBatis 会输出执行SQL 过程中的详细信息,这个级别特别适合在开发时使用。】
配置好Log4j 后,接下来就可以编写测试代码让MyBatis跑起来了。
1.3.5 编写测试代码让MyBatis跑起来
首先在 src/test/java 中创建 tk.mybatis.simple. mapper 包,然后创建CountryMapperTest 测试类,代码如下。
package tk.mybatis.simple.mapper;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
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;
import tk.mybatis.simple.model.Country;
public class CountryMapperTest {
private static SqlsessionFactory sqlSessionFactory;
@BeforeClass
public static void init() {
try {
Reader reader = Resource.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");
printCountryList(countryList);
}finally {
//不要忘记关闭sqlSession
sqlSession.close();
}
}
private void printCountryList(List<Country> countryList) {
for(Country country : countryList){
System.out.printf("%-4d%4s%4s\n",
country.getId(), country.getCoutnryname(), Country.getCountrycode());
}
}
}
对上面这段代码做一个简单的说明,具体如下。
- 通过Resources 工具类将mybatis-config.xml 配置文件读入Reader 。
- 再通过SqlSessionFactoryBuilder 建造类使用Reader 创建SqlSessionFactory 工厂对象。在创建SqlSessionFactory 对象的过程中, 首先解析mybatis-config.xml 配置文件,读取配置文件中的mappers 配置后会读取全部的Mapper.xml 进行具体方法的解析,在这些解析完成后,SqlSessionFactory 就包含了所有的属性配置和执行SQL 的信息。
- 使用时通过SqlSessionFactory 工厂对象获取一个SqlSession。
- 通过SqlSession 的selectList 方法查找到CountryMapper.xnl 中id="selectAll" 的方法,执行SQL 查询。
- MyBatis 底层使用JDBC 执行SQL ,获得查询结果集ResultSet 后,根据resultType的配置将结果映射为Country 类型的集合, 返回查询结果。
- 这样就得到了最后的查询结果countryList ,简单将结果输出到控制台。
- 最后一定不要忘记关闭SqlSession ,否则会因为连接没有关闭导致数据库连接数过多,造成系统崩溃。
上面的测试代码成功执行后,会输出如下日志。
DEBUG [main] - ==> Preparing: select id, countryname, countrycode from country
DEBUG [main] - ==> Parameters:
TRACE [main] - <== Collumns: id, countryname, countrycode
TRACE [main] - <== Row: 1,中国,CN
TRACE [main] - <== Row: 2,美国,US
TRACE [main] - <== Row: 3,俄罗斯,RU
TRACE [main] - <== Row: 4,英国,GB
TRACE [main] - <== Row: 5,法国,FR
DEBUG [main] - <== Total: 5
1 中国 CN
2 美国 US
3 俄罗斯 RU
4 英国 GB
5 法国 FR
从日志中可以看到完整的SQL 输出和结果输出,从日志对应的级别可以发现SQL 、参数、结果数都是DEBUG 级别,具体的查询结果列和数据都是TRACE 级别。
通过一系列的操作,我们让一个简单的MyBatis 例子跑了起来,相信大家现在对MyBatis己经有了初步的了解。