一、MyBatis概述及配置
1.1 简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis 通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL 的结果映射成Java 对象返回。
1.2 引入MyBatis
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
1.3 配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档结构图下所示:
configuration(配置):整个配置文件的顶级标签。
- properties(属性):该标签可以引入外部配置的属性,也可以自己配置。该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性。
- settings(设置):用来配置一些改变运行时行为的信息。例如是否使用缓存机制,是否使用延迟加载,是否使用错误处理机制等。并且可以设置最大并发请求数量、最大并发事务数量,以及是否启用命名空间等。
- typeAliases(类型别名):用来设置一些别名来替代Java的长类型声明(如: java.lang.int变为int),减少配置编码的冗余。
- typeHandlers(类型处理器):将SQL中返回的数据库类型转换为相应的Java类型的处理器配置。
- objectFactory(对象工厂):实例化目标类的工厂类配置。
- plugins(插件):可以通过插件修改MyBatis的核心行为,例如对语句执行的某一点进行拦截调用。
- environments(环境配置):数据库环境信息的集合。在一个配置文件中,可以有多种数据库环境集合,这样可以使MyBatis将SQL同时映射至多个数据库。
- environment(环境变量):数据库环境配置的详细配置。
- transactionManager(事务管理器):指定MyBatis的事务管理器。
- dataSource(数据源):使用其中的type指定数据源的连接类型,在标签对中可以使用property属性指定数据库连接池的其他信息。
- environment(环境变量):数据库环境配置的详细配置。
- databaseIdProvider(数据库厂商标识)
- mappers(映射器):配置SQL映射文件的位置,告知MyBatis去哪里加载SQL映射配置。
二、示例
以一个简单的例子,展示MyBatis的配置。
2.1 创建Maven项目,导入相关依赖
pom.xml依赖如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--导入数据库驱动,我用的mysql 8.0.16 版本的-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
2.2 Mybatis 的主配置文件
<?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="com.wyf.mybatis"/>
</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/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CountryMapper.xml"/>
</mappers>
</configuration>
- <typeAliases>元素下面配置了一个包的别名,通常确定一个类的时候需要使用类的全限定名称,例如com.wyf.mybatis.Country。在MyBatis 中需要频繁用到类的全限定名称,为了方便使用,我们配置了 com.wyf.mybatis 包,这样配置后,在使用类的时候不需要写包名的部分,只使用Couηtry 即可。
- <environments>环境配置中主要配置了数据库连接,数据库的 url 为jdbc:mysql://localhost:3306/mybatis,使用的是本机MySQL 中的 mybatis数据库,后面的username 和password分别是数据库的用户名和密码。
- <mappers>中配置了一个包含完整类路径的CountryMapper.xml,这是一个MyBatis 的SQL 语句和映射配置文件。
2.3 创建实体类和xml映射文件
MyBatis 是一个结果映射框架,这里创建的实体类实际上是一个数据值对象(Data Value Object),在实际应用中, 一个表一般会对应一个实体,用于INSERT、 UPDATE、 DELETE 和简单的SELECT 操作。
根据数据库表country,在包下创建实体类Country,如下所示:
package com.wyf.mybatis;
public class Country {
private Long id;
private String countryname;
private String countrycode;
public Long getId() {
return id;
}
public String getCountryname() {
return countryname;
}
public String getCountrycode() {
return countrycode;
}
public void setId(Long id) {
this.id = id;
}
public void setCountryname(String countryname) {
this.countryname = countryname;
}
public void setCountrycode(String countrycode) {
this.countrycode = countrycode;
}
}
创建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="CountryMapper">
<select id="selectAll" resultType="Country">
select id,countryname,countrycode from country
</select>
</mapper>
SQL 定义在CountryMapper.xml 文件中,里面的配置作用如下:
- <mapper> : XML 的根元素, 属性ηamespace 定义了当前XML 的命名空间。
- <select>元素:我们所定义的一个SELECT 查询。
- id 属性:定义了当前SELECT 查询的唯一一个i d。
- resultType:定义了当前查询的返回值类型,此处就是指实体类 Country,前面配置中提到的别名主要用于这里,如果没有设置别名,此处就需要写成resultType=”com. wyf. mybatis.Country” 。
- select id,countryname,countrycode from country;为sql查询语句
2.4 测试代码
public class AppTest
{
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() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
List<Country> countryList = sqlSession.selectList("selectAll");
printCountryList(countryList);
}finally {
//关闭sqlSession
sqlSession.close();
}
}
/**
* 打印数据库内容
* @param countryList
*/
private void printCountryList(List<Country> countryList) {
for(Country country:countryList){
System.out.println(country.getId()+" "+country.getCountryname()+" "+country.getCountrycode());
}
}
}
说明:
- 通过Resources 工具类将mybatis-config.xml 配置文件读入Reader。
- 通过SqlSessionFactoryBuilder 建造类使用Reader 创建SqlSessionFactory工厂对象。在创建SqlSessionFactory对象的过程中, 首先解析mybatis-config.xml 配置文件,读取配置文件中的mappers配置后会读取全部的Mapper. xml 进行具体方法的解析,在这些解析完成后, SqlSessionFactory 就包含了所有的属性配置和执行SQL 的信息。
- 使用时通过SqlSessionFactory 工厂对象获取一个SqlSession
- 通过SqlSession 的selectList 方法查找到CounntryMapper.xml 中id=”selectAll”的方法,执行SQL 查询。
- MyBatis 底层使用JDBC 执行SQL,获得查询结果集ResultSet后,根据resultType的配置将结果映射为Country类型的集合, 返回查询结果。
- 这样就得到了最后的查询结果countryList,简单将结果输出到控制台。
- 最后一定不要忘记关闭 SqlSession,否则会因为连接没有关闭导致数据库连接数过多,造成系统崩旗。
三、结束
本文简单介绍了MyBaties,并给出了一个简单的配置示例。