Mybatis输入映射和输出映射
Mapper.xml映射文件中定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心。
?輸入參數映射
?parameterType(輸入類型)
傳遞簡單類型:
如: <select id="queryUserById" parameterType="Integer" resultType="User">select * from t_user where id = #{id}</select>如上中parameterType為輸入類型、resultType為輸出類型,sql語句中記得用占位符#{}(防sql注入功能并且默認加'`'飄字符)或者${}(相反)進行sql拼接。傳遞pojo對象
Mybatis使用ognl表達式解析對象字段的值,#{}或者${}括號中的值為pojo屬性名稱。
補充:什么叫ognl表達式??OGNL表達式是Object-Graph Navigation Language的縮寫,是一種功能強大的表達式語言,通過簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉換。
ognl表達式的使用?
首先看一個代碼:
User.xml中
User.java中 public Integer id;private String _name;private int _money;
測試類 //更新數據@Testpublic void testDemo5(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();user.setId(1);user.set_name("魏杰");user.set_money(1000);int update = openSession.update("updateUser", user);openSession.commit();openSession.close();}數據庫
運行測試類:
我們可以看到數據更改成功,因為我們的傳入的參數類型為user對象,那么我們怎么獲取需要更新的數據呢,就通過ognl表達式可以去解析user對象中的成員變量,而我們的User.xml中UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}
中的#{_money}和#{id}和我們對象的成員變量中的名稱相同,因此才會更改成功,倘若我們把_money改成money再執行就會報錯:org.apache.ibatis.exceptions.PersistenceException:?
### Error updating database. ?Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'money' in 'class com.firtDay.sqlMapconFig.User'
表示找到參數值。
?傳遞pojo包裝對象
開發中通過可以使用pojo傳遞查詢條件。
查詢條件可能是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如查詢用戶信息的時候,將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數。
包裝對象:Pojo類中的一個屬性是另外一個pojo。
?
需求:根據用戶名模糊查詢用戶信息,查詢條件放到QueryVo的user屬性中。
Mapper接口
public interface mapper {User queryUserById(Integer id);User queryUserByIdQueryVo(QueryVo vo);Integer queryUserCount();User queryUserByName(User user);List<User> queryUserByIds(QueryVo vo);List<User> queryUserByIds(List<Integer> ids);List<User> queryUserByIds(Integer[] ids);List<OrderDemo> queryOrders();//一對一List<UserDemo> queryOrdersDemo();//一對多 }編寫QueryVo
public class QueryVo implements Serializable{/*** */private static final long serialVersionUID = 1L;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;}}xml中傳遞參數類型設置
<select id="queryUserByIds" resultType="User" parameterType="QueryVo">測試類
@Testpublic void testDemo2(){SqlSession openSession = sqlSessionFactory.openSession();mapper m = openSession.getMapper(mapper.class);User user = new User();user.setId(3); // 知識點一QueryVo vo = new QueryVo();vo.setUser(user);user = m.queryUserByIdQueryVo(vo);System.out.println(user);System.out.println("----------------");user = m.queryUserById(user.getId());System.out.println(user);System.out.println("---------------------------");Integer queryUserCount = m.queryUserCount();System.out.println(queryUserCount);openSession.close();}resultType(輸出類型)
簡單參數類型、輸出pojo對象、輸出pojo列表(List,resultType仍然為user)
resultMap
? ? ? ?resultType可以指定將查詢結果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
?????? 如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關系 ,resultMap實質上還需要將查詢結果映射到pojo對象中。
?????? resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
如果mapper.xml中sql查詢列(user_id)和Order類屬性(userId)不一致,所以查詢結果不能映射到pojo中。
需要定義resultMap,把orderResultMap將sql查詢列(user_id)和Order類屬性(userId)對應起來
代碼演示:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空間,用于隔離sql,還有一個很重要的作用,Mapper動態代理開發的時候使用,需要指定Mapper的類路徑 --> <mapper namespace="cn.itcast.mybatis.mapper.OrderMapper"><!-- resultMap最終還是要將結果映射到pojo上,type就是指定映射到哪一個pojo --><!-- id:設置ResultMap的id --><resultMap type="order" id="orderResultMap"><!-- 定義主鍵 ,非常重要。如果是多個字段,則定義多個id --><!-- property:主鍵在pojo中的屬性名 --><!-- column:主鍵在數據庫中的列名 --><id property="id" column="id" /><!-- 定義普通屬性 --><result property="userId" column="user_id" /><result property="number" column="number" /><result property="createtime" column="createtime" /><result property="note" column="note" /></resultMap><!-- 查詢所有的訂單數據 --><select id="queryOrderAll" resultMap="orderResultMap">SELECT id, user_id,number,createtime, note FROM `order`</select></mapper>總結
以上是生活随笔為你收集整理的Mybatis输入映射和输出映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot 如何动态替换be
- 下一篇: 【使用注意】多线程导致解码混乱的情况