【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 + "\n \t"
+ 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("\t" + 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("\t" + 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