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.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!!!!!只是平有MyBatis哦!!!!!

 

网站地图xml地图