MyBatis的入门

MyBatis是什么

  • 开源的持久层框架。
  • jdbc 易掌握,性能好,代码繁琐,易出错
  • hibernate 难掌握,性能不好,代码非常简洁,虽然不用写sql,但经常需要优化sql
  • mybatis 比较容易掌握,性能一般,代码简洁,需要写sql

开发步骤

  1. 导包 mybatis,mysql,junit
  2. 添加配置文件 (SqlMapConfig.xml)
  3. 实体类,属性名要与表的字段名一样(大小写可以忽略)
  4. 添加映射文件(告诉mybatis,如何进行对象关系映射,里面主要是一些sql语句)
  5. 修改配置文件,添加映射文件的位置
  6. 调用mybatis提供的api访问数据库(主要是调用SqlSession类提供的方法)

jar包依赖

<dependencies>
		<!-- mybatis的jar包 -->
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.4</version>
		</dependency>
		<!-- mysql的jar包 -->
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.19</version>
		</dependency>
		<!-- junit单元测试 -->
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

SqlMapConfig.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="db.properties" />
	<typeAliases>
		<package name="entity"/>
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="entity/EmployeeMapper.xml" />
	</mappers>
</configuration>

db.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ems?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

数据库

//创建数据库
create database ems;
//创建表
CREATE TABLE t_emp (
  id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  ename varchar(255) DEFAULT NULL COMMENT '雇员名称',
  salary decimal(10,2) DEFAULT NULL COMMENT '薪水',
  age int(11) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

实体类

package entity;

public class Employee {
	private int id;
	private String ename;
	private double salary;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString() {
		return "Employee [id=" + id + ", ename=" + ename + ", salary=" + salary + ", age=" + age + "]";
	}
	
}

映射文件

EmployeeMapper.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="test">
	<insert id="save" parameterType="Employee" useGeneratedKeys="true" keyProperty="id">
		insert into t_emp values(null,#{ename},#{salary},#{age})
	</insert>
	<delete id="delete" parameterType="int">
		delete from t_emp where id=#{id}
	</delete>
	<update id="update" parameterType="Employee">
		update t_emp set ename=#{ename},salary=#{salary},age=#{age} where id=#{id}
	</update>
	<select id="findById" parameterType="int" resultType="Employee">
		select * from t_emp where id=#{id}
	</select>
	<select id="findAll" resultType="Employee">
		select * from t_emp
	</select>
</mapper>

MyBatis配置文件SqlMapConfig.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="db.properties" />
	<typeAliases>
		<package name="entity"/>
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="entity/EmployeeMapper.xml" />
	</mappers>
</configuration>

测试程序

package test;

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

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

import entity.Employee;

public class TestCase {
	SqlSessionFactory sf;

	@Before
	public void before() throws IOException {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sf = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void save() {
		SqlSession ss = sf.openSession();
		Employee e = new Employee();
		e.setEname("小红");
		e.setAge(16);
		e.setSalary(2000);
		ss.insert("test.save", e);
		System.out.println(e.getId());
		ss.commit();
		ss.close();
	}

	@Test
	public void delete() {
		SqlSession ss = sf.openSession();
		ss.delete("test.delete", 5);
		ss.commit();
		ss.close();
	}

	@Test
	public void update() {
		SqlSession ss = sf.openSession();
		Employee e = new Employee();
		e.setId(6);
		e.setAge(23);
		e.setEname("小红");
		e.setSalary(2000);
		ss.update("test.update", e);
		ss.commit();
		ss.close();
	}

	@Test
	public void findById() {
		SqlSession ss = sf.openSession();
		Employee e = ss.selectOne("test.findById", 6);
		System.out.println(e);
		ss.close();
	}

	@Test
	public void findAll() {
		SqlSession ss = sf.openSession();
		List<Employee> employees = ss.selectList("test.findAll");
		for (Employee employee : employees) {
			System.out.println(employee);
		}
		ss.close();
	}
}

工作原理

在这里插入图片描述

返回Map类型的结果

mybatis会将查询到的记录先存放到map对象里面(以字段名作为
key,以字段值作为value,一条记录对应一个map),再将map中存放的
数据添加到实体对象(默认以key作为属性名来赋值)。
注:
返回Map类型的结果,可以不用写实体类,但是取字段值时,
需要调用get方法,需要考虑字段名的差异(比如oracle数据库
会将字段名大写)。
还是返回实体对象取值方便。

映射文件EmployeeMapper.xml

添加如下代码

<select id="findById2" parameterType="int" resultType="map">
		select * from t_emp where id=#{id}
	</select>

测试程序

@Test
	public void findById2() {
		SqlSession ss = sf.openSession();
		Map map = ss.selectOne("test.findById2", 6);
		System.out.println(map);
		ss.close();
	}

测试结果
在这里插入图片描述

解决实体类的属性名与表的字段名不一致的情况

方式一 使用别名
SELECT name as ename…
方式二 使用resultMap元素

实体类修改

package entity;

public class Emp2 {
	private int empNo;
	private String name;
	private double salary;
	private int age;
	public int getEmpNo() {
		return empNo;
	}
	public void setEmpNo(int empNo) {
		this.empNo = empNo;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString() {
		return "Emp2 [empNo=" + empNo + ", name=" + name + ", salary=" + salary + ", age=" + age + "]";
	}
}

映射文件EmployeeMapper.xml修改

<resultMap type="Emp2" id="Emp2ResultMap">
		<id column="id" property="empNo"/>
		<result column="ename" property="name"/>
		<result column="salary" property="salary"/>
		<result column="age" property="age"/>
	</resultMap>
	<select id="findAll2" resultMap="Emp2ResultMap">
		select * from t_emp
	</select>

测试程序

SqlSessionFactory sf;

	@Before
	public void before() throws IOException {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sf = new SqlSessionFactoryBuilder().build(inputStream);
	}
@Test
	public void findAll2() {
		SqlSession ss = sf.openSession();
		List<Emp2> employees = ss.selectList("test.findAll2");
		for (Emp2 employee : employees) {
			System.out.println(employee);
		}
		ss.close();
	}

测试结果

在这里插入图片描述

Mapper映射器

Mapper映射器是什么

是一个符合映射文件要求的接口。
注:mybatis会生成一个符合该接口的实现类。

使用Mapper映射器

  1. 定义接口

方法名必须与sqlId一样
参数类型必须与parameterType一样
返回类型必须与resultType一样

2、映射文件中的namespace必须等于接口名(全限定名)
3、调用SqlSession提供的getMapper方法。

修改映射文件Emp2.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="dao.EmployeeDAO">
	<insert id="save" parameterType="Employee" useGeneratedKeys="true" keyProperty="id">
		insert into t_emp values(null,#{ename},#{salary},#{age})
	</insert>
	<delete id="delete" parameterType="int">
		delete from t_emp where id=#{id}
	</delete>
	<update id="update" parameterType="Employee">
		update t_emp set ename=#{ename},salary=#{salary},age=#{age} where id=#{id}
	</update>
	<select id="findById" parameterType="int" resultType="Employee">
		select * from t_emp where id=#{id}
	</select>
	<select id="findAll" resultType="Employee">
		select * from t_emp
	</select>
</mapper>

接口EmployeeDAO

package dao;

import java.util.List;

import entity.Employee;

public interface EmployeeDAO {
	public void save(Employee e);
	public void delete(int id);
	public void update(Employee e);
	public Employee findById(int id);
	public List<Employee>findAll();
}

mybatis配置文件中添加Emp2.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="db.properties" />
	<typeAliases>
		<package name="entity"/>
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="entity/EmployeeMapper.xml" />
		<mapper resource="entity/Emp2.xml" />
	</mappers>
</configuration>

测试程序

package test;

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

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

import dao.EmployeeDAO;
import entity.Employee;

public class TestCase2 {
	SqlSessionFactory sf;

	@Before
	public void before() throws IOException {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sf = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void save() {
		SqlSession ss = sf.openSession();
		EmployeeDAO employeeDAO = ss.getMapper(EmployeeDAO.class);
		Employee e = new Employee();
		e.setEname("腊月红");
		e.setAge(24);
		e.setSalary(40000);
		employeeDAO.save(e);
		System.out.println(e.getId());
		ss.commit();
		ss.close();
	}

	@Test
	public void delete() {
		SqlSession ss = sf.openSession();
		EmployeeDAO employeeDAO = ss.getMapper(EmployeeDAO.class);
		employeeDAO.delete(7);
		ss.commit();
		ss.close();
	}

	@Test
	public void update() {
		SqlSession ss = sf.openSession();
		EmployeeDAO employeeDAO = ss.getMapper(EmployeeDAO.class);
		Employee e = new Employee();
		e.setId(8);
		e.setEname("呼呼");
		e.setAge(17);
		e.setSalary(4000);
		employeeDAO.update(e);
		ss.commit();
		ss.close();
	}

	@Test
	public void findById() {
		SqlSession ss = sf.openSession();
		EmployeeDAO employeeDAO = ss.getMapper(EmployeeDAO.class);
		Employee e = employeeDAO.findById(8);
		System.out.println(e);
		ss.close();
	}

	@Test
	public void findAll() {
		SqlSession ss = sf.openSession();
		EmployeeDAO employeeDAO = ss.getMapper(EmployeeDAO.class);
		List<Employee> employees = employeeDAO.findAll();
		for (Employee employee : employees) {
			System.out.println(employee);
		}
		ss.close();
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值