1. ORM
面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。
ORM就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。
ORM 把数据库映射成对象。
- 数据库的表(table) --> 类(class)
- 记录(record,行数据)–> 对象(object)
- 字段(field)–> 对象的属性(attribute)
2. Mybatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
3. 使用Mybatis
3.1. 新建类和数据库
使用maven新建一个java项目,将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
新建一个Person类,属性有id,name,age
public class Person {
private int id;
private String name;
private int age;
//getter()、setter()、构造方法与toString()方法略
}
在数据库中新建一个person表
3.2. 建立映射
在resources目录下创建一个mapper目录,专门用于存放sql映射文件,在目录中创建一个PersonMapper.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 namespace="com.santiago.mybatis.PersonMapper">
<select id="queryPersonById" resultType="com.santiago.mybatis.Person" parameterType="int">
select * from Blog where id = #{id}
</select>
</mapper>
其中namespace
值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
resultType
属性指明查询返回的结果集类型,路径名要写完整,#{id}
相当于jdbc中的?
,可以动态传入id值,parameterType
决定传入数值类型
3.3. 配置
在resources目录下创建一个conf.xml文件,
environments
中可以写多个environment,通过environments的default值和enviorment的id值确定Mybatis运行时的数据库环境,也可以在测试类中的build()函数中指定environments的default值.dataSource
为数据源类型,有三种POOLED
:使用数据库连接池(一般选用这种方式)UNPOOLED
:传统的JDBC方式,每次访问数据库都需要打开关闭操作,比较浪费资源JNDI
:从tomcat中获取一个内置的连接池
transactionManager
:事务的提交方式JDBC
:利用JDBC的方式处理事务(commit rollback close)MANAGED
:将事务交由其他组件去托管(spring,jobss)
内容如下所示
<?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:3307/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载映射文件-->
<mapper resource="mapper/PersonMapper.xml"/>
</mappers>
</configuration>
3.4. 编写数据访问类
在com.santiago.mybatis包下新建TestMybatis.java,
注意:指定Mybatis运行时的环境为test,则选择environment的id值为test的环境运行
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream,"test");
内容如下所示
package com.santiago.mybatis;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class TestMybatis {
public static void main(String[] args) {
//方式一
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream stream = Person.class.getClassLoader().getResourceAsStream("conf.xml");
//构建sqlSession的工厂
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
//指定Mybatis运行时的环境为development,则选择environment的id值为development的环境运行
//SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream,"development");
//方式二
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session=ssf.openSession();
/**
* 映射sql的标识字符串,
* com.santiago.mybatis.PersonMapper是PersonMapper.xml文件中mapper标签的namespace属性的值,
* queryPersonById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
* 根据namespace和id确定唯一的sql语句
*/
String statement = "com.santiago.mybatis.PersonMapper.queryPersonById";
Person person = session.selectOne(statement, 1);
System.out.println(person);
session.close();
}
}
执行结果如下所示
执行过程解释:
MyBatis源码分析-SQL语句执行的完整流程
执行流程:
- 加载Mybatis配置文件,根据配置文件中的信息(事务管理器、数据源)创建SqlSessionFactory,并加载映射文件
- 获取一个SqlSession(用来完成增删改查功能),然后开启
- Executor生成Sql动态语句并查询缓存
- 如果没有缓存信息,StatementHandler进行SQL查询参数的设置,设置完之后返回一个Statement
- 然后Handler针对一条Statement语句进行实际的SQL查询操作和结果集的封装