一、MyBatis 快速入门
1.1 MyBatis简介
1.1.1 传统JDBC开发的弊端
传统的JDBC开发如下步骤如下:
- 1)注册驱动
- 2)获取连接(Connection)
- 3)获取语句对象(Statement、PreaparedStatement)
- 4)获取结果集(ResultSet)
- 5)封装到JavaBean(非常麻烦)
- 6)释放资源
public class Demo01 {
public static void main(String[] args) throws SQLException {
// 1、加载和注册驱动(jdbc4以后不需要)
// Class.forName("com.mysql.jdbc.Driver");
// 2、使用用户名、密码、URL得到连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db04", "root", "admin");
// 3、创建语句对象
Statement statement = conn.createStatement();
// 4、执行SQL语句,返回结果集
ResultSet rs = statement.executeQuery("select * from dept inner join user on d.id=user.dept_id");
//遍历结果集
while (rs.next()) {
// 取出每一行的数据,封装到JavaBean中
}
//释放资源
rs.close();
statement.close();
conn.close();
}
}
我们之前一直使用的是JDBC来操作数据,存在如下几个问题:
- 1)步骤太过繁琐,每一次的SQL语句执行都需要重复上面几个步骤
- 2)SQL语句存在硬编码,SQL语句和Java代码耦合在一起,如果SQL语句变动需要修改源代码,重新编译、发布
- 3)结果集处理太过繁琐,需要一个一个手动设置值,在列数非常多的情况下,非常麻烦
- 4)无法建立关系映射,如一对多、多对多等关系无法建立,例如一个部门里面有很多员工,查询出来的数据无法自动映射到部门里面的员工,只能自己手动映射
- 5)实现动态SQL非常麻烦,如果SQL语句是根据前端传递的参数动态的变化,那么我们需要编写很多个if条件来实现不同的SQL语句生成;
- 6)频繁创建和释放数据库连接对象,非常容易造成系统资源的浪费,我们可以使用连接池(数据源)等技术来帮我们实现,MyBatis自带数据源;
1.1.2 MyBatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
MyBatis是对JDBC的封装,让我们操作数据库更加的方便、快捷,而不需把时间和精力浪费在如何封装结果集、如何注册驱动、如何获取连接上面;
总而言之,MyBaits就是用于简化我们DAO层的开发、在此之外还提供其他一些高级特性,例如动态SQL、一级缓存、二级缓存、日志管理、多表级联查询、批处理等
MyBatis官网:https://mybatis.org/mybatis-3/zh/index.html
Github官网:https://github.com/mybatis/mybatis-3/releases
1.2 MyBatis环境搭建
1.2.1 创建测试表
create database test;
use test;
drop table if exists emp;
CREATE TABLE `emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工姓名',
`age` int(11) NULL DEFAULT NULL COMMENT '员工年龄',
`addr` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯',
`salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪资',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 ;
INSERT INTO `emp` VALUES (1, '张三', 20, '广西来宾', 7600.00);
INSERT INTO `emp` VALUES (2, '李四', 22, '浙江绍兴', 6800.00);
INSERT INTO `emp` VALUES (3, '小明', 25, '广东云浮', 6600.00);
INSERT INTO `emp` VALUES (4, '小红', 23, '河南信阳', 7000.00);
INSERT INTO `emp` VALUES (5, '张明', 25, '山东临沂', 8000.00);
1.2.2 搭建项目
1)引入依赖
<?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.dfbz</groupId>
<artifactId>01_MyBatis_快速入门</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!--日志依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试单元-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
</project>
2)实体类
package com.dfbz.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lscl
* @version 1.0
* @intro:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private Integer id;
private String name;
private Integer age;
private String addr;
private Double salary;
}
3)创建MyBatis核心配置文件
在resources目录下创建一个配置文件(名称随意):
<?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>
</configuration>
有的人这里会识别不到约束,按住Alt+Enter
键:
配置文件如下:
<?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>
<!--日志配置-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- default 默认使用那个运行环境 -->
<environments default="dev">
<!--配置dev运行环境-->
<environment id="dev">
<!--事务管理器:JDBC事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--POOLED指定采用mybatis内置的连接池支持-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=UTF8"></property>
<property name="username" value="root"></property>
<property name="password" value="admin"></property>
</dataSource>
</environment>
</environments>
</configuration>
4)IDEA配置代码模板
我们在使用MyBatis时,都要创建一个MyBatis的核心配置文件,然后写上上面的配置,为此我们可以配置一个代码模板;
再次打开右键菜单,发现多了一个MyBatisConfig选项:
1.2.3 dao接口
package com.dfbz.dao;
/**
* @author lscl
* @version 1.0
* @intro:
*/
import com.dfbz.entity.Emp;
import java.util.List;
public interface EmpDao {
List<Emp> findAll();
}
1.2.4 接口映射文件
在与Dao接口的同级目录下创建个映射文件:EmpDao.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">
<!--namespace 名称空间,指定对哪个接口进行映射-->
<mapper namespace="com.dfbz.dao.EmpDao">
<!--
select 表示执行查询sql
id 唯一; 必须与接口中方法名称一致。
resultType 表示执行查询SQL封装的实体类对象。如果放回集合,只需要指定集合中元素的类型即可。
标签体中存放要执行的select语句
-->
<select id="findAll" resultType="com.dfbz.entity.Emp">
select * from emp
</select>
</mapper>
Tips:使用之前同样的方法,创建一个代码模板,保存上述的代码;
1.2.5 加载接口映射文件
<mappers>
<!--加载mapper映射文件-->
<mapper resource="com/dfbz/dao/EmpDao.xml"></mapper>
</mappers>
1.3 测试类
- 测试代码:
package com.dfbz.demo;
import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Emp;
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 org.junit.Test;
import java.io.InputStream;
import java.util.List;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01_快速入门测试 {
@Test
public void test1() throws Exception {
// 1. 加载mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
// 2. 根据核心配置文件创建一个SqlSession工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(is);
// 3. 使用工厂对象创建SqlSession
SqlSession session = sessionFactory.openSession();
// 4. 通过session获取对应的Mapper对象
EmpDao empDao = session.getMapper(EmpDao.class);
// 5. 调用方法执行查询
List<Emp> userList = empDao.findAll();
for (Emp emp : userList) {
System.out.println(emp);
}
is.close();
session.close();
}
}