MyBatis学习1 - MyBatis简介、入门简单示例、架构图、配置文件

68 阅读1分钟

文章目录

1. MyBatis简介

极大的简化SQL操作、仅通过配置即可以获取数据库数据 — 持久层框架
作用:将实体Bean类、SQL语句建立映射关系、半自动化的ORM实现

数据持久层框架(ORM - Object Relation Mapping)

  • Bean类名 ← 表名
  • Bean对象 ← 表的行记录
  • Bean的属性 ← 表的列名

2. 简单代码示例

Dao层执行映射文件的SQL语句的方式:

  • SqlSession.select/insert/update/delete(“mapper.namespace + SQL.id”, 参数 )
    > [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBp2e9AX-1587803095442)(en-resource://database/14338:1)]

步骤

  • 导入MyBatis、数据库驱动jar包

  • 编写配置文件:主配置文件以及映射文件

  • 代码使用

    1. SqlSessionFactoryBuilder – 读取配置文件
    2. SqlSessionFactory – 类似连接池
    3. SqlSession – 类似Connection、但不是Connection


1. jdbc.properties - 数据库连接文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456

  2. MyBatis主配置文件、以及SQL映射文件

mybatis.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>
	
	<!-- 加载数据库连接配置文件 -->
	<properties resource="jdbc.properties"></properties>
	
	<!-- MyBatis读取数据库配置文件、进行数据库连接的管理 -->
	<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>
	
	<!-- SQL映射文件 -->
	<mappers>
		<mapper resource="empMapper.xml" />
		<mapper resource="deptMapper.xml" />
	</mappers>

</configuration>


empMapper.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="top.linruchang.dao.EmpMapper">
	
	
	<select id="queryById" parameterType="Integer" resultType="top.linruchang.domain.Emp" >
		select * from Emp where empno = #{id}
	</select>
	
	<select id="queryAll" resultType="top.linruchang.domain.Emp" >
		select * from Emp
	</select>
	
	
	<update id="updateEname" parameterType="top.linruchang.domain.Emp" >
		update emp set ename=#{ename} where empno=#{empno};		
	</update>
	
	<delete id="deleteEmp" parameterType="top.linruchang.domain.Emp">
		delete from emp where empno=#{empno}
	</delete>
	
	<insert id="addEmp" parameterType="top.linruchang.domain.Emp">
		insert into emp(empno, ename, salary) values(#{empno}, #{ename}, #{salary});
	</insert>
	
</mapper>


3. Emp - Bean类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfvmI7Ji-1587803095453)(en-resource://database/14336:1)]

package top.linruchang.domain;

public class Emp {
	Integer empno;
	String ename;
	Integer salary;
	
	public Emp(Integer empno, String ename, Integer salary) {
		super();
		this.empno = empno;
		this.ename = ename;
		this.salary = salary;
	}
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public Integer getSalary() {
		return salary;
	}
	public void setSalary(Integer salary) {
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", salary=" + salary + "]";
	}
	
}

  4. EmpDao - 数据访问层

package top.linruchang.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import top.linruchang.domain.Emp;

public class EmpDao {
	
	@Test
	public void test() {
		EmpDao empDao = new EmpDao();
		
		Emp emp = empDao.query(1);
		
		System.out.println(emp);
		
//		---------------------------------
		
//		List<Emp> emps = empDao.queryAll();
//		
//		System.out.println(emps);
		
//		------------------------------------
		
//		Emp emp = new Emp(1, "lrc5", 3000);
//		
//		Integer result = empDao.updateName(emp);
//		
//		System.out.println(result);
		
//		-------------------------------
		
//		Emp emp = new Emp(2, "", 0);
//		
//		Integer result = empDao.delete(emp);
//		
//		System.out.println(result);
		
//		---------------------------------
		
//		Emp emp = new Emp(3, "lcj", 3000);
//		
//		Integer result = empDao.add(emp);
//		
//		System.out.println(result);
		
	}
	
	
	private static  SqlSessionFactory ssf;
	
	static {
		InputStream is = EmpDao.class.getClassLoader().getResourceAsStream("mybatis.xml");
		SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
		ssf = ssfb.build(is);
	}
	
	
	public Emp query(Integer empno) {
		
		
		SqlSession ss = ssf.openSession();
		
		Object emp = ss.selectOne("top.linruchang.dao.EmpMapper.queryById", 1);
		
		return (Emp) emp;
	}
	
	
	public List<Emp> queryAll() {
		
		SqlSession ss = ssf.openSession();
		
		List<Emp> selectList = ss.selectList("top.linruchang.dao.EmpMapper.queryAll");
		
		return selectList;
	}
	
	
	public Integer updateName(Emp emp) {
		
		SqlSession ss = ssf.openSession(true);
		
		Integer result = ss.update("top.linruchang.dao.EmpMapper.updateEname", emp);
		
		return result;
	}
	
	
	public Integer delete(Emp emp) {
		
		SqlSession ss = ssf.openSession(true);
		
		Integer result = ss.delete("top.linruchang.dao.EmpMapper.deleteEmp", emp);
		
		return result;
	}
	
	
	public Integer add(Emp emp) {
		
		SqlSession ss = ssf.openSession(true);
		
		Integer result = ss.insert("top.linruchang.dao.EmpMapper.addEmp", emp);
		
		return result;
	}
	
}

3. MyBatis架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvA4Wbu5-1587803095460)(en-resource://database/14356:1)]

MyBatis三层图


MyBatis执行流程

恰恰MyBatis帮我们完成了最烦人的3、4、5步骤,所以这个框架很强大

4. MyBatis的配置文件

4.1 主配置文件

重点:内的子节点有顺序要求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7w7txw3y-1587803095466)(en-resource://database/14358:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OXI5FGhi-1587803095471)(en-resource://database/14360:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wURsT7sB-1587803095474)(en-resource://database/14362:1)]

4.2 映射文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rNSZj5p-1587803095477)(en-resource://database/14374:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPHEBRMf-1587803095481)(en-resource://database/14372:1)]

4.3 #{} 与 ${}的区别


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6oichGFj-1587803095484)(en-resource://database/14376:1)]