日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(3).Mybatis动态sql的使用

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (3).Mybatis动态sql的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mybatis可以幫助我們方便的在SQL語句中實現某些邏輯。Mybatis動態sql語法常用的標簽有:

  • 使用_parameter
  • if判斷
  • switch判斷(使用choose…when…otherwise語法標簽 )
  • where子句
  • set子句
  • trim語法
  • foreach迭代變量
  • _parameter的使用

    _parameter 表示當前傳入的參數,如果查詢的時候傳入的參數只有一個,則使用 _parameter
    數據庫mybatis1中的表users中現在有記錄如下:

    User [id=1, name=aa, phone=13411111111, email=aa@163.com] User [id=2, name=bb, phone=13422222222, email=bb@163.com] User [id=3, name=cc, phone=13433333333, email=cc@126.com] User [id=4, name=dd, phone=13444444444, email=dd@126.com]

    現要查詢id值為4的user信息,返回的結果集為User對象,userMapper.xml文件中寫法如下:

    <select id="getUser1" parameterType="int" resultType="User">select id, name, phone, email from users where id = #{_parameter} </select>

    測試代碼:

    @Test public void getUser1(){SqlSession session = MybatisUtils.getSession(false);User user = session.selectOne("com.qcc.mapping.userMapper.getUser1", 4);System.out.println(user); }

    運行結果:User [id=4, name=dd, phone=13444444444, email=dd@126.com]


    if判斷

    if其實就是簡單的條件判斷,條件成立,就拼接sql語句,不成立就不拼接。

    <!--獲取所有id值大于2的User對象--> <select id="getUsersByIf" parameterType="int" resultType="User">select id, name, phone, email from users where 1=1<if test="_parameter != null">and id > #{_parameter}</if> </select>

    測試代碼:

    @Test public void get1(){SqlSession session = MybatisUtils.getSession(false);List<User> userList = session.selectList("com.qcc.mapping.userMapper.getUsersByIf", 2);for (User user : userList) {System.out.println(user);} }

    運行結果:

    User [id=3, name=cc, phone=13433333333, email=cc@126.com] User [id=4, name=dd, phone=13444444444, email=dd@126.com]

    在以上兩個示例當中,都是選取id, name, phone, email這四個字段,以下還會多次出現,實際開發當中選擇的字段更多,更復雜,浪費時間且容易寫錯,于是使用一個叫sql的標簽定義這些字段,只需要在使用的時候引入即可。

    <sql id="columns">id, name, phone, email </sql>

    引入的寫法是:<include refid="columns"/>,它就相當于sqls標簽中id, name, phone, email


    switch判斷

    類似Java中的switch語法,在這里使用的是choose…when…otherwise的語法
    使用示例如下:

    <!-- 與java中的switch(value)...case;break;...default格式類似,當when元素中的條件滿足的時候就拼接其中的內容到sql語句,同時就會跳出choose語句,即所有的when和otherwise條件中,只有一個會輸出,當所有條件都不滿足的時候就拼接otherwise中的內容。也就是說when和otherwise中的多個語句只會拼接上一個。所以這個語法用的不多。--> <select id="getUser2" parameterType="User" resultType="User">select <include refid="columns"/> from users where 1=1<choose><when test="id!=0">and id = #{id}</when><when test="name!=null">and name = #{name}</when><otherwise>and phone = #{phone}</otherwise></choose> </select>

    測試代碼:

    @Test public void getUser2(){SqlSession session = MybatisUtils.getSession(false);User user = new User();user.setId(2);user.setName("aa");List<User> list = session.selectList("com.qcc.mapping.userMapper.getUser2", user);System.out.println(list); }

    運行結果:

    [User [id=2, name=bb, phone=13422222222, email=bb@163.com]]

    發現查詢出來的集合當中有一個User對象,對象的name屬性值是bb,而不是aa,這就驗證了有多個when條件成立的時候,它會自上往下執行拼接,一旦拼接上一個when中的語句后就不再繼續執行了,跳出choose語句。


    where子句

    where語句的作用主要是簡化SQL語句中where中的條件判斷的
    上邊的if和switch的兩個示例中select標簽中寫的sql語句中,在where關鍵字后面都有個1=1,這個是必需的
    如果沒有,拼接上對應的條件后sql語法就不正確了,多了個and,
    沒有1=1時:select * from users where and id > #{_parameter}語法錯誤,多個and。
    有了1=1后就是select * from users where 1=1 and id > #{_parameter}語法正確。
    示例:

    <!-- 1.where元素的作用是會在寫入where元素的地方輸出一個where2.where子句會自動把拼接后的語句中多余的and去掉3.另外一個好處是你不需要考慮where元素里面的條件輸出是什么樣子的,MyBatis會智能的幫你處理,如果所有的條件都不滿足那么MyBatis就會查出所有的記錄,4.如果輸出后是and開頭的,MyBatis會把第一個and忽略,當然如果是or開頭的,MyBatis也會把它忽略;5.where元素中你不需要考慮空格的問題,MyBatis會智能的幫你加上。--> <select id="getUser3" parameterType="User" resultType="User">select <include refid="columns"/> from users<where><if test="id!=0">and id = #{id}</if><if test="name!=null">and name = #{name}</if></where> </select>

    測試代碼:

    @Test public void getUser3(){SqlSession session = MybatisUtils.getSession(false);User user = new User();user.setId(2); // user.setName("aa");List<User> list = session.selectList("com.qcc.mapping.userMapper.getUser3", user);System.out.println(list); }

    測試結果:

    [User [id=2, name=bb, phone=13422222222, email=bb@163.com]]

    set子句

    set子句一般更新數據庫記錄的操作
    示例如下:

    <!-- set標簽的作用主要是在包含的語句前輸出一個set,然后如果包含的語句是以逗號結束的話將會把該逗號忽略,(即忽略賦值語句中最后一個,)如果set包含的內容為空的話則會出錯。有了set元素我們就可以動態的更新那些修改了的字段。--> <update id="update1" parameterType="User">update users<set><if test="name != null">name = #{name},</if><if test="phone != null">phone = #{phone},</if><if test="email != null">email = #{email},</if></set>where id = #{id} </update>

    測試代碼:

    @Test public void update1(){SqlSession session = MybatisUtils.getSession(true);//修改操作需要使用事務,提交事務User user = new User();user.setId(4);user.setName("update_4");user.setEmail("newUser@qq.com");System.out.println("傳入的user對象:" + user);User user1 = session.selectOne("com.qcc.mapping.userMapper.getUser", 4);System.out.println("修改前:" + user1);/*用戶的電話號碼未重新賦值,則user的phone屬性為null,因此保留不做修改*/session.update("com.qcc.mapping.userMapper.update1", user);//根據傳入的id查詢對應的實體對象,查詢修改后的user對象User user2 = session.selectOne("com.qcc.mapping.userMapper.getUser", 4);System.out.println("修改后:" + user2); }

    測試結果:

    傳入的user對象:User [id=4, name=update_4, phone=null, email=newUser@qq.com] 修改前:User [id=4, name=dd, phone=13444444444, email=dd@126.com] 修改后:User [id=4, name=update_4, phone=13444444444, email=newUser@qq.com]

    trim語法

    trim添加需要的內容,去掉多余的內容
    trim元素的主要功能是可以在自己包含的內容前加上某些前綴,也可以在其后加上某些后綴,與之對應的屬性是prefix和suffix;
    可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;
    正因為trim有這樣的功能,所以我們也可以非常簡單的利用trim來代替where子句、set子句的功能,
    語法格式如下:

    <trim prefix="where" prefixOverrides="and |or "><if ...>AND ...</if><if ...>AND ...</if><if ...>AND ...</if> </trim>

    它的作用是將生成的sql中添加 where 前綴,并將 sql 的 and 或者 or 前綴刪除掉
    在更新操作時:

    <trim prefix="set" suffixOverrides=","><if ...>account = #{account},</if><if ...>password = #{password},</if><if ...>name = #{name},</if> </trim>

    它的作用是將生成的sql中添加 set 前綴,并將 sql 的 最后一個,后綴去掉
    查詢時使用trim子句示例:

    <select id="getUser4" parameterType="User" resultType="User">select <include refid="columns"/> from users<!-- 添加 where 關鍵字,去掉最前面的 and 關鍵字 --><trim prefix="where" prefixOverrides="and"><if test="id != 0">and id = #{id}</if><if test="name != null">and name = #{name}</if></trim> </select>

    測試代碼:

    @Test public void getUser4(){SqlSession session = MybatisUtils.getSession(false);User user = new User(); // user.setId(1);user.setName("aa");List<User> list = session.selectList("com.qcc.mapping.userMapper.getUser4", user);System.out.println(list); }

    測試結果:

    [User [id=1, name=aa, phone=13411111111, email=aa@163.com]]

    可見與使用where 語法的情況是一樣的。使用trim更新的操作類似,略。


    foreach迭代變量

    foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合,比如批量刪除。也可以使用于比如批量插入操作。
    foreach元素的屬性主要有item,index,collection,open,separator,close。

    1、item表示集合中每一個元素進行迭代時的別名, 2、index指定一個名字,用于表示在迭代過程中,每次迭代到的位置, 3、open表示該語句以什么開始, 4、separator表示在每次進行迭代之間以什么符號作為分隔符, 5、close表示以什么結束, 6、collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:(1)如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list(2)如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array(3)如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key。

    foreach示例1:使用在in條件中,批量刪除:

    userMapper.xml 文件中映射 sql 的代碼如下: <!-- 傳入數組ids進行批量刪除操作 --> <delete id="delBatch">delete from users where id in<!--如果傳入的是單參數且參數類型是一個Array的時候,collection屬性值為array--><foreach collection="array" open="(" close=")" separator="," item="id">#{id}</foreach> </delete>

    測試代碼:(刪除前先查詢數據庫中的所有記錄并輸出,進行刪除操作后,再查詢數據庫中所有記錄并輸出)

    @Test public void delBatchDemo(){SqlSession session = MybatisUtils.getSession(true);/*查詢數據庫中所有記錄*/List<User> list = session.selectList("com.qcc.mapping.userMapper.getAll");System.out.println("刪除前:" + list);/*以下是批量刪除操作*/int[] ids = new int[]{1, 3, 4};int result = session.delete("com.qcc.mapping.userMapper.delBatch", ids);if(result>0){System.out.println("刪除" + result + "條記錄成功!");}else{System.out.println("刪除失敗!");}/*批量刪除操作完成后,再次查詢數據庫中所有記錄*/list = session.selectList("com.qcc.mapping.userMapper.getAll");System.out.println("刪除后:" + list); }

    測試結果:

    刪除前:[User [id=1, name=aa, phone=13411111111, email=aa@163.com], User [id=2, name=bb, phone=13422222222, email=bb@163.com], User [id=3, name=cc, phone=13433333333, email=cc@126.com], User [id=4, name=update_4, phone=13444444444, email=newUser@qq.com]] 刪除3條記錄成功! 刪除后:[User [id=2, name=bb, phone=13422222222, email=bb@163.com]]

    foreach示例2:使用foreach執行批量插入操作:
    userMapper.xml 文件中批量插入的映射 sql 的代碼如下:

    <insert id="addBatchByList">insert into users(name, phone, email) values<!--如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list--><foreach item="user" collection="list" separator=",">(#{user.name}, #{user.phone}, #{user.email})</foreach> </insert>

    在User實體類中添加無參和帶參的構造方法,以便初始化User對象。

    public User(String name, String phone, String email) {this.name = name;this.phone = phone;this.email = email; }public User() {}

    批量插入的測試代碼如下:

    @Test public void addBatch(){List<User> userList = new ArrayList<>();User user1 = new User("關羽", "13333333333", "GuanYu@shu.com");User user2 = new User("張飛", "13344444444", "ZhangFei@shu.com");User user3 = new User("趙云", "13355555555", "ZhaoYun@shu.com");User user4 = new User("黃忠", "13366666666", "HuangZhong@shu.com");userList.add(user1);userList.add(user2);userList.add(user3);userList.add(user4);SqlSession session = MybatisUtils.getSession(false);//傳入false,意味著不會自動提交事務,等批量操作完成后再提交事務。提升操作數據庫的效率。int result = session.insert("com.qcc.mapping.userMapper.addBatchByList", userList);if (result>0) {System.out.println("批量插入" + result + "條記錄成功!");} else {System.out.println("批量插入失敗!");}session.commit();//提交事務System.out.println("遍歷數據庫中所有的user信息");userList = session.selectList("com.qcc.mapping.userMapper.getAll");for (User user : userList) {System.out.println(user);} }

    批量插入的測試運行結果:

    批量插入4條記錄成功! 遍歷數據庫中所有的user信息 User [id=2, name=bb, phone=13422222222, email=bb@163.com] User [id=5, name=關羽, phone=13333333333, email=GuanYu@shu.com] User [id=6, name=張飛, phone=13344444444, email=ZhangFei@shu.com] User [id=7, name=趙云, phone=13355555555, email=ZhaoYun@shu.com] User [id=8, name=黃忠, phone=13366666666, email=HuangZhong@shu.com]

    Mybatis動態sql常用的就以上這些了。

    總結

    以上是生活随笔為你收集整理的(3).Mybatis动态sql的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产美女永久免费 | 欧美性插动态图 | 亚洲午夜精品久久久久久app | 日本人妖japanesexxx | 欧美视频久久 | 中国在线观看免费视频 | 久久老司机精品视频 | 久久久天堂国产精品女人 | 国产欧美一区二区三区另类精品 | 久热久色 | 国产女人爽到高潮a毛片 | 包射屋 | 狠狠躁夜夜躁人人爽天天高潮 | 亚洲爱情岛论坛永久 | 好吊一区| 91精品国产高清一区二区三密臀 | 97桃色| 中出少妇 | 欧美精品一区二区性色a+v | 国产娇小hdxxxx乱 | 天天综合天天综合 | 欧美影视一区二区 | 国产免费黄色网址 | 97碰| 国产九色在线播放九色 | 嫩草影院黄 | 能免费看18视频网站 | www.超碰在线观看 | 男人的天堂在线 | 淫人网| a亚洲天堂| 国产精品成熟老女人 | 综合网五月 | www.youjizz.com国产 | 91精品免费 | 噜噜色综合 | 亚洲av电影一区 | 国产露出视频 | 国产综合在线观看 | 欧美女人一区二区 | 人人精品久久 | 国产一区二区免费在线 | 日本成人在线一区 | 国产精品久久久久久久一区二区 | 精品h视频 | 亚洲自拍第三页 | 一区二区三区四区精品视频 | 麻豆福利在线观看 | 国产在线精品观看 | 男人天堂怡红院 | 爱爱视频在线免费观看 | 亚洲一区中文字幕在线 | 日韩激情啪啪 | 在线射 | 人人妻人人澡人人爽 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 日韩av图片 | 伊人网在线视频 | 97色涩| 久久国产精品免费视频 | 午夜视频在线瓜伦 | 色婷婷激情五月 | 日本免费不卡视频 | 综合网av | 老司机午夜视频 | 亚洲精品综合 | 久久精品毛片 | 九九三级 | 亚洲人成在线播放 | 成人网址在线观看 | 国产大奶在线观看 | 亚洲手机在线观看 | 国产精品一级 | 久久久免费在线观看 | 91免费网址 | 久久久久国产精品夜夜夜夜夜 | 天天干狠狠干 | 四虎综合| 成年人性生活免费视频 | 另类小说亚洲色图 | 96久久久 | 九一在线观看免费高清视频 | 亚洲午夜色 | 在线观看的毛片 | 午夜免费福利视频 | 亚洲av综合色区 | 亚洲色图在线观看视频 | 毛片视频网站在线观看 | 内射一区二区 | 中文资源在线观看 | 成人91av| 日韩精品啪啪 | sm国产在线调教视频 | 午夜爱爱毛片xxxx视频免费看 | 国产91在线 | 亚洲 | 九九热精品 | 好吊操免费视频 | 日韩av免费 | 夜夜天天 |