概述
MyBatis是一个可以自定义SQL,存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码,只使用简单的XML和注解来配置和映射基本数据类型,Map接口和POJO到数据库记录。相对Hibernate"全自动化"持久层框架,MyBatis是一种"半自动"的ORM实现。
ORM工具基本思想
Hibernate和MyBatis共同点:
- 从配置文件(通常是xml文件)得到sessionfactory
- 由sessionfactory产生session
- 在session中完成对数据的增删改查和事务提交等
- 使用完毕,关闭session
- 在Pojo类和数据库表之间有mapping的配置文件(通常是xml文件)
MyBatis架构
- API接口层:提供给外部使用的接口API,开发人员调用接口API操纵数据库。接口层一接收到调用就会调用数据处理层完成具体的数据处理
- 数据处理层:负责具体的SQL查找,SQL解析和执行结果映射等
- 基础支撑层:负责连接管理,事务管理,配置加载和缓存处理等基础功能
流程图:
SqlSessionFactoryBuilder
每一个MyBatis的应用程序的入口是SqlSessionFactoryBuilder,它的作用是通过xml文件创建Configuration对象,然后通过build方法创建SqlSessionFactory对象
//1.读取主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory
SqlSessionFactory由SqlSessionFactoryBuilder创建,它的主要功能是创建SqlSession对象。SqlSessionFactory对象的一个必要属性就是Configuration对象,用于保存Mybatis全局配置的一个配置对象(一般为放置src目录下的mybatis.xml),通常由SqlSessionFactoryBuilder从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>
<!-- 配置运行环境 -->
<environments default="onlineEM">
<environment id="onlineEM">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///deep"/>
<property name="username" value="root"/>
<property name="password" value="759153"/>
</dataSource>
</environment>
<environment id="testEM">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///deep"/>
<property name="username" value="root"/>
<property name="password" value="759153"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/Reyco/dao/mapper.xml"/>
</mappers>
</configuration>
SqlSession
SqlSession对象的主要功能是完成一次数据库的访问和结果的映射,它类似数据库session的概念,由于不是线程安全的,所以SqlSession对象的作用域需限制方法内。SqlSession的默认实现是DefaultSession,它有两个必须配置的属性:Configuration和Executor。SqlSession对数据库的操作都是通过Executor来完成的。
SqlSession有一个重要的方法getMapper,顾名思义,这个方式是用来获取Mapper对象的。SqlSession的getMapper方法是联系应用程序和Mybatis纽带,应用程序访问getMapper时,Mybatis会根据传入的接口类型和对应的XML配置文件生成一个代理对象,这个代理对象就叫Mapper对象。应用程序获得Mapper对象后,就应该通过这个Mapper对象来访问Mybatis的SqlSession对象,这样就达到里插入到Mybatis流程的目的。
搭建第一个MyBatis程序
1.先编写bean
public class Student {
private String name;
private Integer id;
private int age;
private double score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Student(String name, int age, double score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Student [name=" + name + ", id=" + id + ", age=" + age + ", score=" + score + "]";
}
}
2.编写UserDao接口及实现类
public interface IStudentDao {
void insertStudent(Student student);
}
//实现类
@Override
public void insertStudent(Student student) {
try {
//1.读取主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.创建SqlSession对象
session = sqlSessionFactory.openSession();
//4.操作
//获取接口的实现类对象
//会为接口自动创建代理对象,代理对象根据名称匹配找到对应的namespace去执行增删查改方法
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.insertStudent(student);
//5.SqlSession提交
session.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(session != null) {
session.close();
}
}
}
3.bean对应的映射文件
<?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.Reyco.dao.StudentMapper">
<insert id="insertStudent" parameterType="com.Reyco.beans.Student">
insert into Student(name,age,score) values(#{name}, #{age}, #{score})
</insert>
</mapper>
4.数据库建表
当数据库表中字段和bean内属性一致时可以直接注入,不一致时需要进行映射
5.主配置文件
<?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="onlineEM">
<environment id="onlineEM">
<transactionManager type="JDBC"/>
<!--配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///deep"/>
<property name="username" value="root"/>
<property name="password" value="759153"/>
</dataSource>
</environment>
<environment id="testEM">
<transactionManager type="JDBC"/>
<!--配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///deep"/>
<property name="username" value="root"/>
<property name="password" value="759153"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="com/Reyco/dao/mapper.xml"/>
</mappers>
</configuration>
6.测试类
public class myTest {
public static void main(String[] args) {
studentDaoImpl studentDaoImpl = new studentDaoImpl();
Student student = new Student("Reyco",21,99.0);
studentDaoImpl.insertStudent(student);
}
}
Spring中使用MyBatis
基于Maven构建框架整合:
未完待续…