数据持久层框架MyBatis
什么是数据持久层
将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
MyBatis简介
MyBatis 是一款持久层框架,支持定制化 SQL、存储过程以及高级映射。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1. Maven配置MyBatis依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactid>mybatis</artifactid>
<version>3.3.0</version>
</dependency>
<!-- 添加log4j依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- 添加log4j依赖-->
</dependencies>
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>
<typeAliases>
<package name="kuangfeng.mybatis.simple.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<property name=" " value=" "/>
</transactionManager>
<dataSource type="UNPOOLED">//UNPOOLED:不使用任何数据库连接池来管理数据库连接
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="admin" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis3/mappers/StudentMapper.xml" />
</mappers>
</configuration>
- configuration:声明在标签里面的信息是配置信息
- typeAliases:标签里面配置了包的别名,MyBatis中需要频繁的用到类的全限定名称,为了使用方便,配置kuangfeng.mybatis.simple.model包,这样配置后,在使用类的情况下不需要再写包名部分,只使用类名部分即可。
- environments:环境配置中主要配置类数据库的连接。数据库的url、用户名、密码。
3. 创建实体类和MyBatis和Mapper.xml文件
MyBatis是一个结果映射框架,创建的实体类实际上是一个数据对象(Date Value Object),在实际应用中,一个表对应一个实体,且称这个对象为一个实体类。
- 在src/main/java 下创建一个基础的包kuangfeng.mybatis.simple,再在这个包下面创建model包。
- 然后根据数据库的表,在model包下面创建相对应的实体类。例Student:
package kuangfeng.mybatis.simple.model;
public class Student{
private Long id;
private String name;
private String code;
//设置get和set方法
}
- 在src/main/resources下面创建kuangfeng/mybatis/simple/mapper目录 。然后在该目录下面创建StudentMapper.xml文件。添加如下内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- mapper 为根元素节点, 一个namespace对应一个dao,定义了当前xml的命名空间 -->
<mapper namespace="kuangfeng.mybatis.simple.Student">
<!-- <select>标签:所定义的一个select查询。-->
<!-- id:定义select查询的一个唯一的id。-->
<!-- resultType:定义了当前的返回值类,此处指实体类。如果没有配置别名,此处一个填写kuangfeng.mybatis.simple.model.Student-->
<select id="selectStudentById" resultType="Student">
select * from student where id = #{id} //查询sql语句
</select>
4. 配置Log4j
配置好Mapper.xml和实体类之后,配置Log4j让Mybatis在执行数据库操作的时候可以将执行的SQL和其它信息输出到控制台。
在src/main/resources下面创建log4j.properties配置文件。输入内容:
//全局配置,将等级为DEBUG的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。
//等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,
//如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,
log4j.rootLogger=DEBUG, stdout, R
//MyBatis配置,添加以上配置后,Log4J 就会记录 org.mybatis.example.Mapper 的详细执行操作,且仅记录应用中其它类的错误信息(若有)。
log4j.logger.kuangfeng.mybatis.simple.mapper = TRACE
//也可以将日志的记录方式从接口级别切换到语句级别,从而实现更细粒度的控制。如下配置只对 selectBlog 语句记录日志:
log4j.logger.kuangfeng.mybatis.simple.mapper.selectBlog=TRACE
//可以对一组映射器接口记录日志,只要对映射器接口所在的包开启日志功能即可:
log4j.logger.kuangfeng.mybatis.simple=TRACE
//控制台输出配置
log4j.appender.stdout = org.apache.log4j.ConsoleAppender(控制台)
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
5. 编写测试代码运行MyBatis
- 在src/test/java中创建kuangfeng.mybatis.simple.mapper包
- 创建StudentMapperTest测试类。创建StudentMapperTest测试类(部分jar包本文pom文件并未依赖,如果报错依赖一下就好了)。
public class StudentMapperTest{
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init (){
try {
//通过Resources工具类将mybatis-config.xml配置文件读入Reader
Reader reader = Resources .getResourceAsReader(”mybatis-config.xml”) ;
//
sqlSessionFactor y =new SqlSessionFactoryBuilder().build(reader);
reader . close ();}
catch (IOException ignore)
{ ignore .printStackTrace () ;
}
}
@Test
public void testfindStudentById(){
//通过SqlSessionFactory工厂对象获取一个SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//通过sqlSession的selectList查找到StudentMapper.xml中id=“selectStudentById”的方法,执行sql语句
List<Student> studentList = sqlSession.selectList (”selectStudentById” );
//MyBatis底层只用jdbc执行sql,查询结果集ResultSet后,根据resultType的配置,将结果映射为Student类型的集合,返回查询结果。
//查询结果为studentList,将其输出到控制台
printCountryList(studentList); }
finally {
//最后关闭sqlSession。避免连接没有关闭导致数据库连接过多造成系统崩溃
sqlSession.close() ;
}
}