JPA原生SQL實現(xiàn)增刪改查的示例詳解
原生SQL
JPA除了對JPQL提供支持外,還對原生SQL語句也提供了支持。下面小節(jié)一起來看看吧。
查詢單個
示例代碼:
@Test public void getSingle() { EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接 String sql = "select cid, cname, credit, end, num, start " + "from yootk.course where cid = ?1"; Query query = entityManager.createNativeQuery(sql); // 預處理sql query.setParameter(1, 1); Course course = (Course) query.getSingleResult(); loggerFactory.info("【執(zhí)行結(jié)果】:{}",course ); // 執(zhí)行sql JPAEntityFactory.close();// 關(guān)閉連接 }
執(zhí)行結(jié)果:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class look.word.po.Course
意思是 query.getSingleResult() 不能轉(zhuǎn)換成 Course類
修改代碼
執(zhí)行結(jié)果:
【執(zhí)行結(jié)果】:[1, Spring編程實戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
可以發(fā)現(xiàn),query.getSingleResult() 返回的是一個數(shù)組對象。不能轉(zhuǎn)換成Course也是正常的。后續(xù)文章會解決這個問題
查詢多個
實例代碼:
@Test public void getAllCourse() { EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接 String sql = "select cid, cname, credit, end, num, start " + "from yootk.course "; Query query = entityManager.createNativeQuery(sql); // 預處理sql List list = query.getResultList();// 執(zhí)行sql for (Object o : list) { loggerFactory.info("【執(zhí)行結(jié)果】:{}", o); } JPAEntityFactory.close();// 關(guān)閉連接 }
執(zhí)行結(jié)果:
【執(zhí)行結(jié)果】:[1, Spring編程實戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
【執(zhí)行結(jié)果】:[5, SpringCloud編程實戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
【執(zhí)行結(jié)果】:[6, SSM編程實戰(zhàn), 5, 2022-12-30, 88, 2022-09-19]
分頁模糊查詢
示例代碼:
@Test public void getAllCourseSplit() { int current = 2; int lineSize = 3; String keyWord = "%Spring%"; EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接 String sql = "select cid, cname, credit, end, num, start " + "from yootk.course where cname like :k1"; Query query = entityManager.createNativeQuery(sql); // 預處理sql query.setFirstResult((current - 1) * lineSize); // 等同于 limit ? query.setMaxResults(lineSize); // // 等同于 limit ?,? query.setParameter("k1", keyWord); List list = query.getResultList();// 執(zhí)行sql for (Object o : list) { loggerFactory.info("【執(zhí)行結(jié)果】:{}", o); } JPAEntityFactory.close();// 關(guān)閉連接
執(zhí)行結(jié)果:
執(zhí)行的sql: select cid,cname,credit,end,num,start from yootk.course where cname like ? limit ?,?
count
統(tǒng)計 模糊匹配到的行數(shù)
// 統(tǒng)計行數(shù) @Test public void getAllCourseCount() { String keyWord = "%Spring%"; EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接 String sql = "select count(*) from yootk.course where cname like :k1"; Query query = entityManager.createNativeQuery(sql); // 預處理sql query.setParameter("k1", keyWord); loggerFactory.info("【執(zhí)行結(jié)果】:{}", query.getSingleResult());// 執(zhí)行sql JPAEntityFactory.close();// 關(guān)閉連接 }
執(zhí)行結(jié)果
執(zhí)行的sql: select count(*) from yootk.course where cname like ?
更新
例如:我們想把學分小于5的課程全部提高到5
注意到:我們當前是未開啟事務的,觀察程序執(zhí)行結(jié)果。
@Test public void getUpdateCourse() { // 例如:我們想把學分小于5的課程全部提高到5 EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 獲取連接 //entityManager.getTransaction().begin(); // 開啟事務 String sql = "update yootk.course as c set c.credit = ?1 where c.credit <?2"; Query query = entityManager.createNativeQuery(sql); // 預處理sql query.setParameter(1, 5); query.setParameter(2, 5); loggerFactory.info("【執(zhí)行結(jié)果】:{}", query.executeUpdate());// 執(zhí)行sql //entityManager.getTransaction().commit(); // 提交事務 JPAEntityFactory.close();// 關(guān)閉連接 }
執(zhí)行結(jié)果:
異常提示信息為:說我們的 update / delete 操作需要事務的支持
把上敘代碼注釋掉的事務,放開執(zhí)行即可。
刪除指定id
示例代碼:
// 刪除指定id @Test public void deleteById() { EntityManager entityManager = JPAEntityFactory.getEntityManager(); // 等同于 獲取連接 entityManager.getTransaction().begin(); // 開啟事務 String deleteSql = "delete from yootk.course where cid = ?1"; Query query = entityManager.createNativeQuery(deleteSql); query.setParameter(1, 1); // 預處理sql 賦值 loggerFactory.info("【執(zhí)行結(jié)果】:{}", query.executeUpdate());// 執(zhí)行sql entityManager.getTransaction().commit(); // 提交事務 JPAEntityFactory.close();// 關(guān)閉連接 }
執(zhí)行結(jié)果
執(zhí)行的sql: delete from yootk.course where cid = ?
新增
實例代碼:
@Test public void addCourse() { EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于獲取連接 entityManager.getTransaction().begin(); //開啟事務 String addSql = "insert into yootk.course(cname, credit, end, num, start) " + "value(:cname,:credit,:end,:num,:start )"; Query query = entityManager.createNativeQuery(addSql); query.setParameter("cname", "java就業(yè)課程實戰(zhàn)"); // 對預處理參數(shù)賦值 query.setParameter("credit", 10); // 對預處理參數(shù)賦值 query.setParameter("start", DateUtil.stringToDate("2021-10-01")); // 對預處理參數(shù)賦值 query.setParameter("end", DateUtil.stringToDate("2022-10-01")); // 對預處理參數(shù)賦值 query.setParameter("num", 999); // 對預處理參數(shù)賦值 query.executeUpdate(); // 執(zhí)行最終sql entityManager.getTransaction().commit();// 提交事務 }
執(zhí)行結(jié)果:
到此這篇關(guān)于JPA原生SQL實現(xiàn)增刪改查的示例詳解的文章就介紹到這了,更多相關(guān)JPA SQL增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA實現(xiàn)監(jiān)測tomcat是否宕機及控制重啟的方法
這篇文章主要介紹了JAVA實現(xiàn)監(jiān)測tomcat是否宕機及控制重啟的方法,可實現(xiàn)有效的檢測及控制tomcat服務器運行,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08MyBatis直接執(zhí)行SQL的工具SqlMapper
今天小編就為大家分享一篇關(guān)于MyBatis直接執(zhí)行SQL的工具SqlMapper,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12