mybatis实现动态代理
取消掉Dao接口的实现类,因为DAO接口的实现类,仅仅是通过SQLsession的实现类,定位到映射文件的XML语句,做真正操作的是XML中的语句,对DB进行操作,所以就抛开了DAO接口的实现类,这种操作方式就叫做Mapper的动态代理
Mapper接口开发要遵循一下几个规范
1.mapper.xml文件的namespace与mapper定义的接口类路径相同
2.Mapper定义的方法名与mapper.xml文件中的每一个statement的ID都相同
3.mapper接口方法的输入参数类型和mapper.xml中每个sql定义的ParamenterTypr的类型相同
4.mapper接口方法的输出参数类型和mapper.xml中每个sql定义的resultTypr的类型相同
遵循了以上的规范,再去写测试类。不需要DAO的实现类,也能实现相应的功能
USER.XML文件
id就是相应接口实现类的ID ,resuleType 是返回类型
这里说一下resuleType 和resuleMap的区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
parameterType是相应传入参数的类型
1 <?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"> 2 <mapper namespace="org.lizi.userdao.UserDao"> 3 4 <select id="findAllUser" resultType="User" parameterType="_int"> 5 select * from User 6 <where> 7 id = #{arg0} 8 </where> 9 </select> 10 </mapper>
多条参数查询可以省略掉parameterType 使用#{arg0},#{arg1}代表相应的参数
也可以将参数封装成一个Map进行查询。
在xml文件中 调用map的Key即可
1 @Test 2 public void findUserByMaptest(){ 3 SqlSession session = Tools.getSession(); 4 UserDao ud = session.getMapper(UserDao.class); 5 Map<String, Object> map = new HashMap<String, Object>(); 6 map.put("id", 2); 7 User u = ud.findUserByMap(map); 8 System.out.println(u); 9 }
1 <select id="findUserByMap" resultType="User"> 2 select * from User 3 <where> 4 id = #{id} 5 </where> 6 </select>
下面来说动态SQL标签
常用的动态SQL标签是 <if> <where> <choose> <foreach> <when> <otherwise>