MyBatis學習--簡單的增刪改查(三)

2021-02-14 中軟IT

MyBatis實例

  應用MyBatis來實現簡單的增刪改查,下面分別實現:

  對象類如下:

 1 public class User {

 2     private int id;

 3     private String username;// 用戶姓名

 4     private String sex;// 性別

 5     private Date birthday;// 生日

 6     private String address;// 地址

 7     public int getId() {

 8         return id;

 9     }

10     public void setId(int id) {

11         this.id = id;

12     }

13     public String getUsername() {

14         return username;

15     }

16     public void setUsername(String username) {

17         this.username = username;

18     }

19     public String getSex() {

20         return sex;

21     }

22     public void setSex(String sex) {

23         this.sex = sex;

24     }

25     public Date getBirthday() {

26         return birthday;

27     }

28     public void setBirthday(Date birthday) {

29         this.birthday = birthday;

30     }

31     public String getAddress() {

32         return address;

33     }

34     public void setAddress(String address) {

35         this.address = address;

36     }

37     @Override

38     public String toString() {

39         // TODO Auto-generated method stub

40         return this.id+"-"+this.username+"-"+this.sex+"-"+this.address+"-"+this.birthday.toString();

41     }

42     

43 }

View Code

 

  SqlMapConfig.xml配置如下:

 

 1 <configuration>

 2     <!-- 和spring整合後 environments配置將廢除-->

 3     <environments default="development">

 4         <environment id="development">

 5         <!-- 使用jdbc事務管理-->

 6             <transactionManager type="JDBC" />

 7         <!-- 資料庫連接池-->

 8             <dataSource type="POOLED">

 9                 <property name="driver" value="com.mysql.jdbc.Driver" />

10                 <property name="url" value="jdbc:mysql://localhost:3306/shop?characterEncoding=utf-8" />

11                 <property name="username" value="root" />

12                 <property name="password" value="" />

13             </dataSource>

14         </environment>

15     </environments>

16     <mappers>

17         <mapper resource="sqlmap/User.xml"/>

18     </mappers>

19 </configuration>

View Code

 

  1、用戶id查詢一個用戶信息

  映射文件如下:

 

1 <mapper namespace="user">

2     <select id="findUserById" parameterType="int" resultType="com.luchao.mybatis.first.po.User">

3         select * from user where id = #{id}

4     </select>

5 </mapper>

 

  注意:namespace :命名空間,對sql進行分類化管理,用於隔離sql語句。

  id:和namespace 一起標識statement。

  parameterType:定義輸入到sql中的映射類型,#{id}表示使用preparedstatement設置佔位符號並將輸入變量id傳到sql。

 

  resultType:定義結果映射類型。

  代碼:

 1 @Before

 2     public void createSqlSessionFactory() throws IOException{

 3         //配置文件

 4         String resource = "SqlMapConfig.xml";

 5         InputStream inputStream = Resources.getResourceAsStream(resource);

 6         //使用SqlSessionFactoryBuilder從xml配置文件中加載sqlSessionFactory

 7         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 8     }

 9     //根據id查詢用戶

10     @Test

11     public void findUserByIdTest(){

12         //資料庫會話實例

13         SqlSession session = null;

14         try {

15             // 創建資料庫會話實例sqlSession

16             session = sqlSessionFactory.openSession();

17             // 查詢單個記錄,根據用戶id查詢用戶信息

18             User user = session.selectOne("user.findUserById", 10);

19             System.out.println(user);

20         } catch (Exception e) {

21             // TODO Auto-generated catch block

22             e.printStackTrace();

23         } finally{

24             if(session!=null){

25                 session.close();

26             }

27         }

28     }

  2、根據用戶名模糊查詢用戶信息

  映射文件:

1 <select id="findUserByName" parameterType="java.lang.String" resultType="com.luchao.mybatis.first.po.User">

2         select * from user where username like '%${value}%'

3 </select>

  #{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。

    ${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。

  代碼:

 

 1 //根據用戶名模糊查詢用戶

 2     @Test

 3     public void findUserByNameTest(){

 4             //資料庫會話實例

 5             SqlSession session = null;

 6             try {

 7                 // 創建資料庫會話實例sqlSession

 8                 session = sqlSessionFactory.openSession();

 9                 // 查詢多個記錄,根據用戶姓名模糊查詢用戶信息

10                 List<User> userList = session.selectList("user.findUserByName", "張");

11                 System.out.println(userList.size());

12             } catch (Exception e) {

13                 // TODO Auto-generated catch block

14                 e.printStackTrace();

15             } finally{

16                 if(session!=null){

17                     session.close();

18                 }

19             }

20 }

 

  selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則拋出異常:

1 org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3

2 at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

    selectList可以查詢一條或多條記錄。

  3、添加用戶

  映射文件:

 

1 <insert id="insertUser" parameterType="com.luchao.mybatis.first.po.User">

2         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

3             select LAST_INSERT_ID()

4         </selectKey>

5         insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address});

6     </insert>

 

  這裡要注意,如果mysql是自增主鍵,映射文件如下:

1 insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">

2         <!-- selectKey將主鍵返回,需要再返回 -->

3         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

4             select LAST_INSERT_ID()

5         </selectKey>

6        insert into user(username,birthday,sex,address)

7         values(#{username},#{birthday},#{sex},#{address});

8 </insert>

  添加selectKey實現將主鍵返回

  keyProperty:返回的主鍵存儲在pojo中的哪個屬性

  order:selectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成,所以這裡selectKey的執行順序為after

  resultType:返回的主鍵是什麼類型

  LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。

  mysql是UUID實現,映射文件如下:

1 <insert  id="insertUser" parameterType="cn.luchao.mybatis.po.User">

2 <selectKey resultType="java.lang.String" order="BEFORE" 

3 keyProperty="id">

4 select uuid()

5 </selectKey>

6 insert into user(id,username,birthday,sex,address) 

7          values(#{id},#{username},#{birthday},#{sex},#{address})

8 </insert>

9 注意這裡使用的order是「BEFORE」

 

  Oracle使用序列實現,映射文件如下:

1 <insert  id="insertUser" parameterType="cn.luchao.mybatis.po.User">

2 <selectKey resultType="java.lang.Integer" order="BEFORE" 

3 keyProperty="id">

4 SELECT 自定義序列.NEXTVAL FROM DUAL

5 </selectKey>

6 insert into user(id,username,birthday,sex,address) 

7          values(#{id},#{username},#{birthday},#{sex},#{address})

8 </insert>

9 注意這裡使用的order是「BEFORE」

  代碼:

 1 //插入用戶

 2         @Test

 3         public void insertUserTest(){

 4                 //資料庫會話實例

 5                 SqlSession session = null;

 6                 try {

 7                     // 創建資料庫會話實例sqlSession

 8                     session = sqlSessionFactory.openSession();

 9                     //添加用戶信息

10                     User user = new User();

11                     user.setAddress("上海");

12                     user.setBirthday(new Date());

13                     user.setSex("1");

14                     user.setUsername("王小二");

15                     session.insert("insertUser",user);

16                     //提交事務

17                     session.commit();

18                 } catch (Exception e) {

19                     // TODO Auto-generated catch block

20                     e.printStackTrace();

21                 } finally{

22                     if(session!=null){

23                         session.close();

24                     }

25                 }

26         }

  4、刪除用戶

  映射文件:

1 <delete id="deleteUser" parameterType="int">

2         delete from user where id=#{id}

3     </delete>

  代碼:

 1 //刪除用戶

 2                 @Test

 3                 public void deleteUserTest(){

 4                         //資料庫會話實例

 5                         SqlSession session = null;

 6                         try {

 7                             // 創建資料庫會話實例sqlSession

 8                             session = sqlSessionFactory.openSession();

 9                             session.delete("deleteUser",30);

10                             //提交事務

11                             session.commit();

12                         } catch (Exception e) {

13                             // TODO Auto-generated catch block

14                             e.printStackTrace();

15                         } finally{

16                             if(session!=null){

17                                 session.close();

18                             }

19                         }

20                 }

  5、修改用戶:

  映射文件:

1 <update id="updateUser" parameterType="com.luchao.mybatis.first.po.User">

2         update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}

3         where id=#{id}

4     </update>

  代碼:

 1 //修改用戶

 2                 @Test

 3                 public void updteaUserTest(){

 4                         //資料庫會話實例

 5                         SqlSession session = null;

 6                         try {

 7                             // 創建資料庫會話實例sqlSession

 8                             session = sqlSessionFactory.openSession();

 9                             //修改用戶信息

10                             User user = new User();

11                             user.setId(28);

12                             user.setAddress("上海");

13                             user.setBirthday(new Date());

14                             user.setSex("0");

15                             user.setUsername("王小二1");

16                             session.update("updateUser", user);

17                             //提交事務

18                             session.commit();

19                         } catch (Exception e) {

20                             // TODO Auto-generated catch block

21                             e.printStackTrace();

22                         } finally{

23                             if(session!=null){

24                                 session.close();

25                             }

26                         }

27                 }

MyBatis解決JDBC編程的問題 

  1、 資料庫連結創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連結池可解決此問題。

  解決:在SqlMapConfig.xml中配置數據連結池,使用連接池管理資料庫連結。

  2、 Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

  解決:將Sql語句配置文件中與java代碼分離。

  3、 向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和參數一一對應。

  解決:Mybatis自動將java對象映射至sql語句,通過statement中的parameterType定義輸入參數的類型。

  4、 對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo對象解析比較方便。

  解決:Mybatis自動將sql執行結果映射至java對象,通過statement中的resultType定義輸出結果的類型。

來源:網絡。若涉及版權問題,煩請原作者聯繫我們,我們會在24小時內刪除處理,謝謝!

中軟高科

微信號:javaedu


(長按上圖,彈出「識別二維碼」後可快速關注)

相關焦點

  • 使用mybatis框架,完成增刪改查操作
    mybatis框架的繼續學習,安排如下:對昨天學習的內容做個小結,其中補充一個昨天忽視的問題。資料庫無外乎就是增刪改查,所以使用mybatis做一個完整的crud操作。一、mybatis使用步驟回顧主要是涉及到配置文件的編寫,其中又包含核心配置文件和映射文件。創建mybatis-config.xml核心配置文件。
  • Java Mybatis CRUD增刪改查
    淡若清風xxx系列學習課程,通俗易懂,基於xxx版本,歡迎大家一起學習收藏並轉發呦,有問題可以直接聯繫作者!
  • java 小工具 | 封裝通用的 Mybatis 生成模板 |1 秒寫完增刪改查
    /2019/07/23/1563857782748.html今天小刀和各位小夥伴們一起來深入下這個問題,我們來研究下怎麼去封裝一個通用的Mybatis模板,讓簡單的增刪改查操作,直接通過我們的代碼生成工具就能解決,讓工具從demo級別上升到生產可用的項目mybatis簡單介紹相信很多小夥伴都已經用過Mybatis了,很簡單方便, 在springboot的集成環境裡面,寫個DAO
  • Springboot+MybatisPlus高效實現增刪改查
    Mapper接口:就是我們平常所說的Dao層暴露的方法所在接口,接口中的方法對應xml文件中對應的sql,封裝了一些常用的增刪改查方法。service接口+service實現類:集成了Mybatis-plus的封裝類,封裝了一些常用的增刪改查方法,默認引入了對應的Mapper。
  • 精講Mybatis框架對資料庫增刪改查操作
    在項目開發中我們會做一種底層方法抽取來實現不同條件的增刪改查。下面請看java代碼很簡單只有兩行代碼。下面請看執行結果刷新navicat,可以看到表中id為30的章子怡已經被刪除了。以上就是我們通過MyBatis框架對資料庫進行基本的增刪改查操作。
  • asp.net連接MySQL,在GridView上實現增刪改查:前臺配置參數實現
    asp.net中如果想要在GridView控制項上實現增刪改查,通過給GridView添加數據源就可以實現,前提是使用的資料庫必須是數據源中有的。在SqlDataSource控制項中添加數據源最方便的是使用SQLServer、Access資料庫,但是有很多項目也會用到mysql資料庫,但是SqlDataSource中沒有提供mysql資料庫的連接,所以如果想要在GridView中通過配置來實現增刪改查mysql資料庫,是比SQLserver資料庫複雜。
  • mysql資料庫的基本增刪改查操作總結
    一、插入數據1、向所有欄位插入2、向指定欄位插入二、修改數據當然,我們也可以根據條件進行修改數據,比如使用where進行篩選即可,但這裡只給出一個最簡單的。三、刪除數據同樣可以根據where進行有條件的刪除。四、查詢數據這個查詢數據是最麻煩的,我們在這裡給出一些常見的查詢。
  • 「極客新課」第01.15期JDBC 連接資料庫及增刪改查操作
  • 重學Java 設計模式:實戰代理模式「模擬mybatis-spring中定義DAO...
    三、代理模式介紹代理模式,圖片來自 refactoringguru.cn代理模式有點像老大和小弟,也有點像分銷商。另外像我們常用的MyBatis,基本是定義接口但是不需要寫實現類,就可以對xml或者自定義註解裡的sql語句進行增刪改查操作。
  • 五大框架之MyBatis面試經常被問到的問題
    前面講了springmvc和hibernate的一些原理和使用,有些朋友私信我問能不能講一下面試中經常遇到的問題,那麼今天就不講mybatis在項目中怎麼使用的,著重談一下我經常遇到的一些問題吧,無論是筆試題還是面試官問到的一些問題,能想起來的都列舉了下來。
  • springboot+jpa+thymeleaf實現信息增刪改查功能
    掃碼關注回復【增刪該查】獲取源碼如果你在運行這個代碼的過程中有遇到問題,請加小編微信xxf960513,我拉你進對應微信學習群!!幫助你快速掌握這個功能代碼!$.fn.datepicker.dates['cn'] = { days : [ "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" ], daysShort : [ "周日", "周一", "周二", "周三", "周四", "周五", "周六" ], daysMin : [ "日", "一", "二", "
  • Mybatis 通用 Mapper 3.5.0 發布
    MyBatis 通用 Mapper 極其方便的使用 MyBatis 單表的增刪改查,支持單表操作,不支持通用的多表聯合查詢。通用 Mapper 可以極大的方便開發人員。可以隨意的按照自己的需要選擇通用方法,還可以很方便的開發自己的通用方法。通用 Mapper 更新日誌兼容 mbg 1.3.6 版本。
  • mybatis-plus 2.1.8 發布,代號:囍
    mybatis-plus 是一款 mybatis 動態 SQL 自動注入 mybatis 增刪改查 CRUD 操作中間件。
  • Mybatis初始化過程簡單總結
    前面連續多篇文章都是在數據mybatis的初始化過程,目前基本完成,是時候做一個總結了。上圖中只畫出了SqlSessionFactory初始化過程以及mapper的加載過程,由於其他比如Configuration的屬性、別名、插件、數據源配置、類型映射處理器的初始化過程比較簡單並沒有囊括進去。
  • mybatis-plus 2.1.8-SNAPSHOT 發布,代號:翻車魚
    mybatis-plus 是一款 mybatis 動態 SQL 自動注入 mybatis 增刪改查 CURD&nbsp;操作中間件。
  • DDL之資料庫--增刪改查
    create database dt55-mysql;2、show databases3、查看當前用戶連接的是哪個資料庫:select database();4、查看指定的資料庫下有哪些表:show tables  DDL表操作DDL之對表的增刪改查
  • Mybatis 通用 Mapper 3.4.6: Example 新增 builder 模式
    MyBatis 通用 Mapper 極其方便的使用 MyBatis 單表的增刪改查,支持單表操作,不支持通用的多表聯合查詢。通用 Mapper 可以極大的方便開發人員。可以隨意的按照自己的需要選擇通用方法,還可以很方便的開發自己的通用方法。
  • MySQL(二):數據的增刪改查
    修改數據在MySQL中,我們使用alter table 語句來修改表名、欄位名或者數據類型,也可以增刪欄位(前面已經使用到)。該語句的使用非常廣泛,是修改表結構的常用語句。查詢數據SQL的查詢功能是使用最頻繁的,涉及到select語句、常用數學函數、子查詢、單表查詢、多表查詢等等,內容相對複雜,本文僅對select語句進行簡單學習,其餘內容將在後期的文章中一一介紹。
  • 「謝燦asp.net三層架構」3、創建增刪改查及複雜操作的存儲過程
    創建存儲過程的語法創建存儲過程注意事項根據實際需要,確定創建存儲過程類型(增刪改查)查詢條件分為模糊查詢和確切查詢。