目錄
?11.3XML映射文件
????????1.select
?????????2.insert、update、delete
????????3.Sql?
????????4.parameters(參數(shù))?
????????5.resultMap
????????6.resultMap 使用示例?
????????(1)在先前創(chuàng)建的數(shù)據(jù)庫stu中創(chuàng)建表student 2,并插入若干條數(shù)據(jù),代碼如下:
????????(2)創(chuàng)建工程mybatis_ResultMap_demo。?
????????(3)創(chuàng)建實(shí)體對象映射數(shù)據(jù)庫表。?
????????(4)創(chuàng)建映射接口和映射文件。
????????(5)測試。
?11.3XML映射文件
????????文章來源地址http://www.zghlxwxcb.cn/news/detail-629332.html
????????xml和dtd 部分是必須填寫且不需要配置的部分每次使用時(shí),只需要將這部分復(fù)制到文件頂部即可。
????????mapper 元素是整個映射文件的容器,所有的SQL映射都包含在這個元素中,mapper本身有一個參數(shù)namespace,即命名空間這個命名空間就是文件所對應(yīng)的接口文件的Java類只有當(dāng)這個命名空間被配置時(shí),才可以直接通過訪問Java接口的方法實(shí)現(xiàn)SOL調(diào)用。
????????映射器是MyBatis最復(fù)雜且最重要的組件它由一個接口加上XML文件(或者注解)組成。在映射器中可以配置參數(shù)、SOL 語句、存儲過程、緩存等內(nèi)容,并且通過簡易的映射規(guī)則映射到指定的POJO或者其他對象上,映射器能有效消除JDBC底層的代碼。
????????MyBatis的映射器也可以使用注解完成,但可讀性較差,企業(yè)中應(yīng)用不廣,官方亦不推薦使用。
????????1.select
????????
查詢語句是 MyBatis 中最常用的元素之一,多數(shù)應(yīng)用也都是查詢比修改要頻繁。對每個插入、更新或刪除操作,通常對應(yīng)多個查詢操作。這是 MyBatis 的基本原則之一,也是將焦點(diǎn)和精力放到查詢和結(jié)果映射的原因。對簡單類別的查詢元素是非常簡單的。例如:
<select id="selectPerson" parameterType="int"?resultType="hashmap">
????????SELECT *FROM PERSON WHERE ID=#{id}
</select>
????????這個語句被稱為selectPerson,使用一個int(或Integer)類型的參數(shù),并返回一個HashMap類型的對象,其中的鍵是列名,值是列對應(yīng)的值。
????????注意參數(shù)標(biāo)識?#{id},其告訴?MyBatis創(chuàng)建一個PreparedStatement (預(yù)處理語)參數(shù)使用JDBC,這樣的一個參數(shù)在SOL中會由一個“?”來標(biāo)識,并被傳遞到一個新的預(yù)處理語句中,類似于以下的JDBC代碼(不是MyBatis的代碼):
String selectPerson ="SELECT* FROM PERSON WHEREID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);
????????當(dāng)然,這需要很多單獨(dú)的JDBC 的代碼來提取結(jié)果并將它們映射到對象實(shí)例中,這就是MyBatis 節(jié)省時(shí)間的原因。我們需要深入了解參數(shù)和結(jié)果映射。select 元素有很多屬性允許用戶配置,以決定每條語句的作用細(xì)節(jié)。關(guān)于select元素主要屬性的描述參見表11-2。
????????????????????????????????????????表11-2select元素的主要屬性描述
屬性 |
描述 |
id |
在命名空間中唯一的標(biāo)識符,可以被用來引用這條語句 |
parameterType |
將會傳入這條語句的參數(shù)類的完全限定名或別名。這個屬性是可選的,因?yàn)?MyBatis 可以通過TypeHandler 推斷出具體傳入語句的參數(shù),默認(rèn)值為unset |
resultMap |
外部resultMap的命名引用。結(jié)果集的映射是MyBatis 最強(qiáng)大的特性若能對其有一個很好地理解則許多復(fù)雜映射的情形都能迎刃而解??梢允褂胷esultMap或resultType,但不能同時(shí)使用 |
flushCache |
如果設(shè)置為true,則任何時(shí)候只要語句被調(diào)用,都會導(dǎo)致本地緩存和二級緩存被清空,默認(rèn)值為false |
useCache |
如果設(shè)置為true,則將會導(dǎo)致本條語句的結(jié)果被二級緩存,select元素默認(rèn)值為true |
timeout |
這個設(shè)置是在拋出異常之前,驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認(rèn)值為unset(依賴驅(qū)動) |
fetchSize |
這是嘗試影響驅(qū)動程序每次批量返回的結(jié)果行數(shù)和這個設(shè)置值相等。默認(rèn)值為 unset(依賴驅(qū)動) |
statementType |
值為STATEMENT、PREPARED或CALLABLE之一。這會讓MyBatis分別使用JDBC中的 Statement、PreparedStatement 或CallableStatement,默認(rèn)值為PREPARED |
resultSetType |
值為FORWARDONLY、SCROLL SENSITIVE 或SCROLL INSENSITIVE 之一默認(rèn)值為 umset(依賴驅(qū)動),是結(jié)果集的類型 |
databaseld |
如果配置了databaseIdProvider,則MyBatis會加載所有的不帶databaseId 或匹配當(dāng)前databaseId語句;如果帶或者不帶databaseId的語句都有,則不帶的會被忽略 |
?????????2.insert、update、delete
????????數(shù)據(jù)操縱語句 insert、update 和 delete 在它們的實(shí)現(xiàn)中非常相似。
????????
<insert?Id=“insertAuthor”?parameterType=“domain.blogAuthor”?flushCache=“true”?
statementType=“PREPARED”keyProperty=“”keyColumn=“”useGeneratedKeys=“”
utimeout=“20”>
<update?id=“updateAuthor”?parameterType=“domain.blog.Author”?flushCache=“true”
statementType=“PREPARED” timeout=“20”>
<delete?id=“deleteAuthorr”?parameterType=“domain.blog.Author”?flushCache=“true”
statementType=“PREPARED” timeout=“20”>
?????????
????????insert、update和delete元素的主要屬性描述如表11-3所示
????????表11-3 insert、update和delete 元素的主要屬性描述
????????下面是insert、update和delete語句的示例
屬性 |
描述 |
id |
命名空間中的唯一標(biāo)識符,可被用來代表這條語句 |
parameterType |
將要傳入語句的參數(shù)的完全限定類名或別名。這個屬性是可選的,因?yàn)?MyBatis 可以通過TypeHandler推斷出具體傳入語句的參數(shù),默認(rèn)值為unset |
parameterMap |
STATEMENT、PREPARED或CALLABLE之一。這會讓MyBatis分別使用StatementPreparedStatement或CallableStatement,默認(rèn)值為PREPARED |
flushCache |
將其設(shè)置為 tue,任何時(shí)候只要語句被調(diào)用,都會導(dǎo)致本地緩存和二級緩存都被清空,默認(rèn)值為true(對應(yīng)插入、更新和刪除語句) |
statementType |
STATEMENT、PREPARED或CALLABLE之一。這會讓MyBatis 分別使用 Statement?PreparedStatement或CallableStatement,默認(rèn)值為PREPARED |
useGeneratedKeys |
(僅對insert和update 有用)這會令MyBatis 使用JDBC的getGeneratedKeys 方法來獲取由數(shù)據(jù)庫內(nèi)部生成的主鍵(如像MySOL和SOLServer 這樣的關(guān)系數(shù)據(jù)管理系統(tǒng)的自動遞增字段),默認(rèn)值為false |
keyProperty |
(僅對insert 和update 有用)唯一標(biāo)記一個屬性,MyBatis 會通過 getGeneratedKeys的返回值或者通過 insert 語的 selectKey 子元素設(shè)置其鍵值,默認(rèn)為 unset。如果希望得到多個生成的列,則也可以是逗號分隔的屬性名稱列表 |
keyColumn |
(僅對msert和update 有用)通過生成的鍵值設(shè)置表中的列名這個設(shè)置在某些數(shù)據(jù)庫(如PostgreSQL)中是必需的,當(dāng)主鍵列不是表中的第一列時(shí)需要設(shè)置。如果希望得到多個生成的列,則也可以是逗號分隔的屬性名稱列表 |
????????下面是insert、update和delete語句的示例。
????????
<insert id=“addStudent” parameterType=“student”
insert into
student(sno,name,sex,age,deptno)
values(#{sno}#{name},#{sex},#{age},#{dept_no})
</insert>
<update id=“updateStudent” parameterType=“student”>
update student set name
=#{name},sex=#{sex},age=#{lage},dept_no=#{dept_no}
where sno=#{sno}
</update>
<delete id=“deletestudent” uparameterType=“String”>
delete from student
where sno=#{sno}
</delete>
????????3.Sql?
????????這個元素可以被用來定義可重用的 SOL代碼段,可以包含在其他語句中。例如:
????????
<sql id=“userColumns”>
${alias}.id,${alias}.username,${alias}.password
</sq1>
????????這個SQL片段可以被包含在其他語句中。例如:
????????
<select id=“selectUsers”?resultType=“map”>
Select
<include>refid=“userColumns”><property name=“alias”?value=“t1”/></include>,
</select>
????????4.parameters(參數(shù))?
????????在MyBatis中,參數(shù)是非常強(qiáng)大的元素。類似于之前的語句,簡單參數(shù)示例如下。
? ? ? ?
<select id=“selectUsers” parameterType=“int”resultType="User”>
select id,username,password from users where id= #{id}
</select>
????????這個示例說明了一個非常簡單的命名參數(shù)映射。參數(shù)類型被設(shè)置為int,這里的參數(shù)名是id,也可以是其他名稱。參數(shù)為簡單數(shù)據(jù)類型的,都與此類似。以下示例中參數(shù)類型是一個對象,MyBatis的處理方式不同于簡單數(shù)據(jù)類型。
<insert id="insertUser"parameterType="User">
Insert into users(id,username,password)
values(#{id},#{username},#{password})
</insert>
????????如果User類型的參數(shù)對象傳遞到了語句中,則id、userame和password 屬性將會被查找,它們的值就會被傳遞到預(yù)處理語句的參數(shù)中。?
????????5.resultMap
???????resultMap是映射中最復(fù)雜也是最強(qiáng)大的元素,用來描述如何從數(shù)據(jù)庫結(jié)果集中來加載對象。resultMap 定義的主要是一個結(jié)果集的映射關(guān)系,也就是SOL到Java Bean 的映射關(guān)系定義。
????????下面是簡單映射語句的示例,但沒有明確的resultMap。例如:
????????
<select id=“selectUsers” resultType=“map”>
select id,username, hashedPassword from some_table where id = #{id}
</select>
????????resultType=“map”表示返回的數(shù)據(jù)是一個Map集合(使用列名作為key列值作為value)。雖然數(shù)據(jù)被封裝成Map集合返回,但是Map ”集合并不能很好地描述一個領(lǐng)域模型??梢允褂肑avaBeans或POJOs來作為領(lǐng)域模型描述數(shù)據(jù)MyBatis對兩者都支持來看下面這個JavaBean:
????????
public class User {
private int id;
private String username;
private String hashedPassword;
public int setId(int id) {
This.id=id;
}
public void getUsername() {
return username;
}
public void setUsername(String username) {
this.username=username;
}
public String getHashedPassword() {
return hashedPassword;
}
public void setHashedPassword(String hashedPassword) {
this.hashedPassword=hashedPassword;
}
}
?????????基于JavaBean的規(guī)范,上面這個類有3個屬性:id、username和hashedPassword。這些在select語句中會精確匹配到列名。
????????這樣的一個JavaBean可以被映射到結(jié)果集,就像映射到HashMap一樣簡單。
????????
<select id=“selectUsers” parameterType=“int” resultType=“com.someapp.model.User”>
select id,username,hashedPassword from some table where id = #{id}
</select>
????????以下使用了類型別名,使用它們時(shí)可以不輸入類的全路徑。例如:
?????????
<!--在XML配置文件中-->
<typeAlias type=“com.someapp,model.User”?alias=“User”/>
<!--在SOL映射的XML文件中-->
<select id=“selectUsers” parameterType=“int”resultType=“User”>
select id,username hashedPassword from some table where id = #{id}
</select>
?????????在這些情況下,MyBatis會在幕后自動創(chuàng)建一個resultMap,基于屬性名來映射列到JavaBean 的屬性上。如果列名沒有精確匹配,則可以在列名上使用 select 字句的別名(一個標(biāo)準(zhǔn)的SOL特性)來匹配標(biāo)簽。例如:
????????
<select id=“selectUsers”?parameterType=“int”?resultType=“User”>
select
??user_id as “id”,
??user_name as “userName”,
??hashed_password as “hashedPassword”
from some_table
where id = #{id}
</select>
????????resultMap最常見的使用方式如下所示,這也是解決列名不匹配的另外一種方式。
????????
<resultMap id=“userResultMap”?type= “User”>
<id property= “id”?column= “user_id”?/>
<result property= “username”?column= “user_name”?/>
<result property= “password”?column= “hashed_password”?/>
</resultMap>
????????引用此語句時(shí)使用resultMap 屬性即可(注意,這里去了resultType屬性)。例如:
????????
<select id= “selectUsers”?parameterType= “int”?resultMap= “userResultMap”>
select user_id, user_name, hashed_password from some_table where id=#{id}
</select>
????????6.resultMap 使用示例?
????????(1)在先前創(chuàng)建的數(shù)據(jù)庫stu中創(chuàng)建表student 2,并插入若干條數(shù)據(jù),代碼如下:
????????
DROP TABLE IF EXISTS `student_2`;
CREATE TABLE `student_2` (
`stu_sno` varchar(100) NOT NULL DEFAULT '',
`stu_name` varchar(100) NOT NULL,
`stu_sex` varchar(8) DEFAULT NULL,
`stu_age` int(3) DEFAULT NULL,
`stu_dept_no` varchar(60) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student_2` VALUES ('20231505', 'Marry', '女', '18', '260');
INSERT INTO `student_2` VALUES ('20231506', '王寶寶', '男', '22', '2602');
INSERT INTO `student_2` VALUES ('20231508', '李勇', '男', '20', '2605');
INSERT INTO `student_2` VALUES ('20231509', '劉娟', '女', '19', '2605');
????????(2)創(chuàng)建工程mybatis_ResultMap_demo。?
????????在idea 中創(chuàng)建Maven Project,在“GroupID”文本框中輸入“com.mialab”,在“ArtifactID”文本框中輸入“mybatis_ResultMap_demo”。最終完成的mybatis_ResultMap_demo工程目錄及文件如圖11-4所示,student2初始表數(shù)據(jù)如圖11-5所示。
????????
?????????????????????????????????????????????????圖11-4?mybatis_ResultMap_demo工程目錄及文件
????????
????????????????????????????????????????????????????????圖11-5?student2表中的數(shù)據(jù)
????????(3)創(chuàng)建實(shí)體對象映射數(shù)據(jù)庫表。?
????????Student對象用于映射student _2 表,Student.java 主要代碼如下(此處get方法、set方法和toString方法略:
????????
public class Student {
private String sno;
private String name;
private String sex;
private int age;
private String dept_no;
...
}
????????(4)創(chuàng)建映射接口和映射文件。
????????接口StudentMapper.java的主要代碼如下:
????????
public interface StudentMapper {
public List<Student> getSudentAll();
}
????????映射文件StudentMapper.xml的主要代碼如下:
????????
<mapper namespace="com.mialab.mybatis_ResultMap_demo.mapper.StudentMapper">
<resultMap id="studentResultMap" type="student">
<id property="sno" column="stu_sno" />
<result property="name" column="stu_name" />
<result property="sex" column="stu_sex" />
<result property="age" column="stu_age" />
<result property="dept_no" column="stu_dept_no" />
</resultMap>
<select id="getSudentAll" resultMap="studentResultMap">
select * from student_2
</select>
</mapper>
????????
????????這里column屬性表示數(shù)據(jù)庫表的列名,property 表示數(shù)據(jù)庫列映射到返回類型的屬性。<resultMap id=“studentResultMap”type=“student”>中的id 是resultMap 的唯一標(biāo)識符,type則表示 resultMap的實(shí)際返回類型。“student”是類型別名,表示的是“com.mialab.mybatis_ResultMap_demo.domain.Student", 在mybatis-config.xml中有聲明。
????????<id property="sno" column="stu_ sno" />中的id表示這個對象的主鍵(或者唯一標(biāo)識),property表示POJO的屬性名稱,column 表示數(shù)據(jù)庫表的列名。這樣,POJO就和數(shù)據(jù)庫SQL的結(jié)果一一對應(yīng)起來了 。
????????(5)測試。
????????main方法的主要測試代碼如下:
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> stu_list = mapper.getSudentAll();
for(Student stu:stu_list) {
//System.out.println(stu);
log.info(stu);
}
????????運(yùn)行ResultMap_ Main 的main方法,控制臺顯示內(nèi)容如下:文章來源:http://www.zghlxwxcb.cn/news/detail-629332.html
????????
DEBUG [main] - ==> Preparing: select * from student_2
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 4
INFO [main] - Student [sno=20231505, name=Marry, sex=女, age=18, dept_no=260]
INFO [main] - Student [sno=20231506, name=王寶寶, sex=男, age=22, dept_no=2602]
INFO [main] - Student [sno=20231508, name=李勇, sex=男, age=20, dept_no=2605]
INFO [main] - Student [sno=20231509, name=劉娟, sex=女, age=19, dept_no=2605]
到了這里,關(guān)于【Mybatis】XML映射文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!