Mybatis入门学习

一、什么是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的开发流程:

  1. 引入MyBatis的jar包并添加依赖
  2. 创建核心配置文件
  3. 创建实体类
  4. 创建Mapper映射文件
  5. 初始化sqlSessionFactory
  6. 利用Sqlsession对象操作数据
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值