欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

程序员文章站 2024-03-13 20:24:13
一、getmapper()接口   解析:getmapper()接口 idept.class定义一个接口,      挂载一个没有实现的方法,特殊之处,借楼任何...

一、getmapper()接口

  解析:getmapper()接口 idept.class定义一个接口,

     挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的

     通过代理:生成接口的实现类名称,在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);相当于实现类,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帮我们在内存中代理出一个接口的实现类======相当于强类型
//mapper是一个实现类对象
ideptdao mapper = session.getmapper(ideptdao.class);
list<dept> list = mapper.getalldept();
for (dept dept : list) {
system.out.println(dept.getdeptname());
}

  第四步:全文统一用一个大配置

<?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>
<!--映射文件:描述某个实体和数据库表的对应关系 -->
<mappers>
<mapper resource="cn/resultmap/enetity/emp.xml" />
</mappers>
</configuration>

二、resultmap标签

    解析:使用的场景是当实体类的属性与数据库不匹配的时候需要用到resultmap实体类和数据库的属性必须一致。(之前用的是实体类)

eg检索所有员工,以及隶属部门

  第一步:创建一个接口

package cn.resultmap.dao;
import java.util.list;
import cn.resultmap.enetity.emp;
public interface iempdao {
//检索所有员工,以及隶属部门
public list<emp> getallemps();
}

   第二步:配置小配置里面的属性

  解析: 员工角度 多的一方,嵌入一的一方的各个属性请使用association 是关联(如果去掉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查看小配置的映射关联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>

五、动态操作

解析:用于实现动态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>
<!--查询动态查询 -->
<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>

第三步:测试

//动态查询
@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>
<!--修改动态查询 -->
<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> 

  第三步:测试 

/**
* 动态修改
* */
@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列、动态操作,希望对大家有所帮助