zoukankan      html  css  js  c++  java
  • 【MyBatis】MyBatis实现CRUD操作

    1、实现基本CRUD功能

    使用MyBatis对数据完整的操作,也就是CRUD功能的实现。根据之前的内容,要想实现CRUD,只需要进行映射文件的配置。

    范例:修改EmpMapper.xml文件,实现CRUD

    <?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">
      <!--     每个POJO都对应MyBatis的一个命名空间,不能重复。
              resultType使用全路径
              设置命名空间,可以与不同表的同类型操作进行区分,使用时以“namespace.id”的方式调用;命名空间按照表名称给出   -->
    <mapper namespace="com.github.logsave.pojo.EmpMapper">
    
      <insert id="creatOne" parameterType="com.github.logsave.pojo.Emp">
          INSERT INTO emp(empno,ename,job,mgr,hiredate,sal)
          VALUES (#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal})
      </insert>
    
      <!-- 数据更新操作,最简单的更新一定是基于Emp类的数据实现的 -->
      <update id="updateOne" parameterType="com.github.logsave.pojo.Emp">
          UPDATE emp SET empno=#{empno}, ename=#{ename}, job=#{job}, 
              mgr=#{mgr}, hiredate=#{hiredate}, sal=#{sal}
          WHERE empno={empno}
      </update>
    
      <!-- 删除数据,一般根据主键删除empno,empno这里是Integer类型 -->
      <delete id="removeOne" parameterType="java.lang.Integer">
          DELETE FROM emp WHERE empno=#{empno}
      </delete>
    
      <!-- 根据empno查询 -->
      <select id="selOne" resultType="com.github.logsave.pojo.Emp">
        SELECT empno,ename,job,mgr,hiredate,sal FROM emp 
        WHERE empno=#{empno}
      </select>
    
      <!-- 查询全部数据,此时配置的resultType表示当前查询结果中每一条数据返回的对象类型,不是整个方法的返回。 -->
      <select id="selAll" resultType="com.github.logsave.pojo.Emp">
           SELECT empno,ename,job,mgr,hiredate,sal FROM emp 
      </select>
    </mapper>

    此时已经完成了映射文件的配置。就可以利用SqlSession类对象完成具体的操作,方法如下:

    • 增加数据:public int insert(String statrment, Object parameter), 返回增加的行数;
    • 删除数据:public int delete(String statrment, Object parameter), 返回删除的行数;
    • 更新数据:public int update(String statrment, Object parameter), 返回更新的行数;
    • 查询单个数据:public T selectOne(String statrment, Object parameter);
    • 查询全部数据:public List selectList(String statement)。

    测试CRUD功能,分别编写函数进行测试。

    范例:执行函数主方法

    public static void main(String[] args) {
    
        try {
            // 1、取得操作的SqlSession对象
            String resource = "mybatis-config.xml"; // MyBatis配置文件路径
            Reader reader = Resources.getResourceAsReader(resource); // 当前配置文件输入流
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 数据库会话工厂
            SqlSession sqlSession = sqlSessionFactory.openSession(); // 取得连接
                
                // 2、操作简单Java类    
                // 为了测试方便,将各个方法分别编写函数进行测试。在函数中改变方法内容进行测试。
    //            creat(sqlSession);                     // 增加数据
    //            selectByEmpNo(sqlSession,7499);     // 按empno查询数据    
    //            update(sqlSession);                    // 更新数据
    //            remove(sqlSession);                    // 删除数据
    //            selectAll(sqlSession);                // 查询全部数据
            
            sqlSession.close();        // 关闭连接
        } catch(IOException e) {
            e.printStackTrace();
        }
    }

    范例:增加数据

    public static void creat(SqlSession sqlSession) {
        Emp emp = new Emp();
        emp.setEmpno(7369); 
        emp.setEname("SMITH");
        emp.setJob("CLERK");
        emp.setMgr(7902);
        
        Calendar c = Calendar.getInstance();
        c.set(1980,10,17);
        Date date = c.getTime();
        emp.setHiredate(date);
        
        emp.setSal(800.00);
            
        System.out.println("【INSERT】数据更新行数:" 
        + sqlSession.insert("com.github.logsave.pojo.EmpMapper.creatOne",emp)); sqlSession.commit(); // 事务提交 }
    【INSERT】数据更新行数:1

    范例:删除数据

    public static void remove(SqlSession sqlSession) {
        int empno = 7499;     // 删除数据的empno
        System.out.println("【DELETE】数据更新行数:" + 
            sqlSession.delete("com.github.logsave.pojo.EmpMapper.removeOne",empno));
        sqlSession.commit();
    }
    【DELETE】数据更新行数:1

    范例:更新数据

    public static void update(SqlSession sqlSession) {
        Emp emp = new Emp();
        emp.setEmpno(7369); 
        emp.setEname("Logsave");
        emp.setJob("MANAGER");
    //    emp.setMgr(7839);   // 注释掉数据库中对应值为null
        
        Calendar c = Calendar.getInstance();
        c.set(2015,10,20);
        Date date = c.getTime();
        emp.setHiredate(date);
        emp.setSal(1600.00);
            
        System.out.println("【UPDATE】数据更新行数:" 
        + sqlSession.update("com.github.logsave.pojo.EmpMapper.updateOne",emp)); sqlSession.commit(); // 事务提交 }
    【UPDATE】数据更新行数:1

    范例:查询单条数据

    public static void selectByEmpNo(SqlSession sqlSession) {
        int empno = 7369;
        System.out.println("【SELECT】selectByEmpno:" + empno + "
     	" 
        + sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.selOne", empno)); }
    【SELECT】selectByEmpno:7369
         Emp [empno=7369, ename=Logsave, job=MANAGER, mgr=null, hiredate=Fri Nov 20 00:00:00 CST 2015, sal=1600.0]

    范例:查询全部数据

    public static void selectAll(SqlSession sqlSession) {
        List<Emp> empList = sqlSession.selectList("com.github.logsave.pojo.EmpMapper.selAll");
        System.out.println("【SELECT】selectAll:");
        for(Emp emp: empList) {
            System.out.println("	" + emp);
        }    
    }
    【SELECT】selectAll:
        Emp [empno=7369, ename=Logsave, job=MANAGER, mgr=null, hiredate=Fri Nov 20 00:00:00 CST 2015, sal=1600.0]
        Emp [empno=7521, ename=WARD, job=SALESMAN, mgr=7698, hiredate=Thu Oct 20 00:00:00 CST 1983, sal=1250.0]

    现在完成了MyBatis的CRUD操作,已经可以进行简单的操作了。

    2、分页显示

    实现了CRUD之后,我们就应该实现数据的分页显示。分页显示所需要的参数:

    • 模糊查询的列:column;
    • 模糊查询关键字:keyWord;
    • 开始行:start(currentPage *lineSize)
    • 取得数据的长度:lineSize。

    注意:MySQL中使用LIMIT进行分页,在Oracle中使用伪列ROWNUM进行分页操作。

    实现分页操作需要多个参数,那么这些参数需要一次性传递完成,这个时候就需要设置Map集合,利用Map集合完成参数传递。

    范例:修改EmpMapper.xml文件

      <!-- 定义分页查询,其中所有的参数都利用Map集合传递,返回的每行数据类型为Emp -->
      <select id="selAllBySplit" parameterType="java.util.Map" resultType="com.github.logsave.pojo.Emp">
        SELECT empno,ename,job,mgr,hiredate,sal FROM emp
        WHERE ${column} LIKE #{keyWord}
        LIMIT #{start}, #{lineSize}
      </select>
      
      <!-- 查询全部数据量,参数使用Map集合,返回COUNT()的统计结果  -->
      <select id="count" parameterType="java.util.Map" resultType="java.lang.Integer">
         SELECT COUNT(empno) FROM emp 
         WHERE ${column} LIKE #{keyWord}
      </select>

    下面的查询依然需要的是查询全部数据,但是需要传递参数:

    • 查询全部数据:public List selectList(String statement)

    范例:实现分页查询

    public static void split(SqlSession sqlSession) {
        // 分页操作必要的参数
        int currentPage = 1; // 当前所在页
        int lineSize = 3; // 每页显示的长度
        // 需要将参数设置为Map集合后传递到调用的方法里
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("column", "ename");
        map.put("keyWord", "%o%");
        map.put("start", (currentPage - 1) * lineSize);
        map.put("lineSize", lineSize);
        List<Emp> empList = sqlSession.selectList("com.github.logsave.pojo.EmpMapper.selAllBySplit", map);
        System.out.println("【SELECT】分页操作:");
        for(Emp emp: empList) {
            System.out.println("	" + emp);
        }    
    }
    【SELECT】分页操作:
        Emp [empno=7369, ename=Logsave, job=MANAGER, mgr=null, hiredate=Fri Nov 20 00:00:00 CST 2015, sal=1600.0]
        Emp [empno=7777, ename=Hello, job=work, mgr=8888, hiredate=Tue Jan 01 00:00:00 CST 2019, sal=1800.0]
        Emp [empno=7771, ename=nihao, job=work, mgr=8888, hiredate=Mon Feb 02 00:00:00 CST 2015, sal=1800.0]

    范例:统计数据行数

    public static void count(SqlSession sqlSession) {
        Map<String, Object> map = new HashMap<String, Object>(); 
        map.put("column", "ename");
        map.put("keyWord", "%o%");
        System.out.println("【COUNT】数据个数:" 
        + sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.count", map) );
    }
    【COUNT】数据个数:3

    程序源码

  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/yan-lei/p/10311874.html
Copyright © 2011-2022 走看看