• 02【MyBatis框架的CRUD】


    二、MyBatis框架的CRUD

    重新搭建一个新的MyBatis环境,进行MyBatis的CRUD测试;

    参考:01【MyBatis-快速入门】

    2.1 新增

    2.1.1 dao接口

    package com.dfbz.dao;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    import com.dfbz.entity.Emp;
    
    public interface EmpDao {
        void save(Emp emp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.1.2 接口映射

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    
    <mapper namespace="com.dfbz.dao.EmpDao">
    
        
        <insert id="save" parameterType="com.dfbz.entity.Emp">
            insert into emp values(null,#{name},#{age},#{addr},#{salary})
        insert>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.1.3 代码测试

    package com.dfbz.test;
    
    import com.dfbz.dao.EmpDao;
    import com.dfbz.entity.Emp;
    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.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class Demo01 {
        @Test
        public void test1() throws IOException {
            //获取主配置文件流
            InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
    
            //获取工厂构造器对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    
            //获取session工厂
            SqlSessionFactory factory = builder.build(is);
    
            //获取session会话对象,与数据交互会话
           	/*
                true: 自动提交
                false: 手动提交(默认值)
             */
            SqlSession session = factory.openSession(true);			// 是否开启自动提交,默认值:false
    
            EmpDao empDao = session.getMapper(EmpDao.class);
    
            // 封装数据
            Emp emp = new Emp(null,"小兰",20,"湖北襄阳",5000.0);
    
            // 执行保持
            empDao.save(emp);
    
            //释放资源
            session.close();
    
            is.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    2.1.4 保持返回ID值

    Emp emp = new Emp(null, "小红", 18, "江西抚州", 7000.0);
    System.out.println("保存之前: " + emp);
    
    empDao.save(emp);
    
    System.out.println("保存之后前: " + emp);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    在这里插入图片描述

    1)方法一

    数据库查询自增长主键的值

    在dao接口中扩展一个方法:

    void save2(Emp emp);
    
    • 1

    在这里插入图片描述

    dao接口映射:

    
    <insert id="save2" parameterType="com.dfbz.entity.Emp">
    
        <selectKey keyColumn="id" keyProperty="id" resultType="Integer" order="AFTER">
            select LAST_INSERT_ID()
        selectKey>
        insert into emp values(null,#{name},#{age},#{addr},#{salary})
    insert>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试:

    在这里插入图片描述

    2)方法二

    适合支持主键自增长的数据库

    • 1)在dao接口中扩展一个新的方法:
    void save3(Emp emp);
    
    • 1
    • 2)在EmpDao.xml配置文件中编写:
    
    <insert id="save3" parameterType="com.dfbz.entity.Emp" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into emp values(null,#{name},#{age},#{addr},#{salary})
    insert>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 修改

    2.2.1 dao接口

    void update(Emp emp);
    
    • 1

    2.2.2 接口映射

    
    <update id="update" parameterType="com.dfbz.entity.Emp">
        update emp set name=#{name},age=#{age},addr=#{addr},salary=#{salary} where id=#{id}
    update>
    
    • 1
    • 2
    • 3
    • 4

    2.2.3 测试

    • 1)抽取创建Session的公共方法:
    private SqlSession session = null;
    private EmpDao empDao = null;
    
    @Before
    public void before() throws Exception {
        // 1. 创建Session工厂的构建对象
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
    
        // 2. 通过工厂构建对象来创建一个Session工厂
        SqlSessionFactory sessionFactory = factoryBuilder.build(Resources.getResourceAsStream("MyBatisConfig.xml"));
    
        // 3. 通过session工厂来创建session
        session = sessionFactory.openSession();
        
        // 4. 通过session获取Mapper接口
        empDao = session.getMapper(EmpDao.class);
    }
    
    @After
    public void after() throws Exception {
        session.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 2)测试代码:
    @Test
    public void test2() throws IOException {
        // 封装数据
        Emp emp = new Emp(1, "小灰", 22, "江西南昌", 5000.0);
    
        // 执行修改
        empDao.update(emp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3 删除

    2.3.1 dao接口

    void delete(Integer id);
    
    • 1

    2.3.2 接口映射

    
    <delete id="delete" parameterType="java.lang.Integer">
        delete from emp where id=#{id}
    delete>
    
    • 1
    • 2
    • 3
    • 4

    2.4 查询

    2.4.1 dao接口

    Emp findById(Integer id);
    
    List<Emp> findAll();
    
    • 1
    • 2
    • 3

    2.4.2 接口映射

    
    <select id="findById" parameterType="java.lang.Integer" resultType="com.dfbz.entity.Emp">
        select * from emp where id=#{id}
    select>
    
    
    <select id="findByNameLike" parameterType="java.lang.String" resultType="com.dfbz.entity.Emp">
        select * from emp where name like #{name}
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.5.3 测试

    • 测试代码:
    @Test
    public void test3() throws IOException {
        // 根据id查询
        Emp emp = empDao.findById(1);
        System.out.println(emp);
    }
    
    @Test
    public void test4() throws IOException {
    
        List<Emp> empList = empDao.findAll();
        for (Emp emp : empList) {
            System.out.println(emp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.5 统计

    2.5.1 dao接口

    Long count();
    
    • 1

    2.5.2 接口映射

    
    <select id="count" resultType="java.lang.Long">
        select count(1) from emp
    select>
    
    • 1
    • 2
    • 3
    • 4

    2.5.3 测试

    @Test
    public void test5() throws IOException {
        Long count = empDao.count();
        System.out.println("查询到: " + count + "条记录");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    平衡二叉树(AVL)【java实现+图解】
    拒绝求职诈骗,工作找好学会这一招!
    快递鸟顺丰、申通物流查询类通用接口文档
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园二手商品交易系统p11v7
    C++速通LeetCode简单第9题-二叉树的最大深度
    网易校园招聘历年经典面试题汇总:C++研发岗
    docker- compose部署rocketmq双主双从架构
    SSM整合框架(相关依赖)
    分布式事务的锁
    检测docker内存状态脚本
  • 原文地址:https://blog.csdn.net/Bb15070047748/article/details/127877392