Mybatis的sql映射 添加: boolean addUser(User user); <insert id="addUser" parameterType="User"> insert into Users(uname,upass) values(#{uname},#{upass}) </in ...
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語句先在資料庫中測試,確診正確了再搬過來