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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

MyBatis基本配置和实践(三)

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis基本配置和实践(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、輸入映射和輸出映射

mapper.xml映射文件中定義了操作數據庫的sql,每條sql就是一個statement,映射文件是MyBatis的核心。

1、parameterType(輸入類型)

  • 簡單類型(常用于SQL查詢的基本類型字段)
  • pojo對象(常用于insert、update操作)
  • vo對象(ViewObject - 表現層對象,pojo的屬性一般為基本類型,vo的屬性可以是引用類型)

第一步:定義mapper映射文件(定義了statement id、SQL語句、parameterType、resultType)

<!--當查詢條件中有多個固定數量的查詢條件, 可以通過傳入一個vo來進行操作,sql的傳參來自vo屬性的屬性(user.username、user.sex)--> <select id="findUserByVo" parameterType="cn.it.pojo.QueryVo" resultType="cn.it.pojo.User">SELECT * FROM user WHERE username LIKE '%${user.username}%' AND sex =#{user.sex} </select>

第二步:定義mapper接口

List<User> findUserByVo(QueryVo queryVo);

第三步:定義ViewObject(vo封裝了User對象,也可以根據需要封裝其他內容,用以保存其他查詢選項)

package cn.it.pojo;import java.util.List;/*** Created by Eric on 3/12/17.*/ public class QueryVo {private User user;private List<Integer> ids;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;} }

第四步:測試,

@Testpublic void findUserByQueryVo() throws Exception {SqlSession openSession = sqlSessionFactory.openSession();UserMapper mapper = openSession.getMapper(UserMapper.class);User user = new User();user.setUsername("王");user.setSex("2");QueryVo queryVo = new QueryVo();queryVo.setUser(user);List<User> userList = mapper.findUserByVo(queryVo);for (User userInList : userList) {System.out.println(userInList);}}

2、resultType(輸出類型)

  • 輸出簡單類型(僅在SQL語句返回結果是一行一列是,輸出類型才會是基本類型)
  • 輸出pojo對象(selectOne)
  • 輸出pojo對象列表(selectList)

第一步:定義mapper映射文件

<!-- 僅在SQL語句返回一行一列的情況下, 才會使用基本類型作為resultType --><select id="findUserCount" resultType="int">SELECT count(*) FROM user</select>

第二步:定義mapper接口

int findUserCount();

第三步:測試

@Testpublic void findUserCount() throws Exception {SqlSession openSession = sqlSessionFactory.openSession();UserMapper mapper = openSession.getMapper(UserMapper.class);int count = mapper.findUserCount();System.out.println("查詢結果集的行數為: " + count);}

二、動態SQL拼接

1、if、where、sql、foreach標簽的使用

第一步:定義mapper映射文件

<!-- 動態SQL舉例: SELECT * FROM user WHERE 1=1 AND username LIKE '%${username}% AND sex=#{sex} --><select id="findUserByUsernameAndSex" resultType="user" parameterType="user">SELECT * FROM user<include refid="user_where"/></select><sql id="user_where"><!--where標簽可以讓你省去書寫難看的 1=1 ; 并自動幫你把第一個條件sql的AND關鍵字去掉--><where><if test="username!=null and username!=''">username LIKE '%${username}%'</if><if test="sex!=null and sex!=''">AND sex=#{sex}</if></where></sql><!--SQL語句: SELECT * FROM user WHERE id IN (1,2,3,4),foreach標簽前的AND可以寫,如果是第一個where條件也可以不寫 --><select id="findUserByIds" parameterType="queryVo" resultType="user">SELECT * FROM user<where><if test="ids.isEmpty() != true">AND <foreach collection="ids" item="element" open="id IN (" close=")" separator=",">#{element}</foreach></if></where></select>

第二步:定義mapper接口

List<User> findUserByUsernameAndSex(User user);List<User> findUserByIds(QueryVo queryVo);

第三步:定義輸入類型和輸出類型(User、QueryVo)

第四步:測試

@Testpublic void findUserByUsernameAndSex() throws Exception {SqlSession openSession = sqlSessionFactory.openSession();UserMapper mapper = openSession.getMapper(UserMapper.class);User user1 = new User();User user2 = new User();User user3 = new User();User user4 = new User();user1.setUsername("王");user2.setSex("2");user3.setUsername("王");user3.setSex("2");System.out.println("查詢'username=王': " + mapper.findUserByUsernameAndSex(user1));System.out.println("查詢'sex=2': " + mapper.findUserByUsernameAndSex(user2));System.out.println("查詢 '王 + 性別' 組合: " + mapper.findUserByUsernameAndSex(user3));System.out.println("查詢'null': " + mapper.findUserByUsernameAndSex(user4));}@Testpublic void findUserByIdSet() throws Exception {SqlSession openSession = sqlSessionFactory.openSession();UserMapper mapper = openSession.getMapper(UserMapper.class);List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(16);list.add(30);QueryVo queryVo = new QueryVo();queryVo.setIds(list);List<User> userList = mapper.findUserByIds(queryVo);for (User user : userList) {System.out.println(user);}}

三、關聯查詢

  • orders表和user表的關聯查詢
    • 遍歷用戶表,每個用戶有往往有一個或多個訂單,稱為“一對多查詢”;
    • 遍歷訂單表,每個訂單必定關聯一個用戶,稱為“一對一查詢”;
  • resultType的改變
    • user表的pojo對象為User.java;orders表的pojo對象為Orders.java。它們只能作為單表查詢的parameterType和resultType
    • 聯表查詢時,字段數增加,需要構建一個新的pojo來作為輸入輸出類型
      • 自動映射:
        • A、B聯表查詢,extend A表的pojo,在子類中擴展(B表字段對應的)屬性,兩表的同名字段問題可以通過SQL alias解決
        • 優點:只要保證resultType的pojo屬性名(property)和查詢結果的字段名(column)一致,MyBatis可以自動把輸出結果注入到resultType對象中
        • 缺點:多表查詢,No;一對多查詢,No
      • 手動映射:
        • A、B聯表查詢,將其中一個pojo對象作為屬性添加到另一個pojo中
        • 優點:多表查詢,OK;一對多查詢,OK
        • 缺點:配置繁瑣
  • 一對一查詢
    • 自動映射(可行)
    • 手動映射(可行)
  • 一對多查詢
    • 自動映射(不可行)
    • 手動映射(可行)

1、一對一查詢(手動映射)

第一步:定義mapper映射文件

<!-- 一對一: 手動映射 (列出每一個訂單, 每個訂單必然有一個下單用戶) --><select id="findOrdersAndUser" resultMap="ResultMap1">SELECT a.*, b.id uid, username, birthday, sex, address FROM orders a, user b WHERE a.user_id = b.id</select><resultMap id="ResultMap1" type="cn.manual.pojo.Orders"><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property="note"/><association property="user" javaType="cn.manual.pojo.User"><id column="uid" property="id"/><result column="username" property="username"/><result column="birthday" property="birthday"/><result column="sex" property="sex"/><result column="address" property="address"/></association></resultMap>

第二步:定義mapper接口

List<Orders> findOrdersAndUser();

第三步:定義pojo

第四步:測試

@Testpublic void findOrdersAndUserManual() throws Exception {SqlSession openSession = sqlSessionFactory.openSession();UserMapper mapper = openSession.getMapper(Mapper.class);List<Orders> ordersList = mapper.findOrdersAndUser();for (Orders orders : ordersList) {System.out.println(orders + " " + orders.getUser());}}

2、一對多查詢(手動映射)

第一步:定義mapper映射文件

<!--一多關系: 手動映射 (列出每個用戶, 每個用戶可能有一筆或者多筆訂單) --><select id="findUserAndOrders" resultMap="ResultMap2">SELECT b.id uid, username, birthday, sex, address, a.* FROM orders a, user b WHERE a.user_id=b.id</select><resultMap id="ResultMap2" type="cn.manual.pojo.User"><id column="uid" property="id"/><result column="username" property="username"/><result column="birthday" property="birthday"/><result column="sex" property="sex"/><result column="address" property="address"/><collection property="ordersList" ofType="cn.manual.pojo.Orders"><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property="note"/></collection></resultMap>

第二步:定義mapper接口

List<User> findUserAndOrders();

第三步:定義pojo

第四步:測試

@Testpublic void findUserAndOrders() throws Exception {SqlSession openSession = sqlSessionFactory.openSession();UserMapper mapper = openSession.getMapper(Mapper.class);List<User> userList = mapper.findUserAndOrders();for (User user : userList) {for (Orders orders : user.getOrders()) {System.out.println(user + " " + orders);}}}

?

以上全部代碼來自于:?https://github.com/echo1937/mybatis-demo的mybatis-exercise模塊

?

轉載于:https://www.cnblogs.com/echo1937/p/6540562.html

總結

以上是生活随笔為你收集整理的MyBatis基本配置和实践(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

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