深入MyBatis-初探MyBatis

版权声明:转载需声明本人出品 https://blog.csdn.net/weixin_40288381/article/details/88423872

概述

MyBatis是一个可以自定义SQL,存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码,只使用简单的XML和注解来配置和映射基本数据类型,Map接口和POJO到数据库记录。相对Hibernate"全自动化"持久层框架,MyBatis是一种"半自动"的ORM实现。

ORM工具基本思想

Hibernate和MyBatis共同点:

  1. 从配置文件(通常是xml文件)得到sessionfactory
  2. 由sessionfactory产生session
  3. 在session中完成对数据的增删改查和事务提交等
  4. 使用完毕,关闭session
  5. 在Pojo类和数据库表之间有mapping的配置文件(通常是xml文件)

MyBatis架构

  1. API接口层:提供给外部使用的接口API,开发人员调用接口API操纵数据库。接口层一接收到调用就会调用数据处理层完成具体的数据处理
  2. 数据处理层:负责具体的SQL查找,SQL解析和执行结果映射等
  3. 基础支撑层:负责连接管理,事务管理,配置加载和缓存处理等基础功能

在这里插入图片描述

流程图:
在这里插入图片描述


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对应的映射文件

扫描二维码关注公众号,回复: 5556344 查看本文章
<?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构建框架整合:

未完待续…

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/88423872