【MyBatis】MyBatis實現CRUD操作
阿新 • • 發佈:2019-01-24
\n \t 事務 time nihao name conf bye class ora
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
程序源碼
【MyBatis】MyBatis實現CRUD操作