MyBatis框架映射文件配置以及配置文件详解

什么是 MyBatis ?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis的 Git 代码库

环境

idea
jdk
maven
MySQL

alia_SQL.sql 创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- 创建数据库alia
CREATE DATABASE alia;
USE alia;
-- 供应商表
CREATE TABLE alia_provider(
id INT(20) AUTO_INCREMENT PRIMARY KEY,
proCode VARCHAR(20),
proName VARCHAR(20),
proDesc VARCHAR(50),
proContact VARCHAR(20),
proPhone VARCHAR(20),
proAddress VARCHAR(50),
proFax VARCHAR(20),
createdBy INT(20),
creationDate DATETIME,
modifyBy INT(20),
modifyDate DATETIME
);

INSERT INTO `alia_provider`(`id`,`proCode`,`proName`,`proDesc`,`proContact`,`proPhone`,`proAddress`,`proFax`,`createdBy`,`creationDate`,`modifyDate`,`modifyBy`) VALUES (1,'BJ_GYS001','北京三木堂商贸有限公司','长期合作伙伴,主营产品:茅台、五粮液、郎酒、酒鬼酒、泸州老窖、赖茅酒、法国红酒等','张国强','13566667777','北京市丰台区育芳园北路','010-58858787',1,'2013-03-21 16:52:07',NULL,NULL);
INSERT INTO `alia_provider`(`id`,`proCode`,`proName`,`proDesc`,`proContact`,`proPhone`,`proAddress`,`proFax`,`createdBy`,`creationDate`,`modifyDate`,`modifyBy`) VALUES (2,'HB_GYS001','石家庄帅益食品贸易有限公司','长期合作伙伴,主营产品:饮料、水饮料、植物蛋白饮料、休闲食品、果汁饮料、功能饮料等','王军','13309094212','河北省石家庄新华区','0311-67738876',1,'2016-04-13 04:20:40',NULL,NULL);

SELECT * FROM alia_provider;

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>com</groupId>
<artifactId>MyBiatisLink</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>

</project>

MybatisUtil 创建访问数据库得到session对象工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.util;

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 java.io.IOException;
import java.io.InputStream;

/**
* @author James
*/
public class MybatisUtil {
private static SqlSessionFactory sessionFactory;

static {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}


public static SqlSession getSession() {
//true为自动提交事务
return sessionFactory.openSession(false);
}
}

Provider 数据库对应的实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.entity;

import java.util.Date;

/**
* @author James
*/
public class Provider {
private Integer id;
private String proCode;
private String proName;
private String proDesc;
private String proContact;
private String proPhone;
private String proAddress;
private String proFax;
private Integer createdBy;
private Date creationDate;
private Integer modifyBy;
private Date modifyDate;

@Override
public String toString() {
return "Provider{" +
"id=" + id +
", proCode='" + proCode + '\'' +
", proName='" + proName + '\'' +
", proDesc='" + proDesc + '\'' +
", proContact='" + proContact + '\'' +
", proPhone='" + proPhone + '\'' +
", proAddress='" + proAddress + '\'' +
", proFax='" + proFax + '\'' +
", createdBy=" + createdBy +
", creationDate=" + creationDate +
", modifyBy=" + modifyBy +
", modifyDate=" + modifyDate +
'}';
}
// 省略getter and setter部分代码
}

ProviderDao 创建实现访问数据库的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.dao;

import com.entity.Provider;

import java.util.List;

/**
* @author James
*/
public interface ProviderDao {
/**
* 获取供应商列表
*
* @return List<Provider>
*/
List<Provider> getProviderList();

/**
* 按名称获取供应商
*
* @param provider {@link Provider}
* @return List<Provider>
*/
List<Provider> getProviderByName(Provider provider);
}

Provider.xml Provider对象与数据库的映射文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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">
<!--namespace mapper接口 必填 随便填值 防止SQL语句ID重名-->
<mapper namespace="com.dao.ProviderDao">
<!--resultType 返回类型 实体类全限定类名-->

<!--为一个Java类型命名一个别名 aliasProvider-->
<select id="getProviderList" resultType="aliasProvider">
SELECT * FROM alia_provider
</select>

<!--为 com.entity 包 全部Java类型命名一个别名 别名为Java类名-->
<!--ProviderDao 参数为对象 得到对象的属性值方式 #{对象的属性值}-->
<select id="getProviderByName" resultType="Provider">
SELECT * FROM alia_provider WHERE proName LIKE CONCAT('%',#{proName},'%')
</select>

</mapper>

datebase.properties 数据库配置文件

有需要可以加上配置文件,或者直接将数据填到 MyBatis上下文配置 mybatis-config.xml 中

1
2
3
mysql.username=root
mysql.password=123456
db=alia

mybatis-config.xml 连接数据库的MyBatis上下文配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?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>
<!--可以配置在Java属性配置文件中 用 ${键值}-->
<properties resource="db.properties">
<!--可以配置键值对属性在这里而不用配置文件-->
<property name="mysql.driver" value="com.mysql.jdbc.Driver"/>
<property name="mysql.url" value="jdbc:mysql://localhost:3306/"/>
</properties>
<!--为Java类型命名一个别名 alias 用于 mappers.xml 的 resultType 直接调用 不用写全限定类名-->
<typeAliases>
<!--为一个Java类型命名一个别名-->
<typeAlias type="com.entity.Provider" alias="aliasProvider"/>
<!--为 com.entity 包 全部Java类型命名一个别名 别名为Java类名-->
<package name="com.entity"/>
</typeAliases>
<!--环境-->
<environments default="development">
<!--环境变量-->
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源-->
<dataSource type="POOLED">
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
<property name="driver" value="${mysql.driver}"/>
<!--MySQL数据库-->
<property name="url" value="${mysql.url}${db}"/>
</dataSource>
</environment>
</environments>
<!--映射器-->
<mappers>
<!--实体类映射-->
<mapper resource="com/entity/Provider.xml"/>
</mappers>
</configuration>

Test 测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.test;

import com.dao.ProviderDao;
import com.entity.Provider;
import com.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

/**
* @author James
*/
public class Test {
public static void main(String[] args) {
SqlSession session = MybatisUtil.getSession();
// 直接去 Mapper.xml 得到数据访问数据库 参数为 namespace.id
List<Provider> objects = session.selectList("com.dao.ProviderDao.getProviderList");
for (Provider provider : objects) {
System.out.println(provider);
}

System.out.println("-----------------------------面向对象的方式访问数据库-----------------------------");

// 面向对象的方式访问数据库
ProviderDao providerDao = session.getMapper(ProviderDao.class);
objects = providerDao.getProviderList();
for (Provider provider : objects) {
System.out.println(provider);
}

System.out.println("-----------------------------ProviderDao接口带参数 实现带参数查询-----------------------------");

Provider p = new Provider();
p.setProName("石");
objects = providerDao.getProviderByName(p);
for (Provider provider : objects) {
System.out.println(provider);
}

// 关闭会话
session.close();
}
}

点击下载案例