MyBatis
框架(一)
MyBatis
简介
1)MyBatis
是支持定制话SQL、存储过程以及高级映射的优秀的持久化层框架。
2)MyBatis
避免了几乎所有的JDBC
代码和手动设置参数以及获取结果集。
3)MyBatis
可以使用简单的XML或注解用于配置和原始映射,将接口和Java
的POJO
(Plain Ordinary Java Object
,普通的Java
对象)映射成数据库中的记录。
4)MyBatis
是一个半自动的ORM
(Object Relation Mapping
)框架。
一、为什么要使用MyBatis
(现有持久化技术的对比)
1.1 JDBC
①SQL
夹在Java
代码块里,耦合度高导致硬编码内伤
②维护不易且实际开发需求中sql
有变化,频繁修改的情况多见
1.2 Hibernate
和JPA
①长难复杂SQL
,对于Hibernate
而言处理也不容易
②内部自动生产SQL
,不容易做特殊优化
③基于全映射的全自动框架,大量字段的POJO
进行部分映射时比较困难。导致数据库性能下降
1.3 MyBatis
①对开发人员而言,核心SQL
还是需要自己优化
②SQL
和Java
编码分开,功能边界清晰,一个专注业务、一个专注数据。
二、HelloWorld
案例
本案例简单搭建一个使用
MyBatis
框架的实用
2.1 项目整体预览
2.2 开发环境的准备
2.2.1 导入jar
包
2.2.2 EmployeeMapper.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">
<mapper>
</mapper>
2.2.3 log4j.xml
此时
log4j.xml
会有报错不必理会
<?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) \n" />
</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>
2.2.4 mybatis-config.xml
<?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">
<!--MyBatis的全局配置文件-->
<configuration>
</configuration>
2.2.5 db.properties
username=root
password=123456
url=jdbc:mysql://localhost:3306/mybatis
driver=com.mysql.jdbc.Driver
2.2.6 数据库文件
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `departments`;
CREATE TABLE `departments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
insert into `departments`(`id`,`name`) values
(1,'教学部'),
(2,'教务部'),
(3,'运营部'),
(4,'咨询部'),
(5,'就业部');
DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`last_name` varchar(100) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`salary` double(11,2) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `dept_id` (`dept_id`),
CONSTRAINT `employees_ibfk_1` FOREIGN KEY (`dept_id`) REFERENCES `departments` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
insert into `employees`(`id`,`last_name`,`email`,`salary`,`dept_id`) values
(1,'HanZong','hybing@atguigu.com',30000.00,1),
(2,'Mayun','mayun@alibaba.com',20000.00,2),
(3,'Mahuateng','mahuateng@qq.com',10000.00,3);
2.3 案例搭建
2.3.1 实体类
public class Employee {
private Integer id;
private String lastName;
private String email;
private Double salary;
private Integer deptId;
//构造方法...(无参,有参)
//get set方法
//toString方法
}
2.3.2 Mapper
接口类
public interface EmployeeMapper {
//根据id获取员工信息
Employee getEmployeeById(Integer id);
}
2.3.3 mybatis-config.xml
配置
<!--MyBatis的全局配置文件-->
<configuration>
<!--1.properties标签:可以通过引入外部属性文件配置数据源-->
<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>
<!--mappers标签:用来注册SQL映射文件(Mapper映射文件)-->
<mappers>
<mapper resource="com/mybatis/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
2.3.3 EmployeeMapper.xml
配置
<!--
创建接口对应的SQL映射文件(Mapper映射文件)
namespace属性:指定为接口的全类名
-->
<mapper namespace="com.mybatis.mapper.EmployeeMapper">
<!--
id属性:指定为接口中方法的名字
resultType属性:指定为方法返回值的类型
-->
<select id="getEmployeeById" resultType="com.mybatis.entities.Employee">
select id,last_name lastName,email,salary,dept_Id deptId
from employees
where id = #{id}
</select>
</mapper>
2.3.4 Test
测试类
//获取SqlSessionFactory
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testGetEmployeeById() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employeeById = mapper.getEmployeeById(1);
System.out.println(employeeById);
} finally {
sqlSession.close();
}
}
运行结果
2.4 总结
简单的案例简单运用了一下
mybatis
在下一篇文章中会更深层次的介绍mybatis
的配置
案例代码以有不完整的可以下载源代码,(源代码中有更为完全的注释)
源代码mybatis01_eg.zip