mapper代理开发规则
使用mybatis的代理开发,不仅可以用来管理冗多的xml配置文件,还可以解决硬编码,传递多个参数,简化执行sql的优点。
主要有以下注意事项:
- 定义与映射的配置文件(usermapper.xml)同名的接口类,并且要在同一目录下。
- 映射文件中的namspace属性为接口类的路径。
- 在接口类中实现映射的配置文件方法时,方法名和映射文件的id属性的名称一样。返回数据类型也一样。
- mybatis-config.xml的映射配置文件的路径要一一对应。
对上面有疑惑的可以看我之前的文章 。
创建mapper目录结构和映射接口类
根据上面的规则来具体实现,在java目录下创建mapper软件包,将usermapper接口放在该目录下。
在resources下创建mapper目录,将隐射配置文件放在该目录下。
可以下载mybatisx插件将两者联系起来。
maven目录结构下,java和resources编译后在同一目录下,他们里面的包也是。
所以满足规则但是层级结构必须一样。
当然也可以直接将xml放在java目录下的mapper包中即和usermapper在一起,就不需要考虑其他问题了。满足第一个规则。
修改映射配置文件的namespace属性
使用mapper映射代理开发,这个属性就显得尤为重要,usermapper接口(映射接口类)和usermapper.xml
(映射配置文件)的联系都是产生于namespace属性。
<?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="mapper.usermapper"> <select id="selectall" resulttype="model.user"> select * from user </select> <select id="selectbyid" resulttype="model.user"> select * from user where id=#{id} </select> </mapper>
将namespace的内容由test(自定义)改为mapper.usermapper(映射接口所在的路径)。满足第二个规则。
编写映射接口类的方法
package mapper; import model.user; import java.util.list; public interface usermapper { list<user> selectall(); //默认public关键字修饰,selectall对应xml的id属性 }
前面我们知道xml配置文件的id属性本身时一个方法,可以看作mybatis将其封装为一个resultset(jdbc)的结果集,接口的作用主要是继承该方法并处理结果集。
用list集合存储结果集。满足第三个规则
修改mybatis-config.xml的映射配置文件的路径
<?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> <environments default="development"> <environment id="development"> <transactionmanager type="jdbc"/> <datasource type="pooled"> <!--连接配置-> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </datasource> </environment> </environments> <mappers> <!--mappper映射路径--> <mapper resource="usermapper.xml"/> </mappers> </configuration>
要修改的只有mapper标签下颚resource属性,内容为映射配置文件的路径:mapper/usermapper.xml
这是我的目录结构每个人的不一样。
当然你的映射配置文件较多时直接用packge标签把整个mapper包直接加载进来(包扫描)
如果时直接把包导入的话,就不是/来展现目录的层级了,而是.来体现。如util.chapter.mapper。实现规则四。
编写测试类调用方法
package mybatis; import mapper.usermapper; import model.user; import org.apache.ibatis.io.resources; import org.apache.ibatis.session.sqlsession; import org.apache.ibatis.session.sqlsessionfactory; import org.apache.ibatis.session.sqlsessionfactorybuilder; import org.junit.test; import java.io.ioexception; import java.io.inputstream; import java.util.list; public class mybatistest { @test public void method() throws ioexception { //单元测试不能要static //mybatis框架都在xml配置文件中加载配置文件 //从 xml 文件中构建 sqlsessionfactory 的实例 string resource = "mybatis-config.xml"; inputstream inputstream = null; inputstream = resources.getresourceasstream(resource); sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream); //从 sqlsessionfactory 中获取 sqlsession sqlsession session = sqlsessionfactory.opensession(); //执行sql //list<user> users=session.selectlist("test.selectall"); //system.out.println(users); //mapper代理执行sql usermapper usermapper=session.getmapper(usermapper.class); list<user> users= usermapper.selectall(); //usermapper接口的实现方法 system.out.println(users); //释放资源 session.close(); } }
注意要导入javabean和映射接口类。使用代理和不使用的区别。
如下面的映射文件的配置,那么如何调用有多个参数的方法呢?
配置文件xml
<select id="selectall" resulttype="model.user"> select * from user </select> <select id="selectbyid" resulttype="model.user"> select * from user where id=#{id} </select> <select id="selectmore" resulttype="model.user"> select * from user where id =#{id} and username=#{username} </select>
映射接口类
list<user> selectall(); //默认public关键字修饰 list<user> selectbyid(int id); list<user> selectmore(int id,string name);
mybatis的参数传递:
当传递多个不同类型的参数时mybatis将参数封装为map集合,并默认有key,可以通过@param注解更改key的名称,value保留参数的值,通过更改后的key名称获取参数。当只有一个参数时就不用了。
javabean的参数类型:可以直接使用,对象的属性名和参数占位符保持一致即可,上面使用的reulttype手势javabean对象,位置对应就可以了。
map集合 :map的键和参数占位符一致也直接使用。
(上面的数据类型可以直接传递,位置对应即可)
array,list当数据类型都要加注解@param。
实际上sql的占位符会接收该方法传递的参数,mybatis是将参数封装为一个map集合,占位符的名称就是key,但是系统默认的key并不是,需要用@param将默认的key改为占位符的名称就可以了。
具体操作就是@param中的值与xml文件的占位符一致就可以了,紧跟着就是参数了。调用也是按位置传参。
所有数据类型的都可以用注解@param来传参(p大写)。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论