MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
MyBatis中的全局配置文件定义了mybatis运行的一些配置和属性,以及使用的映射文件;XML映射文件可以由Resource类加载;运行mybatis程序需要获取SqlSessionFactory实例,该实例可由SqlSessionFactoryBuilder的方法来获取;获取SqlSessionFactory实例后可以打开SqlSession会话,利用SqlSession会话可执行数据库操作。
使用MyBatis有以下几个基本步骤:
(1)配置全局配置文件Configure.xml,指定sql映射文件
(2)定义测试表对应的类
(3)定义sql映射文件
(4)编写测试类测试MyBatis应用
接下来按照上述基本步骤测试MyBatis,给出一个简单的测试例子,需要预先安装配置好mysql,并启动mysql服务,安装和配置可见先前的文章(JDBC连接mysql-8.0实现增删改查)。Eclipse建立一个java project,工程视图如下:
(1)配置全局配置文件Configure.xml
配置文件如下,这里指定了properties、typeAliases、environments以及sql映射配置文件。properties有些属性通过标签方式定义,也有些通过mysql.properties定义,属性值可以在environments引用。
<?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>
<properties resource="config/mysql.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8"/>
<!-- 注意在xml中url的参数分割符需要使用&代替&,amp$还要以;分割,这是跟JDBC不一样的地方 -->
</properties>
<typeAliases>
<typeAlias alias="Stu" type="com.test.mybatis.Stu" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/test/mapper/StuMapper.xml" />
</mappers>
</configuration>
其中config/mysql.properties内容如下:
driver=com.mysql.cj.jdbc.Driver
(2)定义测试表对应的类,如下:
首先在mysql数据库中建立数据库test,然后在test中建一个表tbl_stu,插入两条数据,如下:
create database test;
use test;
create table tbl_stu(
id int NOT NULL ,
name varchar(32) ,
department varchar(64) ,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into tbl_stu values(1001, "kevin", "computer");
insert into tbl_stu values(1002, "angela", "account");
然后创建表对应的类Stu.java如下:
package com.test.mybatis;
public class Stu {
private int id ;
private String name;
private String department;
//无参构造方法
public Stu(){
}
//有参构造方法
public Stu(int id, String name, String deparment){
this.id = id;
this.name = name;
this.department = deparment;
}
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
public void setDepartment(String deparment){
this.department = deparment;
}
public int getID(){
return this.id;
}
public String getName(){
return this.name;
}
public String getDepartment(){
return this.department;
}
}
(3)定义sql映射文件StuMapper.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="com.test.mapper.StuMapper">
<select id="getStuById" parameterType="int" resultType="Stu">
select * from tbl_stu where id = #{id}
</select>
</mapper>
注意全局配置文件中的resource必须正确指向StuMapper.xml。
(4)编写测试类测试MyBatis应用MybatisTest.java
import java.io.IOException;
import java.io.InputStream;
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 com.test.mybatis.Stu;
public class MybatisTest {
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = null;
InputStream input = null;
SqlSession session = null;
//创建sqlSessionFactory
try {
input = Resources.getResourceAsStream("config/Configure.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
//得到SqlSession对象,执行查询操作
try{
session = sqlSessionFactory.openSession();
Stu stu = (Stu) session.selectOne("com.test.mapper.StuMapper.getStuById", 1002);
if(stu != null){
System.out.println("id: "+stu.getID());
System.out.println("name: "+stu.getName());
System.out.println("deparment: "+stu.getDepartment());
}
}finally{
session.close();
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试结果如下:
id: 1002
name: angela
deparment: account
总结:
MyBatis能够通过XML配置文件或者java注解将数据库中的记录,转换为JAVA对象,使得sql语句可以从java程序中剥离出来。以xml配置文件映射对象为例,映射文件定义了要执行的数据库语句,以及输入参数类型和输出参数类型(java类),在java程序中通过sqlSession可以传递参数执行数据库语句,并返回映射文件总指定的类对象,该对象中自定义解析类的方法,即能够最终得到数据库记录的数据信息。以XML映射为例,过程和原理如下:
(1)全局配置文件定义了一些数据库连接、用户、驱动属性,类别名,environment等参数,以及映射使用的XML文件;
(2)Resource类的静态getResourceAsStream方法,可以加载全局配置文件,获得一个InputStream流对象;
(3)SqlSessionFactoryBuilder的静态方法build(InputStream input)可以获取sqlFactory实例;
(4)sqlFactory实例的openSession()方法能够获取sqlSession实例,sqlSession有selectOne等操作数据库的方法,通过sqlSession可以传递参数并执行映射配置文件中指定的sql语句(通过映射文件中namespace和id确定执行的具体语句), 返回一个映射配置文件执行的对象;
(5)测试程序调用自定义实体类(映射返回的类)的方法,可以解析出数据库相应数据。