Mybatis的sql映射

Mybatis的sql映射

添加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>

ResultMap

做用:匹配結果映射集,經常使用來處理複雜結構的查詢結果。app

使用場景性能

  • 數據表字段與其對應的 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語句先在數據庫中測試,確診正確了再搬過來
相關文章
相關標籤/搜索