Mybatis實現部門表增刪改查以及排序

来源:https://www.cnblogs.com/resultset/archive/2018/08/19/Mybatis.html
-Advertisement-
Play Games

廢話不說,直接開門見山! 需要在WebContent下的lib下導入兩個包 mybatis-3.2.5.jar ojdbc6.jar 1 package com.xdl.entity; 2 3 import java.io.Serializable; 4 5 public class Dept im ...


廢話不說,直接開門見山!

需要在WebContent下的lib下導入兩個包

mybatis-3.2.5.jar

ojdbc6.jar

 

 1 package com.xdl.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Dept implements Serializable{
 6     private Integer deptno;//類型和名稱與表保持一致
 7     private String dname;
 8     private String loc;
 9     
10     public Integer getDeptno() {
11         return deptno;
12     }
13     public void setDeptno(Integer deptno) {
14         this.deptno = deptno;
15     }
16     public String getDname() {
17         return dname;
18     }
19     public void setDname(String dname) {
20         this.dname = dname;
21     }
22     public String getLoc() {
23         return loc;
24     }
25     public void setLoc(String loc) {
26         this.loc = loc;
27     }
28     
29     
30 }
Dept

 

 1 package com.xdl.Mapper;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.annotations.Param;
 6 
 7 import com.xdl.entity.Dept;
 8 
 9 public interface DeptMapper {
10     /**
11      * 查詢所有
12      * 
13      */
14     public List<Dept> findAll();
15 
16     /**
17      * 通過id查詢
18      * 
19      */
20     public Dept findById(int no);
21 
22     /**
23      * 插入
24      * 
25      */
26     public int save(Dept dept);
27 
28     /**
29      * 修改
30      * 
31      */
32     public int update(Dept dept);
33 
34     /**
35      * 通過id刪除
36      * 
37      */
38     public int delete(int no);
39 
40     /**
41      * 排序
42      * 
43      */
44     public List<Dept> findAllOrder(@Param("n") String no);
45 }
DeptMapper
 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <mapper namespace="com.xdl.Mapper.DeptMapper">
 5     <select id="findAll" resultType="com.xdl.entity.Dept">
 6         select * from dept
 7     </select>
 8     <select id="findById" parameterType="int" resultType="com.xdl.entity.Dept">
 9         select *
10         from dept where deptno = #{no}
11     </select>
12     <select id="findAllOrder" parameterType="String" resultType="com.xdl.entity.Dept">
13         select * from dept order by ${n}
14     </select>
15     <insert id="save" parameterType="com.xdl.entity.Dept">
16         insert into dept
17         (deptno,dname,loc) values (dept_seq.nextval,#{dname},#{loc})
18     </insert>
19     <update id="update">
20         update dept set dname = #{dname},loc = #{loc} where
21         deptno = #{deptno}
22     </update>
23     <delete id="delete">
24         delete from dept where deptno = #{no}
25     </delete>
26 </mapper>
deptmapper.xml
 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 4 <configuration>
 5     <!-- 將底層日誌列印 -->
 6     <settings>
 7         <setting name="logImpl" value="STDOUT_LOGGING" />
 8     </settings>
 9     <environments default="environment">
10         <environment id="environment">
11             <transactionManager type="JDBC" />
12             <!-- 指定資料庫連 -->
13             <dataSource type="POOLED">
14                 <property name="driver" value="oracle.jdbc.OracleDriver" />
15                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
16                 <property name="username" value="SCOTT" />
17                 <property name="password" value="tiger" />
18             </dataSource>
19         </environment>
20     </environments>
21     <!-- 指定SQL定義文件 -->
22     <mappers>
23         <mapper resource="com/xdl/sql/DeptMapper.xml" />
24     </mappers>
25 </configuration> 
sqlmap-config.xml
 1 package com.xdl.test;
 2 
 3 import java.io.Reader;
 4 
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 
10 public class MyBatisUtil {
11     static SqlSessionFactory factory;
12     static {
13         try {
14             String conf = "sqlmap-config.xml"; // 定義配置文件
15             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
16             Reader reader = Resources.getResourceAsReader(conf);
17             factory = builder.build(reader);
18         } catch (Exception e) {
19             e.printStackTrace();
20         }
21     }
22 
23     public static SqlSession getSession() {
24         SqlSession sqlSession = factory.openSession();
25         return sqlSession;
26     }
27 }
MybatisUtli

寫一個測試類(實現查詢和排序)

 1 package com.xdl.test;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.session.SqlSession;
 6 import org.junit.Test;
 7 
 8 import com.xdl.Mapper.DeptMapper;
 9 import com.xdl.entity.Dept;
10 
11 public class TestDeptMapper {
12     /**
13      * 查詢所有
14      */
15     @Test
16     public void testFindAll() {
17         SqlSession sqlSession = MyBatisUtil.getSession();
18         // sqlSession.getMapper(介面.class); 根據DeptMapper映射器介面動態生成實現對象
19         DeptMapper deptDao = sqlSession.getMapper(DeptMapper.class);
20         System.out.println(deptDao.getClass().getName());
21         List<Dept> list = deptDao.findAll();
22         for (Dept dept : list) {
23             System.out.println(dept.getDeptno() + ":" + dept.getDname() + ":" + dept.getLoc());
24         }
25         sqlSession.close();
26     }
27 
28     /**
29      * 進行排序
30      */
31     @Test
32     public void testOrderBy() {
33         SqlSession sqlSession = MyBatisUtil.getSession();
34         // sqlSession.getMapper(介面.class); 根據DeptMapper映射器介面動態生成實現對象
35         DeptMapper deptDao = sqlSession.getMapper(DeptMapper.class);
36         System.out.println(deptDao.getClass().getName());
37         List<Dept> list = deptDao.findAllOrder("deptno");
38         for (Dept dept : list) {
39             System.out.println(dept.getDeptno() + ":" + dept.getDname() + ":" + dept.getLoc());
40         }
41         sqlSession.close();
42     }
43 }
TestDeptMapper

寫一個測試類(實現增刪改查排序)

 1 package com.xdl.test;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.ibatis.session.SqlSession;
 6 import org.junit.Test;
 7 
 8 import com.xdl.entity.Dept;
 9 
10 public class TestDept {
11     private static SqlSession sqlSession = MyBatisUtil.getSession();
12 
13     /**
14      * 查詢所有
15      */
16     @Test
17     public void testFindAll() {
18         // 使用sqlSession操作SQL selectList("id",parameterType值)
19         List<Dept> list = sqlSession.selectList("com.xdl.Mapper.DeptMapper.findAll");
20         for (Dept dept : list) {
21             System.out.println(dept.getDeptno() + ":" + dept.getDname() + ":" + dept.getLoc());
22         }
23         sqlSession.close();
24     }
25 
26     /**
27      * 根據ID查詢
28      */
29     @Test
30     public void testFindById() {
31         Dept dept = sqlSession.selectOne("com.xdl.Mapper.DeptMapper.findById", 10);
32         if (dept != null) {
33             System.out.println(dept.getDeptno() + ":" + dept.getDname() + ":" + dept.getLoc());
34         } else {
35             System.out.println("查詢結果為空~~");
36         }
37         sqlSession.close();
38     }
39 
40     /**
41      * 插入
42      */
43     @Test
44     public void testSave() {
45         Dept dept = new Dept();
46         dept.setDname("xian");
47         dept.setLoc("dayanta");
48         int rows = sqlSession.insert("com.xdl.Mapper.DeptMapper.save", dept);
49         String str = "條記錄插入成功";
50         System.out.println(rows + str);
51         sqlSession.commit();
52         sqlSession.close();
53     }
54 
55     /**
56      * 修改
57      */
58     @Test
59     public void testUpdate() {
60         Dept dept = new Dept();
61         dept.setDeptno(10);
62         dept.setDname("spring");
63         dept.setLoc("bj");
64         int rows = sqlSession.update("com.xdl.Mapper.DeptMapper.update", dept);
65         String str = "條記錄修改成功";
66         System.out.println(rows + str);
67         sqlSession.commit();
68         sqlSession.close();
69     }
70 
71     /**
72      * 通過id刪除
73      */
74     @Test
75     public void testDelete() {
76         Dept dept = new Dept();
77         int rows = sqlSession.delete("com.xdl.Mapper.DeptMapper.delete", 1);
78         String str = "條記錄刪除成功";
79         System.out.println(rows + str);
80         sqlSession.commit();
81         sqlSession.close();
82     }
83 }
TestDept

1.MyBatis中定義SQL語句時,如果SQL里有?號,就必須寫parameterType=””參數是int就寫對應的類型並且名字可以自定義

2. 查詢的時候最後會返回一個結果集對象,所以就必須在後面繼續追加resultType=包名.實體類名

3 執行DML的時候裡面要執行多個參數的時候,可以選擇集合或者對象,

parameterType=包名.實體類名.參數,類型和實體類要一致,參數不一致,可以通過給sql起別名解決,類型不一致就需要對框架里的部分參數進行轉換

4 通過實現增刪改查,發現DQL有resultType屬性,DML都沒有resultType屬性              數據訪問層(Dao)

5 mapper.xml映射器里的<mapper namespace=包名.介面名,才可以 達到Mapper.xml里的資料庫代碼映射到介面中

總結為:

a. Mapper介面中方法名和sql定義id值保持一致

b. Mapper介面中方法參數類型和sql定義中parameterType類型保持一致

c. Mapper介面中方法返回類型,多行查詢返回List,單行查詢返回對象類型和resultType保持一致DML返回類型為int或void

 

Mapper映射器規則

1 Mapper介面中方法名與SQL定義id值保持一致

2 Mapper介面中方法參數類型與SQL定義中parameterType類型保持一致

3 Mapper介面中方法返回類型,多行查詢返回List、單行返回對象,類型與resultType 持一致;增刪改操作返回類型為intvoid

4 SQL定義文件namespace需要指定為"包名.介面名"

 

 

參數映射中${}和#{}的區別

1 #{}參數映射機制採用的是PrepareStatement,將SQL和參數分開發送

2 ${}參數映射機制採用Statement,將SQL和參數拼一起發送執行

3 建議採用#{}方式,更安全

4 ${}適合用在欄位名或表名位置;#{}適合用在欄位值位置

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 經過三次重寫,和合計30多個小時的開發,終於把這個簡單的邏輯做完了。(自己太笨) 因為剛剛接觸C,寫的代碼實現方式肯定有不對的地方,邏輯上可能也有疏漏,如果有看官發現問題還望及時給予指正,謝謝。 一、整體概括: 1.1目標: 維護一個單獨的緩存空間,該空間是低一級存儲的緩存。緩存的大小比低級存儲的大 ...
  • 原創 http://acm.hdu.edu.cn/showproblem.php?pid=1003 題目要求求出一個序列裡面的最大序列和,序列要求是連續的,給出最大序列和,序列首元素下標和尾元素下標,按特定的格式輸出。 解題思路: 動態規劃,我們可以將所有序列按以序列中的元素a[i](i=1~n)結 ...
  • 一、包裝類 java是一門面向對象的語言,秉承一切皆對象的思想。 可java中有一些基本數據類型並不是對象,有時可能需要將它們變為對象。 這時就需要用到我們的包裝類了。 通過對應的包裝類可以讓基本屬性擁有對象的特性,之後可以使用相關的操作。 自動裝箱與自動拆箱 通過上面代碼我們可以看出,都是手動裝箱 ...
  • Guido van Rossum,Python之父,就是他用一部英國喜劇《蒙提·派森的飛行馬戲團》(Monty Python and the Flying Circus)命名了這門語言。1989年,他在荷蘭創造了Python(果然名字里有Van的都是荷蘭人嗎); 1991年初,Python發佈了第一 ...
  • 接上一篇,前兩篇解決中文的問題主要是在字元集上做的手腳,即將中文轉成英文,但是有一種情況我們都來不及做轉換,即登錄時伺服器直接返回了中文內容: 此時程式報瞭如下錯誤,其實還是字元集問題: 為此:我們可以在接收數據的時候直接對其進行異常捕捉,如果異常則換一種解碼方式: 上一篇:ssh.invoke_s ...
  • 信號signal 是python進程間進行信號發送的一種機制,其原理是操作系統對進程的控制,是一種程式中斷 一個進程一旦接收到信號就會打斷原來的程式執行流程來處理信號。 那麼singanl到底有什麼用呢? siganl的應用: 1. 故障定位技術(進程的底層故障,例如進程突然中斷和一些可能性較小的故 ...
  • luogu原題 最近剛學了博弈論,拿來練練手qwq 其實和數值的大小並沒有關係 我們用$N/P$態來表示必勝/必敗狀態 先在草稿紙上探究硬幣在最左側(其實左右側是等價的)的一條長鏈的$N/P$態,設鏈長為$n$ 我們用$1$代替其他所有非$0$數 $n=2: 11$ $N$態 $n=3: 111$ ...
  • 近一個月一直在寫業務,空閑時間刷刷leetcode,刷題過程中遇到了一道比較有意思的題目,和大家分享。 題目描述: 給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。返回被除數 dividend 除以除數 divisor 得到的商。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...