• 【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

    程序源码

  • 相关阅读:
    CPP Info Memo part3
    在Google搜索结果显示原始链接(转自 月光博客)
    libc 之 locales
    Git 分支管理与本地 repository 创建
    py2exe issue: ImportError: No module named _fontdata_enc_winansi (http://stackoverflow.com/)
    CPP Info Memo (Part 1)
    CPP Info Memo part2
    HOWTO: Increase write speed by 'aligning' FAT32(通过对齐 FAT32 提高U盘访问速度, 转载)
    (转载)Gentoo中文man乱码
    如何选择开源许可证?(转载)
  • 原文地址:https://www.cnblogs.com/yan-lei/p/10311874.html
Copyright © 2020-2023  润新知