Mybatis入门
MyBatis 入门
Editor:SimpleWu
MyBatis 简介#
- MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 。2013 年 11 月迁移到 Github。
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生 Map 使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的 Java 对象) 映射成数据库中的记录。
MyBatis 参考资料官网
http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis 下载地址
https://github.com/mybatis/mybatis-3
MyBatis 的优势#
- 开源的优秀的持久层框架
- SQL 语句与代码分离
- 面向配置的编程
- 良好支持复杂数据映射
- 动态 SQL
MyBatis 开发步骤#
1. 添加需要的 jar 包
1)mybatis-3.3.0 核心包(如果需要日志操作,可以导入依赖包)
2)数据库驱动(mysql-connector-java-5.1.22-bin)
2. 创建数据库,添加测试数据
create table `tal_employee` (
`id` int (11),
`last_name` varchar (360),
`email` varchar (300),
`gender` char (9)
);
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('1','韩信','hanxin@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('2','LiBaihH','libai@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('3','孙尚香','sunshangxiang@gemail.com','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('4','安琪拉','anqila@gemail.com','女');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('5','Hello','Hello@gemail.com','男');
INSERT INTO `tal_employee` (`id`, `last_name`, `email`, `gender`) VALUES('6','Miya','Miya@gemail.com','男');
3. 创建实体类
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
// 此处省略 get set toString。。。
}
4. 创建实体类映射配置文件
<?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="EmployeeMapper">
<!-- 定义一个查询方法 resultType 返回值类型 -->
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
select * from tal_employee
</select>
</mapper>
5. 创建 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>
<!-- 配置环境 default 默认使用环境名字 -->
<environments default="development">
<!-- 配置一个环境 -->
<environment id="development">
<!-- 使用事务 JDBC 事务管理器 -->
<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>
<!-- 加载映射 -->
<mappers>
<mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
</mappers>
</configuration>
编写代码见下文
获取 SqlSessionFactory 对象#
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
// 读取 mybatis 主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
/**
* 实例化 SqlSessionFactory
* 如果没有指定默认环境,可以在这里指定使用的环境 ID,比如我先在有个 DEV 环境
* sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"DEV");
* 我这里已经使用了默认环境所以我就不用这种方式创建了
*/
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
访问数据库#
获取 SqlSession 对象,作用于与数据库的一次回话作用于与数据库的一次回话
SqlSession session = sqlSessionFactory.openSession();
获取所有员工记录
EmployeeMapper 就是我们实体类映射文件的命名空间,findAll 就是我们 select 标签的 ID
List<Employee> employees = session.selectList("EmployeeMapper.findAll");
for (Employee employee : employees) {
System.out.println(employee);
}
访问结果:
Employee [id=1, lastName=null, email=hanxin@gemail.com, gender=男]
Employee [id=2, lastName=null, email=libai@gemail.com, gender=男]
Employee [id=3, lastName=null, email=sunshangxiang@gemail.com, gender=女]
Employee [id=4, lastName=null, email=anqila@gemail.com, gender=女]
Employee [id=5, lastName=null, email=Hello@gemail.com, gender=男]
Employee [id=6, lastName=null, email=Miya@gemail.com, gender=男]
在这里我们访问数据库是正常的,为什么 lastName 为空呢?
解决表字段与类属性名不对应#
原因:应为我们这里实体类上的属性叫做 lastName 与数据库列 last_name 名字不对应所以获取的值为空
解决方案 1:将实体类映射文件的中 select 标签中的取别名
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
select id,last_name AS lastName,email,gender from tal_employee
</select>
解决方案 2:在 mybatis 主配置文件中配置驼峰式命名,需要将配置排在前面否则 XML 报错
<settings>
<!-- 开启驼峰式命名规则 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
使用方案 2 我们类中属性 lastName 会匹配数据库字段 last_name
使用日志查看 SQL 语句等#
首先我们需要添加 mybatis 依赖包
添加 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 [%t] %-5p [%c] - %m%n
#设置 MyBatis 的输出内容
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
这样我们就可以使用 log4j 来查看我们的 sql 语句啊,传入的参数啊。。等等
MyBatis 的配置文件#
- 通过前面简单的 MyBatis 案例,大家应该了解到了 MyBatis 框架的基本结构,和 Hibernate 一样,MyBatis 包含了一个核心配置文件和映射文件。
- 核心配置文件 (mybatis-config.xml):包含了对 Mybatis 的核心配置,包含连接池信息,事务,加载映射文件,参数设置等配置。
- 映射文件 (EmployeeMapper.xml):主要实现实体对象对数据库的映射,关联关系,Sql 语句等。
核心配置文件#
标签 | 说明 |
---|---|
配置环境 | |
一些外部属性,这些属性可以被替换 | |
Mybatis 中极为重要的调整设置,会改变 Mybatis 的默认行为。 | |
为 Java 类型设置一个别名,它只和 xml 配置有关。 | |
映射器,加载 MyBatis 的映射文件。 | |
插件,Mybatis 允许用户在映射的某一点进行拦截。 |
环境配置#
- Mybatis 可以通过配置多种环境,比如开发环境、测试环境和生产环境等。
- 不过要记住,尽管可以配置多个环境,但是 SqlSessionFactory 对象只能加载一个。如果你需要同时连接多个数据库,需要创建多个 SqlSessionFactory 实例。
事务管理#
在 MyBatis 来进行事务的设置,其中有两种类型的事务管理器。
- JDBC:这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
- MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
数据源#
使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。有三种数据源类型
- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来, 避免了创建新的连接实例时所必需的初始化和认证时间。
- JNDI:使用 JNDI 在外部配置数据源。
properties 标签#
properties 为外部属性,比如数据库连接信息可以配置到一个单独的 properties 文件中,然后在 xml 中进行引入。
添加一个 db.properties 文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
在 mybatis 主配置文件中引用
<properties resource="db.properties" />
<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>
映射器#
通常 MyBatis 中将映射关系(非必须)和 SQL 语句写入到映射文件中,在配置文件中需要手动进行加载映射文件。加载映射文件使用进行加载。Mybatis 中有 4 种加载方式。
1. 使用 resource,加载 classpath 路径进行加载。
<mappers>
<mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml"/>
</mappers>
2. 使用 url 路径进行加载。
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
3. 使用 calss 进行加载,注解方式。
<!– 加载class类-->
<mappers>
<mapper class="使用注解的全类名"/>
</mappers>
4. 使用 package 进行加载,注解方式。
<!– 加载某个包下的所有class文件-->
<mappers>
<package name="com.simple.mybatis.entitys"/>
</mappers>
别名的使用#
之前,我们在 sql 映射 xml 文件中的引用实体类时,resultType 需要写上实体类的全类名 (包名 + 类名),如下:
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
select id,last_name AS lastName,email,gender from tal_employee
</select>
在 mybatis 主配置文件中加入
<typeAliases>
<typeAlias type=“com.simple.mybatis.entitys.Employee" alias="Employee"/>
</typeAliases>
这样在 resultType 中就可以直接使用 Employee 类型了。这个别名是不区分大小写的。