详解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的getmapper()接口、resultmap标签、alias别名、 尽量提取sql列、动态操作,希望对大家有所帮助