一、准备工作
1、创建数据库和表信息
DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis;
DROP TABLE IF EXISTS tbl_employee;
CREATE TABLE IF NOT EXISTS tbl_employee (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(255),
gender CHAR(1),
email VARCHAR(255)
)
INSERT INTO tbl_employee(`id`, `last_name`, `gender`, `email`) VALUES(1, 'Tom', 0, 'tom@126.com');
2、加入依赖
1 <dependency>
2 <groupId>org.mybatis</groupId>
3 <artifactId>mybatis</artifactId>
4 <version>3.4.1</version>
5 </dependency>
6 <dependency>
7 <groupId>mysql</groupId>
8 <artifactId>mysql-connector-java</artifactId>
9 <version>5.1.47</version>
10 </dependency>
11 <dependency>
12 <groupId>log4j</groupId>
13 <artifactId>log4j</artifactId>
14 <version>1.2.17</version>
15 </dependency>
16 <dependency>
17 <groupId>junit</groupId>
18 <artifactId>junit</artifactId>
19 <version>4.12</version>
20 </dependency>
3、创建对应的 JavaBean
4、添加 log4j 的配置文件,方便观看输出日志信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L)
"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
二、使用 MyBatis 操作数据库
1、创建 mybatis 全局配置文件
MyBatis 的全局配置文件包含了影响 MyBatis 行为甚深的设置( settings)和属性( properties)信息、如数据库连接池信息等。指导着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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 写好的 SQL 映射文件一定要注册到全局配置文件中 -->
<mappers>
<mapper resource="EmpMapper.xml"/>
</mappers>
</configuration>
2、创建 sql 映射文件
映射文件的作用就相当于是定义Dao接口的实现类如何工作。这也是我们使用MyBatis时编写的最多的文件。
<?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="EmpMapper">
<!--
namespace:名称空间
id:唯一标识
resultType:返回值类型
#{id} 从传递过来的参数中取出id值
-->
<select id="selectEmp" resultType="com.njf.mybatis.bean.Employee">
select id, last_name lastName, email, gender from tbl_employee where id = #{id}
</select>
</mapper>
3、测试
@Test
public void test1() throws IOException {
//1、获取 sqlSessionFactory 工厂
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
// sql的唯一标识:statement Unique identifier matching the statement to use.
// 执行SQL要用的参数:parameter A parameter object to pass to the statement.
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//根据方法 id 进行操作
Employee emp = sqlSession.selectOne("EmpMapper.selectEmp", 1);
System.out.println(emp);
} finally {
sqlSession.close();
}
}
运行结果:
4、小结
(1)根据xml配置文件(全局配置文件)创建一个 SqlSessionFactory 对象数据源一些运行环境的配置信息;
(2)SQL 映射文件,配置了每一个 SQL,以及 SQL 的封装规则等;
(3)将SQL映射文件注册在全局配置文件中
(4)操作步骤:
① 根据全局配置文件得到 sqlSessionFactory;
② 使用sqlSession工程,获取到 sqlSession 对象使用他来执行增删改查,一个 sqlSession 就是代表和数据库的一次会话,用完关闭;
③ 使用 SQL 的唯一标识来告诉 MyBatis 执行那个 SQL,SQL都在保存在 SQL 映射文件中;
三、面向接口编程
1、创建一个接口
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
2、根据接口创建 mapper 文件,并进行绑定
<?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.njf.mybatis.dao.EmployeeMapper">
<!--
namespace:名称空间,指定为接口的全类名
id:唯一标识,方法名
resultType:返回值类型
#{id} 从传递过来的参数中取出id值
-->
<select id="getEmpById" resultType="com.njf.mybatis.bean.Employee">
select id, last_name lastName, email, gender from tbl_employee where id = #{id}
</select>
</mapper>
3、在全局配置文件中注册 mapper 配置文件
<mappers>
<mapper resource="EmpMapper.xml"/>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
4、测试
public SqlSessionFactory getsqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
@Test
public void test2() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3、获取接口的实现类对象
/**
* 推荐使用
* 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法,会通过动态代理动态生成UserMapper的代理实现类
*/
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
System.out.println(employeeMapper);
System.out.println(employeeMapper.getClass());
Employee emp = employeeMapper.getEmpById(1);
System.out.println(emp);
} finally {
sqlSession.close();
}
}
运行结果:
可以看到是由 MyBatis 生成接口的代理对象来执行 SQL的。
四、使用步骤
(1)添加相关的依赖
(2)创建 MyBatis 的核心(全局)配置文件 mybatis-config.xml 并配置(用于连接数据库)
(3)创建mapper接口
(4)创建SQL映射文件XxxMapper.xml,并配置每一个SQL语句(用于操作数据库)
实现两个绑定:
① 接口全限定名要和映射文件的namespace保持一致;
② 接口中方法名和SQL语句的id保持一致;
(5)将SQL映射文件注册在全局配置文件中;
(6)获取mybatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类;
(7)测试使用
① 根据全局配置文件得到 SqlSessionFactory;
② 使用sqlSession工厂,获取到sqlSession对象使用它来执行增删改查,一个sqlSession就是代表和数据库的一次会话,用完关闭。
③ 使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
五、小结
1、面向接口编程
原生: Dao ========> DaoImplMybatis: Mapper ========> xxxMapper.xml
2、SqlSession 代表和数据库的一次会话,用完必须关闭。
3、SqlSession 和 Connection 一样都是非线程安全的,因此是不能被共享的。每次使用都应该去获取新的对象,所以不能声明为私有的成员变量(注意)。 SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的。
4、SqlSession可以直接调用方法的 id 进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作;
5、mapper 接口没有实现类,但是 Mybatis 会为这个接口生成一个代理对象,将接口和xml进行绑定。
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
6、两个重要的配置文件:
① Mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息;
② Sql映射文件:保存了每一个sql语句的映射信息,将SQL抽取出来;