一、什么是Mybatis?
- Mybatis是一个半自动化的持久型框架
- 支持定制化SQL、存储过程以及高级映射
- 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
- 不支持方法重载
Mybatis的官网地址:https://mybatis.org/mybatis-3/zh/index.html
二、为什么要使用Mybatis?
Mybatis就是帮助程序员将数据存入数据库中 , 和从数据库中取数据 .
传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等, 通过使用框架可以减少重复代码,提高开发效率 .
MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!
MyBatis的优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql和代码的分离,提高了可维护性
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供xml标签,支持编写动态sql。
最重要的一点,使用的人多!大多数公司目前在使用!(Mybatis、Spring、SpringMVC、SpringBoot)
三、Mybatis的使用
操作思路:搭建环境–>导入Mybatis–>编写代码–>测试!
1、搭建环境
(1)搭建数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `oa` /*!40100 DEFAULT CHARACTER SET utf8 */ ;
USE `oa` ;
DROP TABLE IF EXISTS `department` ;
CREATE TABLE `department` (
`dId` INT (11) NOT NULL AUTO_INCREMENT,
`dName` VARCHAR (20) DEFAULT NULL,
PRIMARY KEY (`dId`)
) ENGINE = INNODB AUTO_INCREMENT = 7 DEFAULT CHARSET = utf8 ;
INSERT INTO `department` (`dId`, `dName`)
VALUES
(1, '研发部'),
(2, '需求部'),
(3, '实施部'),
(4, '行政部'),
(5, '客服部'),
(6, '财务部') ;
DROP TABLE IF EXISTS `employee` ;
CREATE TABLE `employee` (
`eid` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`eName` VARCHAR (20) NOT NULL COMMENT '姓名',
`ePass` VARCHAR (50) NOT NULL COMMENT '密码',
`eSex` CHAR(1) NOT NULL DEFAULT '女' COMMENT '性别',
`eAge` INT (11) DEFAULT NULL COMMENT '年龄',
`eTel` VARCHAR (15) DEFAULT NULL COMMENT '电话',
`eAddr` VARCHAR (100) DEFAULT '地址不详' COMMENT '地址',
`eInputDate` DATETIME DEFAULT NULL COMMENT '录入时间',
`eFlag` CHAR(1) DEFAULT '0' COMMENT '0:不在线,1:在线',
`eAdmin` CHAR(1) DEFAULT '0' COMMENT '0:收银员,1:管理员,2:理货员,3:导购员',
`dId` INT (11) NOT NULL DEFAULT '1',
PRIMARY KEY (`eid`)
) ENGINE = INNODB AUTO_INCREMENT = 10028 DEFAULT CHARSET = utf8 ;
INSERT INTO `employee` (
`eid`,
`eName`,
`ePass`,
`eSex`,
`eAge`,
`eTel`,
`eAddr`,
`eInputDate`,
`eFlag`,
`eAdmin`,
`dId`
)
VALUES
(
10000,
'张倩倩',
'000000',
'女',
19,
'18254869553',
'西安高新区',
'2015-08-04 00:00:00',
'0',
'0',
1
),
(
10001,
'于曼丽',
'000000',
'女',
23,
'15088784570',
'西安',
'2016-02-01 00:00:00',
'0',
'0',
1
),
(
10002,
'李薇',
'123458',
'女',
21,
'18815488665',
'地址不详',
'2016-03-05 00:00:00',
'0',
'0',
1
),
(
10003,
'王丽',
'123458',
'女',
24,
'15215448996',
'地址不详',
'2015-06-05 00:00:00',
'0',
'0',
3
),
(
10005,
'李明',
'000000',
'男',
34,
'13258458412',
'宝鸡',
'2015-08-14 00:00:00',
'0',
'0',
2
),
(
10006,
'张志华',
'666666',
'男',
54,
'15878745696',
'北京',
'2014-08-25 00:00:00',
'1',
'1',
2
),
(
10007,
'张建国',
'123456',
'男',
42,
'15215654648',
'地址不详',
'2013-03-26 00:00:00',
'0',
'1',
4
),
(
10008,
'李小鹏',
'465132',
'男',
26,
'18956424658',
'西安高新',
'2015-06-02 00:00:00',
'1',
'1',
1
),
(
10009,
'赵敏',
'456881',
'女',
21,
'18556584655',
'西安雁塔区',
'2015-06-02 00:00:00',
'0',
'1',
1
),
(
10011,
'阿童木',
'123',
'男',
21,
'15088956548',
'西安',
'2017-04-11 00:00:00',
'1',
'0',
3
),
(
10012,
'李仁帅',
'123456',
'男',
18,
'15899895687',
'天泽',
'2017-04-11 00:00:00',
'1',
'1',
1
),
(
10014,
'C罗',
'123456',
'男',
17,
'1590000000',
'英国伦敦',
'2017-04-11 00:00:00',
'1',
'0',
1
),
(
10019,
'孙悟空',
'123123',
'\0',
20,
'0108899876',
'西安高新',
NULL,
'0',
'0',
2
),
(
10024,
'张三',
'123123',
'\0',
20,
'0108899876',
'海南',
NULL,
'0',
'0',
4
),
(
10025,
'张三',
'123123',
'\0',
20,
'0108899876',
'海南',
NULL,
'0',
'0',
1
),
(
10026,
'张三',
'123123',
'\0',
20,
'0108899876',
'海南',
NULL,
'0',
'0',
2
),
(
10027,
'张三',
'123123',
'\0',
20,
'0108899876',
'海南',
NULL,
'0',
'0',
4
) ;
(2)创建项目,导入MyBatis相关 jar 包,
(3)编写MyBatis核心配置文件
先创建一个数据配置的属性文件:dbconfig.properties
(4)再编写Mybatis的核心配置文件:configuration.xml
以及实体类映射文件创建:EmployeeMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lss.dao.EmployeeDao">
<!--#{} 在这里表示的是预编译指令,里面的内容要和对象的属性保持一致,大小写敏感-->
<!-- namespace:对象映射的接口-->
<!-- id:对应接口的方法-->
<!-- resultType:返回值的类型-->
<!-- 通过员工编号查询员工对象的方法-->
<select id="selectOne" resultType="com.lss.bean.Employee">
select * from employee where eid =#{eid}
</select>
<!-- 查询所有员工对象的方法-->
<select id="selectAll" resultType="com.lss.bean.Employee">
select * from employee
</select>
<!--添加员工的方法-->
<insert id="addEmp">
INSERT INTO employee(eName,ePass,eSex,eAge,eTel,eAddr)VALUES(#{eName},#{ePass},#{eSex},#{eAge},#{eTel},#{eAddr})
</insert>
<!-- 更新员工信息的方法-->
<update id="updateEmp">
UPDATE employee SET eName =#{eName},ePass=#{ePass},eSex=#{eSex},eAge=#{eAge},eTel=#{eTel},eAddr=#{eAddr} WHERE eid=#{eid}
</update>
<!--删除员工的方法-->
<delete id="deleteEmp">
delete from employee where eid=#{id}
</delete>
</mapper>
(5) 创建实体类:Employee
package com.lss.bean;
/**
* @author 梁三岁
* 员工实体类
*/
public class Employee {
/**
* 员工编号
*/
private int eid;
/**
* 员工姓名
*/
private String eName;
/**
* 员工密码
*/
private String ePass;
/**
* 员工性别
*/
private String eSex;
/**
* 员工年龄
*/
private int eAge;
/**
* 员工电话
*/
private String eTel;
/**
* 员工地址
*/
private String eAddr;
/**
* 无参构造方法
*/
public Employee() {
}
/**
* 全参构造方法
* @param eid
* @param eName
* @param ePass
* @param eSex
* @param eAge
* @param eTel
* @param eAddr
*/
public Employee(int eid, String eName, String ePass, String eSex, int eAge, String eTel, String eAddr) {
this.eid = eid;
this.eName = eName;
this.ePass = ePass;
this.eSex = eSex;
this.eAge = eAge;
this.eTel = eTel;
this.eAddr = eAddr;
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String geteName() {
return eName;
}
public void seteName(String eName) {
this.eName = eName;
}
public String getePass() {
return ePass;
}
public void setePass(String ePass) {
this.ePass = ePass;
}
public String geteSex() {
return eSex;
}
public void seteSex(String eSex) {
this.eSex = eSex;
}
public int geteAge() {
return eAge;
}
public void seteAge(int eAge) {
this.eAge = eAge;
}
public String geteTel() {
return eTel;
}
public void seteTel(String eTel) {
this.eTel = eTel;
}
public String geteAddr() {
return eAddr;
}
public void seteAddr(String eAddr) {
this.eAddr = eAddr;
}
}
(6)创建测试类:使用的是junit单元测试
package com.lss.dao;
import com.lss.bean.Employee;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author 梁三岁
* 员工数据访问接口的测试类
*/
public class EmployeeDaoTest {
EmployeeDao employeeDao =null;
@Before
public void common(){
try {
//1、获得当前Mybatis总的配置文件路径
String resources = "configuration.xml";
//2、获得当前配置对象的输入流
InputStream inputStream = Resources.getResourceAsStream(resources);
//3、通过流对象创建SessionFactory对象,数据会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//4、通过数据会话工厂,开启数据库的一次会话
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//5、得到接口对象
employeeDao= sqlSession.getMapper(EmployeeDao.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void selectOne(){
// 调用方法得到员工对象
Employee employee = employeeDao.selectOne(10007);
//打印输出
System.out.println(employee.getEid()+"\t"+employee.geteName()+"\t"+employee.geteAge()+"\t"+employee.geteSex()+"\t"+employee.getePass()+"\t"+employee.geteAddr());
}
@Test
public void selectAll(){
// 调用方法得到员工对象集合
List<Employee> employeeList = employeeDao.selectAll();
//遍历输出
for(Employee employee: employeeList){
System.out.println(employee.getEid()+"\t"+employee.geteName()+"\t"+employee.geteAge()+"\t"+employee.geteSex()+"\t"+employee.getePass()+"\t"+employee.geteAddr());
}
}
@Test
public void addEmp(){
//创建员工对象
Employee employee = new Employee();
//使用set方法对员工对象赋值
employee.seteName("库里");
employee.setePass("123456");
employee.seteAge(32);
employee.seteSex("男");
employee.seteTel("15645671234");
employee.seteAddr("陕西西安");
//调用添加方法将员工对象持久化
employeeDao.addEmp(employee);
this.selectAll();
}
@Test
public void updateEmp(){
Employee employee= employeeDao.selectOne(10027);
employee.seteName("克莱");
employee.setePass("456123");
employee.seteAddr("陕西咸阳");
employeeDao.updateEmp(employee);
this.selectAll();
}
@Test
public void deleteEmp(){
this.selectAll();
employeeDao.deleteEmp(10030);
this.selectAll();
}
}
同理,按照上述方法即可实现对部门的增查改删操作
1、创建部门实体类映射文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lss.dao.DepartmentDao">
<select id="selectOne" resultType="com.lss.bean.Department">
select * from department where dId=#{dId}
</select>
<select id="selectAll" resultType="com.lss.bean.Department">
select * from department
</select>
<insert id="addDept">
insert into department(dName) values (#{dName})
</insert>
<update id="updateDept">
update department set dName=#{dName} where dId=#{dId}
</update>
<delete id="deleteDept">
delete from department where dId=#{dId}
</delete>
</mapper>
2、创建部门实体类
package com.lss.bean;
/**
* @author 梁三岁
* 部门实体类
*/
public class Department {
/**
* 部门编号
*/
private int dId;
/**
* 部门名称
*/
private String dName;
public Department() {
}
public Department(int dId, String dName) {
this.dId = dId;
this.dName = dName;
}
public int getdId() {
return dId;
}
public void setdId(int dId) {
this.dId = dId;
}
public String getdName() {
return dName;
}
public void setdName(String dName) {
this.dName = dName;
}
}
3、创建部门数据访问接口及其测试类
package com.lss.dao;
import com.lss.bean.Department;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author 梁三岁
* 部门数据访问接口测试类
*/
public class DepartmentDaoTest {
DepartmentDao departmentDao =null;
@Before
public void common(){
try {
// 获得当前Mybatis总的配置文件路径
String resources ="configuration.xml";
//2、获得当前配置对象的输入流
InputStream inputStream = Resources.getResourceAsStream(resources);
//3、通过流对象创建SessionFactory对象,数据会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//4、通过数据会话工厂,开启数据库的一次会话
SqlSession sqlSession =sqlSessionFactory.openSession(true);
//5、得到接口对象
departmentDao=sqlSession.getMapper(DepartmentDao.class);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void selectOne(){
Department department = departmentDao.selectOne(4);
System.out.println(department.getdId()+"\t"+department.getdName());
}
@Test
public void selectAll(){
List<Department> departmentList = departmentDao.selectAll();
for(Department department:departmentList){
System.out.println(department.getdId()+"\t"+department.getdName());
}
}
@Test
public void addDept(){
Department department= new Department();
department.setdName("人事部");
departmentDao.addDept(department);
this.selectAll();
}
@Test
public void updateDept(){
Department department= departmentDao.selectOne(7);
department.setdName("人力资源部");
departmentDao.updateDept(department);
this.selectAll();
}
@Test
public void deleteDept(){
departmentDao.deleteDept(7);
this.selectAll();
}
}
注意在configuration.xml中增加部门的
小结:
Mybatis的开发流程:
- 引入MyBatis的jar包并添加依赖
- 创建核心配置文件
- 创建实体类
- 创建Mapper映射文件
- 初始化sqlSessionFactory
- 利用Sqlsession对象操作数据