一、简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、下载
原是Apache的一个开源项目iBatis, 2010年6月这 个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis ,代码于 2013年11月迁移到Github。
1、下载地址:https://github.com/mybatis/mybatis-3
2、版本选择
mybatis-3.4.6.zip 包括用到的jar包、文档doc
source code 则是源代码
三、HelloWorld
整体项目架构:
1、数据库准备
MySQL数据库:新建employee表,并建立对应的JavaBean
CREATE TABLE `employee` (
`employee_id` int(6) NOT NULL AUTO_INCREMENT,
`first_name` varchar(20) DEFAULT NULL,
`last_name` varchar(25) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
`phone_number` varchar(20) DEFAULT NULL,
`hire_date` date DEFAULT NULL,
`job_id` varchar(10) DEFAULT NULL,
`salary` decimal(8,2) DEFAULT NULL COMMENT '工资',
`manager_id` int(6) DEFAULT NULL,
`department_id` int(6) DEFAULT NULL,
PRIMARY KEY (`employee_id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8;
2、环境搭建
maven新建一个简单工程,引入以下依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- 数据库连接池、驱动 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1</version>
</dependency>
<!-- 日志 -->
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3、配置文件
1、数据库配置信息文件
新建dbConfig.properties文件,填入MySQL驱动信息。
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf8
mysql.username=root
mysql.password=root
2、MyBatis全局配置文件
新建mybatis-config.xml配置文件,导入dbConfig.properties配置文件、配置environments环境、数据源dataSource,引入mapper文件。
<?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>
<!-- mybatis可以使用properties来引入外部properties配置文件的内容;
resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 -->
<properties resource="dbConfig.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="mapper/EmployeeMapper.xml" />
</mappers>
</configuration>
3、SQL的mapper文件
创建上述的mapper文件:mapper/EmployeeMapper.xml。
其中namespace可以自定义,在这里指定为com.starfall.mybaits.dao.EmployeeMapper
<?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.starfall.mybaits.dao.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
-->
<select id="selectEmployee" resultType="com.starfall.mybaits.entity.Employee">
SELECT
employee_id AS employeeId,
first_name AS firstName,
last_name AS lastName,
email AS email,
phone_number AS phoneNumber,
hire_date AS hireDate,
job_id AS jobId,
salary AS salary,
manager_id AS managerId,
department_id AS departmentId
FROM
employee
WHERE
employee_id = #{employeeId}
</select>
</mapper>
4、日志信息
新建log4j.properties配置文件
log4j.rootLogger=DEBUG,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m %n
日志配置文件参考:https://blog.csdn.net/shaohe18362202126/article/details/84667631
4、运行测试
public class HelloWorldTest {
@Test
public void testHelloWorld() throws IOException {
/**
* 1、从 XML 中构建 SqlSessionFactory <br>
* 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory
* 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从
* XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
*/
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/**
* 2、从 SqlSessionFactory 中获取 SqlSession<br>
* 既然有了 SqlSessionFactory ,顾名思义,我们就可以从中获得 SqlSession 的实例了。SqlSession
* 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
*/
SqlSession session = sqlSessionFactory.openSession();
try {
// selectOne参数:sql的唯一标识,执行sql要用的参数
Employee employee = session.selectOne("com.starfall.mybaits.dao.EmployeeMapper.selectEmployee", 120);
System.out.println(employee);
} finally {
// 一个sqlSession就是代表和数据库的一次会话,用完关闭
session.close();
}
}
}
四、接口式编程
上述查询的方法需要获取mapper文件的唯一标示:com.starfall.mybaits.dao.EmployeeMapper.selectEmployee
诚然这种方式能够正常工作,并且对于使用旧版本 MyBatis 的用户来说也比较熟悉,不过现在有了一种更直白的方式。使用对于给定语句能够合理描述参数和返回值的接口。
创建一个接口,没有实现类。里面的查询方法和mapper文件中的查询du
public interface EmployeeMapper {
Employee selectEmployee(Integer employeeId);
}
@Test
public void testInterface() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
Employee employee = mapper.selectEmployee(121);
System.out.println(employee);
} finally {
session.close();
}
}
将接口和xml进行绑定:
xml文件的namespace的值为接口的全类名,xml中select的id和接口中方法的名称相同。
org.apache.ibatis.binding.MapperProxy@103f852
com.sun.proxy.$Proxy5
五、小结
1、SqlSession代表和数据库的一次会话;用完必须关闭;
2、SqlSession和connection一样都是非线程安全。每次使用都应该去获取新的对象。
3、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象:
*六、引入dtd约束
为mybatis的全局配置文件引入dtd的xml约束。
1、找到下载的mybatis的jar包,或者在本地的maven仓库中找到该jar
2、使用压缩软件打开路径:mybatis-3.4.6.jar\org\apache\ibatis\builder\xml
解压mybatis-3-config.dtd、mybatis-3-mapper.dtd两个文件:
解压的文件放到项目的资源目录下:
3、再去到HelloWorld中复制mybatis全局配置文件的dtd链接:"http://mybatis.org/dtd/mybatis-3-config.dtd"
4、配置eclipse的dtd位置和URL
打开eclipse:Window ——> Preferences ——> XML ——> XML Catalog
点击Add,location选择解压的文件所放的项目资源路径。Key type选择URL。key为复制的mybatis的全局配置文件的链接。
注意:key中的链接指定的是config文件和location选中的config文件相对应,名称相同。
5、重新再eclipse中打开全局配置文件,会有xml的提示:
SQL的mapper文件设置和上述步骤一致。