Mybatis的sql映射
添加:
boolean addUser(User user);
<insert id="addUser" parameterType="User">
insert into Users(uname,upass) values(#{uname},#{upass})
</insert>
洗掉:
boolean deleteUserById(Integer uid);
<delete id="deleteUserById" parameterType="int">
delete from Users where id = #{uid}
</delete>
修改:
boolean update(Map<String,String> map);
<update id="update" parameterType="map">
update Users set uname = #{uname}
where uid=#{uid}
</update>
查詢:
List<User> selectUserById(Integer uid);
<select id="selectUserById" resultType="User">
select * from Users where uid = #{uid}
</select>
引數詳解
映射陳述句常用屬性:
屬性 | 描述 |
---|---|
id |
在命名空間中唯一的識別符號,可以被用來參考這條陳述句, |
parameterType |
將會傳入這條陳述句的引數的類全限定名或別名,這個屬性是可選的,因為 MyBatis 可以通過型別處理器(TypeHandler)推斷出具體傳入陳述句的引數, |
resultType |
期望從這條陳述句中回傳結果的類全限定名或別名, 注意,如果回傳的是集合,那應該設定為集合包含的型別,而不是集合本身的型別, resultType 和 resultMap 之間只能同時使用一個, |
resultMap |
對外部 resultMap 的命名參考,結果映射是 MyBatis 最強大的特性,resultType 和 resultMap 之間只能同時使用一個, |
傳遞引數:使用占位符#{}
- 一個引數:使用
#{value}
接收, - 同一物件的多個屬性:封裝成物件傳入,使用
#{屬性名}
接收, - 多個引數:封裝成
Map
集合傳入,使用#{key}
接收,
字串替換:使用${value}
替換字串的一部分內容,可用作模糊匹配,
<!--查詢名稱中含有value值的用戶-->
<select id="selectUserByName" resultType="User">
select * from user_table where name like '%${value}%'
</select>
ResultMap
作用:匹配結果映射集,常用來處理復雜結構的查詢結果,
使用場景:
- 資料表欄位與其對應的 JavaBean 類屬性名不相同時,無法自動匹配,
- 查詢結果集結構較為復雜,如查詢用戶資訊及其所有訂單集合,
例子
使用場景一:資料庫表中欄位名和pojo類的屬性名不一致
//資料庫 Users 包含欄位 uid、uname、upass
//pojo類的屬性為:uid uname password
List<User> selectUserById(Integer uid);
<select id="selectUserById" resultType="User">
select * from Users where uid = #{uid}
</select>
結果為:
Users(uid=1, uname=zhangwuji, password=null)
Users(uid=2, uname=zhaomin, password=null)
Users(uid=3, uname=zhouzhiruo, password=null)
Users(uid=4, uname=xiaozhao, password=null)
將mapper.xml的陳述句改為
<select id="queryUsers" resultMap="UsersMap">
select * from users
</select>
<resultMap id="UsersMap" type="Users">
<result property="uid" column="uid"/>
<result property="uname" column="uname"/>
<result property="password" column="upass"/>
</resultMap>
結果為:
Users(uid=1, uname=zhangwuji, password=123456)
Users(uid=2, uname=zhaomin, password=123456)
Users(uid=3, uname=zhouzhiruo, password=123456)
Users(uid=4, uname=xiaozhao, password=123456)
使用場景二:一對多
建表并賦值
CREATE TABLE `student`(
`sid` INT NOT NULL AUTO_INCREMENT COMMENT '學生id',
`sname` VARCHAR(30) NOT NULL COMMENT '學生姓名',
`sage` VARCHAR(30) NOT NULL COMMENT '學生年齡',
`tid` INT NOT NULL COMMENT '老師id',
PRIMARY KEY(`sid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `teacher`(
`tid` INT NOT NULL AUTO_INCREMENT COMMENT '老師id',
`tname` VARCHAR(30) NOT NULL COMMENT '老師姓名',
PRIMARY KEY(`tid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
INSERT INTO teacher (tname) VALUES
("王老師"),
("李老師"),
("劉老師");
INSERT INTO student (sname,sage,tid) VALUES
('諸葛亮','18',1),
('李白','18',1),
('花木蘭','18',1),
('妲己','18',2),
('貂蟬','18',2),
('小喬','18',2),
('魯班','18',3),
('后裔','18',3),
('伽羅','18',3);
創建pojo類
Student.class
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {
private String sname;
private String age;
}
Teacher.class
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher {
private int tid;
private String tname;
private ArrayList<Student> list;
}
創建TeacherDao介面
public interface TeacherDao {
ArrayList<Teacher> getTeacher(@Param("tid") int tid);
}
然后創建mapper.xml
<?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-->
<mapper namespace="com.cugb.dao.TeacherDao">
<!--sql陳述句-->
<select id="getTeacher" resultMap="TeacherStudent">
select teacher.tid tid1,teacher.tname tname,student.sname sname,student.sage
from student,teacher
where
teacher.tid = student.tid
and
teacher.tid = #{tid}
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="tid" column="tid1"/>
<result property="tname" column="tname"/>
<collection property="list" ofType="student">
<result property="sname" column="sname"/>
<result property="sage" column="sage"/>
</collection>
</resultMap>
</mapper>
結果:
Teacher(tid=1, tname=王老師, list=[Student(sname=諸葛亮, sage=18),
Student(sname=李白, sage=18),
Student(sname=花木蘭, sage=18)])
使用場景三:多對一
創建pojo
teacher.class
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Teacher {
private int tid;
private String tname;
}
student.class
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Student {
private int sid;
private String sname;
private String sage;
private Teacher teacher;
}
創建StudentDao介面
public interface StudentDao {
public ArrayList<Student> getAllStudent();
}
創建mapper.xml
<?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-->
<mapper namespace="com.cugb.dao.StudentDao">
<!--sql陳述句-->
<select id="getAllStudent" resultMap="Studenteacher">
select student.sid sid,student.sname sname,student.sage,teacher.tname
from student,teacher
where
teacher.tid = student.tid
</select>
<resultMap id="Studenteacher" type="Student">
<result property="sid" column="sid"/>
<result property="sname" column="sname"/>
<result property="sage" column="sage"/>
<association property="teacher" javaType="Teacher">
<result property="tname" column="tname"/>
</association>
</resultMap>
</mapper>
結果:
Student(sid=1, sname=諸葛亮, sage=18, teacher=Teacher(tname=王老師))
Student(sid=2, sname=李白, sage=18, teacher=Teacher(tname=王老師))
Student(sid=3, sname=花木蘭, sage=18, teacher=Teacher(tname=王老師))
Student(sid=4, sname=妲己, sage=18, teacher=Teacher(tname=李老師))
Student(sid=5, sname=貂蟬, sage=18, teacher=Teacher(tname=李老師))
Student(sid=6, sname=小喬, sage=18, teacher=Teacher(tname=李老師))
Student(sid=7, sname=魯班, sage=18, teacher=Teacher(tname=劉老師))
Student(sid=8, sname=后裔, sage=18, teacher=Teacher(tname=劉老師))
Student(sid=9, sname=伽羅, sage=18, teacher=Teacher(tname=劉老師))
ResultMap 結構:
constructor
:用于在實體化類時,注入結果到構造方法中,idArg
- ID 引數;標記出作為 ID 的結果可以幫助提高整體性能,arg
- 將被注入到構造方法的一個普通結果,
id
: 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體性能,result
– 注入到欄位或 JavaBean 屬性的普通結果,association
:一個復雜型別的關聯;許多結果將包裝成這種型別,- 嵌套結果映射 – 關聯可以是
resultMap
元素,或是對其它結果映射的參考,
- 嵌套結果映射 – 關聯可以是
collection
:一個復雜型別的集合,- 嵌套結果映射 – 集合可以是
resultMap
元素,或是對其它結果映射的參考,
- 嵌套結果映射 – 集合可以是
discriminator
:使用結果值來決定使用哪個resultMap
,case
- 基于某些值的結果映射- 嵌套結果映射 –
case
也是一個結果映射,因此具有相同的結構和元素;或者參考其它的結果映射
- 嵌套結果映射 –
ResultMap 屬性:
屬性 | 描述 |
---|---|
id |
當前命名空間中的一個唯一標識,用于標識一個結果映射, |
type |
類的完全限定名, 或者一個型別別名, |
autoMapping |
如果設定這個屬性,MyBatis 將會為本結果映射開啟或者關閉自動映射,默認未設定, |
id & result 屬性:
屬性 | 描述 |
---|---|
property |
映射到列結果的欄位或屬性名,如果 JavaBean 有這個名字的屬性(property),會先使用該屬性,否則 MyBatis 將會尋找給定名稱的欄位(field), |
column |
資料庫中的列名,或者是列的別名, |
javaType |
一個 Java 類的全限定名,或一個型別別名, 如果你映射到一個 JavaBean,MyBatis 通常可以推斷型別,然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致, |
jdbcType |
JDBC 型別,只需要在可能執行插入、更新和洗掉的且允許空值的列上指定 JDBC 型別,如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個型別, |
typeHandler |
使用這個屬性,你可以覆寫默認的型別處理器, 這個屬性值是一個型別處理器實作類的全限定名,或者是型別別名, |
總結
-
sql映射主要是記住各標簽的用處
屬性 描述 id
在命名空間中唯一的識別符號,可以被用來參考這條陳述句, parameterType
將會傳入這條陳述句的引數的類全限定名或別名,這個屬性是可選的,因為 MyBatis 可以通過型別處理器(TypeHandler)推斷出具體傳入陳述句的引數, resultType
期望從這條陳述句中回傳結果的類全限定名或別名, 注意,如果回傳的是集合,那應該設定為集合包含的型別,而不是集合本身的型別, resultType 和 resultMap 之間只能同時使用一個, resultMap
對外部 resultMap 的命名參考,結果映射是 MyBatis 最強大的特性,resultType 和 resultMap 之間只能同時使用一個, -
resultmap處理一對多,多對一是重點難點
- 創建pojo物件盡量根據資料庫欄位來,避免復雜結果的處理
- 創建pojo的類,相當于一個臨時的資料結構,所以創建時,應以實際需要的資料為準,而不是把資料庫的所有欄位都搬過來
- 如果pojo的屬性是一個物件,用asossiation來處理, 對應的是javaType
- 如果pojo的屬性是一個物件,用collection來處理, 對應的是ofType
- sql陳述句先在資料庫中測驗,確診正確了再搬過來
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/1015.html
標籤:面向對象
下一篇:1. embind class