一、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列、动态操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍MyBatis动态Sql之if标签的用法详解,包括了MyBatis动态Sql之if标签的用法详解的使用技巧和注意事项,需要的朋友参考一下 最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动态的Sql,主要包含以下3个场景: 1.根据查询条件实现动态
本文向大家介绍详解Mybatis动态sql,包括了详解Mybatis动态sql的使用技巧和注意事项,需要的朋友参考一下 1.什么是mybatis动态sql 看到动态,我们就应该想到,这是一个可以变化的sql语句 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑 2.mybatis动态sql使用前准备 a.数据库表 b.创建类 3.使用mybatis动
本文向大家介绍mybatis的动态sql详解(精),包括了mybatis的动态sql详解(精)的使用技巧和注意事项,需要的朋友参考一下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。 通常使用动态SQ
1. 前言 本小节,我们将一起学习 MyBatis resultMap 和 sql。 在前面的小节中,我们了解到 MyBatis 可以自动帮助我们映射数据库数据和 Java 对象,其实这是 MyBatis 在幕后帮我们创建了 resultMap 对象;虽然 MyBatis 可以自动帮助我们做数据映射,但是对于复杂的对象,我们就必须自定义 resultMap 了。 而在书写 SQL 时,势必会有一些
本文向大家介绍Mybatis动态SQL实例详解,包括了Mybatis动态SQL实例详解的使用技巧和注意事项,需要的朋友参考一下 动态SQL 什么是动态SQL? MyBatis的官方文档中是这样介绍的? 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列
本文向大家介绍Mybatis中的resultType和resultMap查询操作实例详解,包括了Mybatis中的resultType和resultMap查询操作实例详解的使用技巧和注意事项,需要的朋友参考一下 resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的