前言:
什么是MyBatis
MyBatis 是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
简单来说,MyBatis是一个实现了数据持久化的开源框架,支持三种语言的实现,Java,.NET以及Ruby。当然我们这里讲的是Java的使用,所以可以将MyBatis理解为一个JDBC的封装框架。
我们知道Java开发经常使用到的另外一个JDBC封装框架是Hibernate,那么MyBatis和Hibernate之间有什么区别和共同点呢?
MyBatis和Hibernate都是ORM框架。
MyBatis是”半自动化”的ORM实现,这里的”半自动化”,是相对Hibernate提供了全面的数据库封装机制的”全自动化”ORM实现而言,”全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。
而MyBatis的关注点,在于POJO与SQL之间的映射关系。
MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis可以使用简单的XML或注解用于配置和原始映射,通过接口将JavaBean映射成数据库中的记录。
MyBatis的优点:
与JDBC相比,减少了50%以上的代码量。
MyBatis是最简单的持久化框架,小巧并且简单易学。
MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。
4. 提供XML标签,支持编写动态SQL语句。
5. 提供映射标签,支持对象与数据库的ORM字段关系映射。
MyBatis框架的缺点:
SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
MyBatis框架适用场合:
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。
快速入门
1.搭建环境,pom.xml配置依赖jar包。
dependency
groupIdorg.mybatis/groupId
artifactIdmybatis/artifactId
version3.4.5/version
/dependency
dependency
groupIdmysql/groupId
artifactIdmysql-connector-java/artifactId
version5.1.25/version
/dependency
2.新建数据表。
create table t_user(
id int primary key auto_increment,
username varchar(11),
password varchar(11),
age int
)
3.创建对应的实体类User。
public class User{
private int id;
private String username;
private String password;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
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"
configuration
!-- 配置MyBatis运行环境 --
environments default="development"
environment id="development"
!-- 配置JDBC事务管理 --
transactionManager type="JDBC" /
!-- POOLED配置JDBC数据源连接池 --
dataSource type="POOLED"
property name="driver" value="com.mysql.jdbc.Driver" /
property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8" /
property name="username" value="root" /
property name="password" value="root" /
/dataSource
/environment
/environments
/configuration
5.MyBatis开发有两种方式:
使用原生接口
Mapper代理实现自定义接口
先来说第一种使用原生接口
(1)创建Mapper文件UserMapper.xml。
namespace通常设置为文件所在包名+文件名,但不是一定要这样设置,可以自定义,出于代码规范一般设置为包名+文件名的形式。
parameterType为参数数据类型。
resultType为返回值数据类型。
?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.southwind.mapper.UserMapper"
select id="get" parameterType="int" resultType="com.southwind.entity.User"
select * from user where id=#{id}
/select
/mapper
(2)在全局配置文件config.xml中注册UseMapper.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"
configuration
!-- 配置MyBatis运行环境 --
environments default="development"
environment id="development"
!-- 配置JDBC事务管理 --
transactionManager type="JDBC" /
!-- POOLED配置JDBC数据源连接池 --
dataSource type="POOLED"
property name="driver" value="com.mysql.jdbc.Driver" /
property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8" /
property name="username" value="root" /
property name="password" value="root" /
/dataSource
/environment
/environments
!-- 注册UserMapper.xml --
mappers
mapper resource="com/southwind/mapper/UserMapper.xml"/
/mappers
/configuration
(3)测试类调用原生接口执行SQL语句获取结果。
public class Test {
public static void main(String[] args) {
//加载MyBatis配置文件
InputStream is = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用MyBatis原生接口执行SQL
//statement为UserMapper.xml的namespace值+"."+select标签的id值
String statement = "com.southwind.mapper.UserMapper.get";
User user = sqlSession.selectOne(statement , 1);
System.out.println(user);
}
}
我们在实际开发中,推荐使用第二种方式:自定义接口,但是不需要实现该接口,通过Mapper代理来实现,具体的实现逻辑或者说要执行的SQL语句配置在Mapper.xml中。这里为了统一,我们换了一个名字UserDAO.xml,实际和UserMapper.xml没有区别。
该内容来自 GitChat 平台的《案例上手 Spring 全家桶》达人课,需要查看全部内容的读者,可以扫描下方二维码订阅本课程。