你的位置:首页 > ASP.net教程

[ASP.net教程]MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作


一、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.

  解析:select里面的Id属性要和接口里面的接口方法名一样;mapper的namespace属性包名是cn.happy.dao.IDeptDao接口

<?"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());    }

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

<?"1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//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." />      </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)

<?"1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//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();}

  第二步:小配置

  

<?"1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.resultMap.dao.IEmpDao">   <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 1=1      <if test="empId!=null">        and empId=#{empId}      </if>            <if test="empName!=null">        and empName=#{empName}      </if>            <if test="empCity!=null">        and empCity=#{empCity}      </if>          </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();    }

 第四步:在大配置引入小配置

 

       分享MyBatis!!!!!只是一部分哦!!!!!