添加:java
boolean addUser(User user); <insert id="addUser" parameterType="User"> insert into Users(uname,upass) values(#{uname},#{upass}) </insert>
刪除:mysql
boolean deleteUserById(Integer uid); <delete id="deleteUserById" parameterType="int"> delete from Users where id = #{uid} </delete>
修改:sql
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}
替換字符串的一部份內容,可用做模糊匹配。mybatis
<!--查詢名稱中含有value值的用戶--> <select id="selectUserByName" resultType="User"> select * from user_table where name like '%${value}%' </select>
做用:匹配結果映射集,經常使用來處理複雜結構的查詢結果。app
使用場景:性能
例子測試
使用場景一:數據庫表中字段名和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處理一對多,多對一是重點難點