詳解MyBatis的getMapper()接口、resultMap標簽、Alias別名、 盡量提取sql列、動態(tài)操作
一、getMapper()接口
解析:getMapper()接口 IDept.class定義一個接口,
掛載一個沒有實現(xiàn)的方法,特殊之處,借樓任何方法,必須和小配置中id屬性是一致的
通過代理:生成接口的實現(xiàn)類名稱,在MyBatis底層維護名稱$$Dept_abc,selectDeptByNo()
相當于是一個強類型
Eg
第一步:在cn.happy.dao中定義一個接口
package cn.happy.dao;
import java.util.List;
import cn.happy.entity.Dept;
public interface IDeptDao {
//查看全部---------getAllDept要和小配置里面的id一樣
public List<Dept> getAllDept();
}
第二步:IDept.xml配置小配置
解析:select里面的Id屬性要和接口里面的接口方法名一樣;mapper的namespace屬性包名是cn.happy.dao.IDeptDao接口
<?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"> <mapper namespace="cn.happy.dao.IDeptDao"> <select id="getAllDept" resultType="cn.happy.entity.Dept"> select * from Dept </select> </mapper>
第三步:測試類
解析:查看全部信息有兩種方法
1)session.selectList("cn.happy.dao.IDeptDao.getAllDept");-------實體類.小配置里面的Id名稱============字符串
2)IDeptDao mapper = session.getMapper(IDeptDao.class);相當于實現(xiàn)類,getMapper是一個強類型
// 01查看全部信息getMapper()接口類的方法名要和小配置的id一樣
@Test
public void testSelectAll() {
SqlSession session = factory.openSession();
//用的是弱類型========實體類.小配置里面的Id名稱============字符串
/*List<Dept> list = session.selectList("cn.happy.dao.IDeptDao.getAllDept");
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}*/
// 用getMapper方法HIbernate幫我們在內(nèi)存中代理出一個接口的實現(xiàn)類======相當于強類型
//mapper是一個實現(xiàn)類對象
IDeptDao mapper = session.getMapper(IDeptDao.class);
List<Dept> list = mapper.getAllDept();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
第四步:全文統(tǒng)一用一個大配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- Alias別名 小配置里面的type的屬性值改成別名--> <typeAliases> <typeAlias type="cn.resultMap.enetity.Emp" alias="emp"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="sa" /> <property name="password" value="1" /> </dataSource> </environment> </environments> <!--映射文件:描述某個實體和數(shù)據(jù)庫表的對應關系 --> <mappers> <mapper resource="cn/resultMap/enetity/Emp.xml" /> </mappers> </configuration>
二、resultMap標簽
解析:使用的場景是當實體類的屬性與數(shù)據(jù)庫不匹配的時候需要用到resultMap實體類和數(shù)據(jù)庫的屬性必須一致。(之前用的是實體類)
Eg檢索所有員工,以及隸屬部門
第一步:創(chuàng)建一個接口
package cn.resultMap.dao;
import java.util.List;
import cn.resultMap.enetity.Emp;
public interface IEmpDao {
//檢索所有員工,以及隸屬部門
public List<Emp> getAllEmps();
}
第二步:配置小配置里面的屬性
解析: 員工角度 多的一方,嵌入一的一方的各個屬性請使用association 是關聯(lián)(如果去掉association的話就是基礎的resultMap)
<?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"> <mapper namespace="cn.resultMap.dao.IEmpDao"> <resultMap type="cn.resultMap.enetity.Emp" id="empMap"> <id property="empId" column="EMPID"/> <result property="empName" column="EMPNAME"/> <result property="empCity" column="EMPCITY"/> <!-- 員工角度 多的一方,嵌入一的一方的各個屬性請使用association --> <association property="dept" javaType="cn.resultMap.enetity.Dept"> <result property="deptName" column="DEPTNAME"/> <result property="deptNo" column="DEPTNO"/> </association> </resultMap> <select id="getAllEmps" resultMap="empMap"> select e.*,d.* from Emp e,Dept d where e.deptNo=d.deptNo </select> </mapper>
第三步:測試類
//resultMap:實體的屬性名和表的字段名保證一致用resultMap
//如果報NullException查看小配置的映射關聯(lián)resultMap是否配置
@Test
public void testAllEmp(){
SqlSession session=factory.openSession();
IEmpDao mapper = session.getMapper(IEmpDao.class);
List<Emp> allEmps = mapper.getAllEmps();
for (Emp emp : allEmps) {
System.out.println(emp.getEmpName()+"\t隸屬部門"+emp.getDept().getDeptName());
}
session.close();
}
第四步:在大配置引入小配置
三、提取sql列
解析:Sql標簽簡化代碼量在小配置里面寫
<!-- SQl標簽的使用 --> <sql id="columns"> d.deptNo,d.deptName </sql> <!-- SQl標簽的使用 --> <select id="getAllEmps" resultMap="empMap"> select e.*,<include refid="columns"/>from Emp e,Dept d where e.deptNo=d.deptNo </select>
四、Alias別名
解析:在大配置上寫,這樣的話在小配置就可以引用別名了
<!-- Alias別名 小配置里面的type的屬性值改成別名--> <typeAliases> <typeAlias type="cn.resultMap.enetity.Emp" alias="emp"/> </typeAliases>
五、動態(tài)操作
解析:用于實現(xiàn)動態(tài)SQL的元素主要有:
if choose(when,otherwise) where set
Eg 查看在北京城市的人員
第一步:接口
package cn.resultMap.dao;
import java.util.List;
import cn.resultMap.enetity.Emp;
public interface IEmpDao {
//檢索所有員工,以及隸屬部門
public List<Emp> getAllEmps();
}
第二步:小配<?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">
<mapper namespace="cn.resultMap.dao.IEmpDao">
<resultMap type="cn.resultMap.enetity.Emp" id="empMap">
<id property="empId" column="EMPID"/>
<result property="empName" column="EMPNAME"/>
<result property="empCity" column="EMPCITY"/>
<!-- 員工角度 多的一方,嵌入一的一方的各個屬性請使用association -->
<association property="dept" javaType="cn.resultMap.enetity.Dept">
<result property="deptName" column="DEPTNAME"/>
<result property="deptNo" column="DEPTNO"/>
</association>
</resultMap>
<select id="getAllEmps" resultMap="empMap">
select e.*,d.* from Emp e,Dept d
where e.deptNo=d.deptNo
</select>
<!--查詢動態(tài)查詢 -->
<select id="testAllEmpBuSelect" parameterType="cn.resultMap.enetity.Emp" resultType="cn.resultMap.enetity.Emp">
select * from Emp
<where>
<if test="empId!=null">
and empId=#{empId}
</if>
<if test="empName!=null">
and empName=#{empName}
</if>
<if test="empCity!=null">
and empCity=#{empCity}
</if>
</where>
</select>
</mapper>
第三步:測試
//動態(tài)查詢
@Test
public void testSelect(){
SqlSession session=factory.openSession();
Emp emp=new Emp();
//emp.setEmpName("331");
emp.setEmpCity("sh");
List<Emp> list = session.selectList("cn.resultMap.dao.IEmpDao.testAllEmpBuSelect",emp);
for (Emp emps : list) {
System.out.println(emps.getEmpName());
}
session.close();
}
第四步:在大配置引入小配置
Eg 修改部門信息
第一步:接口
第二步:小配置
<?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">
<mapper namespace="cn.resultMap.dao.IDeptDao">
<resultMap type="cn.happy.entity.Dept" id="deptResultMap">
<id property="deptNo" column="deptNo"/>
<result property="deptName" column="deptName"/>
</resultMap>
<select id="getAllDept" resultMap="deptResultMap">
select d.*,e.* from Dept d,Emp e
where d.deptNo=e.deptNo and d.deptNo=#{deptNo}
</select>
<!--修改動態(tài)查詢 -->
<select id="testUpdate" parameterType="int" resultType="cn.resultMap.enetity.Dept">
update dept
<set>
<if test="deptNo!=null">
deptNo=#{deptNo},
</if>
<if test="deptName!=null">
deptName=#{deptName},
</if>
</set>
where deptNo=#{deptNo}
</select>
</mapper>
第三步:測試
/**
* 動態(tài)修改
* */
@Test
public void testUpdate(){
SqlSession session=factory.openSession();
Dept dept=new Dept();
dept.setDeptName("財務部");
dept.setDeptNo(1);
int count = session.update("cn.resultMap.dao.IDeptDao.testUpdate",dept);
session.commit();
System.out.println(count);
session.close();
}
以上所述是小編給大家介紹的詳解MyBatis的getMapper()接口、resultMap標簽、Alias別名、 盡量提取sql列、動態(tài)操作,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
SpringMVC中的ResourceUrlProviderExposingInterceptor詳解
這篇文章主要介紹了SpringMVC中的ResourceUrlProviderExposingInterceptor詳解,ResourceUrlProviderExposingInterceptor是Spring MVC的一個HandlerInterceptor,用于向請求添加一個屬性,需要的朋友可以參考下2023-12-12
基于Java SWFTools實現(xiàn)把pdf轉成swf
這篇文章主要介紹了基于Java SWFTools實現(xiàn)把pdf轉成swf,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
Java實現(xiàn)日志文件監(jiān)聽并讀取相關數(shù)據(jù)的方法實踐
本文主要介紹了Java實現(xiàn)日志文件監(jiān)聽并讀取相關數(shù)據(jù)的方法實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
SpringMVC+ZTree實現(xiàn)樹形菜單權限配置的方法
本篇文章主要介紹了SpringMVC+ZTree實現(xiàn)樹形菜單權限配置的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
Flutter實現(xiàn)文本組件、圖標及按鈕組件的代碼
這篇文章主要介紹了Flutter實現(xiàn)文本組件、圖標及按鈕組件的代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07
SpringBoot整合Thymeleaf與FreeMarker視圖層技術
在目前的企業(yè)級應用開發(fā)中,前后端分離是趨勢,但是視圖層技術還占有一席之地。Spring Boot 對視圖層技術提供了很好的支持,福安防推薦使用的模板引擎是Thymeleaf,不過想FreeMarker也支持,JSP技術在這里并不推薦使用2022-08-08

