Mybatis中配置Mapper的方法
在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置。关于基础部分的内容可以参考http://haohaoxuexi.iteye.com/blog/1333271。
我们知道在Mybatis中定义Mapper信息有两种方式,一种是利用xml写一个对应的包含Mapper信息的配置文件;另一种就是定义一个Mapper接口,然后定义一些相应的操作方法,再辅以相应的操作注解。
现假设我有这样一个实体类:
- package com.tiantian.mybatis.model;
- public class User {
- private int id;
- private String name;
- private int age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
它对应的数据库表结构是这样的:
然后我要利用Mybatis对它做一个简单的增删改查操作,那么如果利用xml配置Mapper的方式来定义的话,我对应的UserMapper.xml文件会是这样:
- <?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="com.tiantian.mybatis.mapper.UserMapper">
- <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyColumn="id">
- insert into t_user(name, age) values(#{name}, #{age})
- </insert>
- <update id="updateUser" parameterType="User">
- update t_user set name=#{name}, age=#{age} where id=#{id}
- </update>
- <select id="findById" parameterType="int" resultType="User">
- select * from t_user where id=#{id}
- </select>
- <delete id="deleteUser" parameterType="int">
- delete from t_user where id=#{id}
- </delete>
- </mapper>
如果使用接口加注解的方式,那么我们的UserMapper接口应该这样定义:
- package com.tiantian.mybatis.mapperinterface;
- import org.apache.ibatis.annotations.Delete;
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Select;
- import org.apache.ibatis.annotations.Update;
- import com.tiantian.mybatis.model.User;
- public interface UserMapper {
- @Insert("insert into t_user(name, age) values(#{name}, #{age})")
- public void insertUser(User user);
- @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")
- public void updateUser(User user);
- @Select("select * from t_user where id=#{id}")
- public User findById(int id);
- @Delete("delete from t_user where id=#{id}")
- public void deleteUser(int id);
- }
注意看这里我故意把UserMapper接口的namespace也就是它的包名置为与UserMapper.xml的namespace属性不一样。这主要是为了要更好的讲以下的内容。
接下来要做的就是把Mapper信息注册到Mybatis的配置中,告诉Mybatis我们定义了哪些Mapper信息。这主要是在Mybatis的配置文件中通过mappers元素来进行的。在以前版本的Mybatis中我们在Mybatis的配置文件中需要这样定义Mapper信息资源的位置。
- <mappers>
- <mapper resource="com/tiantian/mybatis/mapper/UserMapper1.xml"/>
- <mapper url="file:///E:/UserMapper.xml"/>
- </mappers>
这主要是通过mapper元素的resource和url属性来指定的,resource属性指定的是相对于跟类路径下的资源,url属性指定的是通过URL可以获取到的资源。这有一点不好的地方,当我们使用Mapper接口加注解来定义当前Mapper的操作信息时,我们还需要定义一个与它对应的Mapper.xml文件。如:
- <?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="com.tiantian.mybatis.mapperinterface.UserMapper">
- </mapper>
- package com.tiantian.mybatis.mapperinterface;
- import org.apache.ibatis.annotations.Delete;
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Select;
- import org.apache.ibatis.annotations.Update;
- import com.tiantian.mybatis.model.User;
- public interface UserMapper {
- @Insert("insert into t_user(name, age) values(#{name}, #{age})")
- public void insertUser(User user);
- @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")
- public void updateUser(User user);
- @Select("select * from t_user where id=#{id}")
- public User findById(int id);
- @Delete("delete from t_user where id=#{id}")
- public void deleteUser(int id);
- }
我发现在现在使用的这个Mybatis3.2.1中这个问题已经得到了改善,现在我们在定义基于接口的定义的Mapper时可以通过一个class属性来指定接口。
- <mappers>
- <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>
- </mappers>
除了通过class属性指定Mapper接口外,Mybatis还为我们提供了一个可以同时指定多个Mapper接口的方法。在现在的Mybatis版本中我们可以在mappers元素下面定义一个package子元素,用以指定Mapper接口所在的包,这样Mybatis就会把这个包下面的所有Mapper接口都进行注册。
- <mappers>
- <package name="com.tiantian.mybatis.mapperinterface"/>
- </mappers>
这里的一个package只针对于一个包。当在多个包里面定义有Mapper接口时,我们需要定义对应的多个package元素。
这四种注册Mapper的方式就是我想在这篇文章中表达的。总结一下:
- <mappers>
- <!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 -->
- <package name="com.tiantian.mybatis.mapperinterface"/>
- <!-- 通过mapper元素的resource属性可以指定一个相对于类路径的Mapper.xml文件 -->
- <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>
- <!-- 通过mapper元素的url属性可以指定一个通过URL请求道的Mapper.xml文件 -->
- <mapper url="file:///E:/UserMapper.xml"/>
- <!-- 通过mapper元素的class属性可以指定一个Mapper接口进行注册 -->
- <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>
- </mappers>
当使用mapper元素进行Mapper定义的时候需要注意:mapper的三个属性resource、url和class对于每个mapper元素只能指定一个,要么指定resource属性,要么指定url属性,要么指定class属性,不能都指定,也不能都不指定。
下面将对上面的代码给出一些对应的测试代码。先贴出测试对应的Mybatis的配置文件:
- <?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>
- <properties resource="config/jdbc.properties"></properties>
- <typeAliases>
- <package name="com.tiantian.mybatis.model"/>
- </typeAliases>
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC" />
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driver}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>
- <package name="com.tiantian.mybatis.mapperinterface"/>
- </mappers>
- </configuration>
1.对于使用xml方式定义的UserMapper.xml,然后直接使用SqlSession访问定义在其中的statement的测试:
- package com.tiantian.mybatis.test;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.junit.Before;
- import org.junit.Test;
- import com.tiantian.mybatis.model.User;
- import com.tiantian.mybatis.util.Util;
- /**
- *
- * 这个类主要用来测试直接使用SqlSession访问定义在UserMapper.xml文件中的statement
- *
- */
- public class UserMapperTest {
- SqlSessionFactory sqlSessionFactory = null;
- @Before
- public void before() {
- sqlSessionFactory = Util.getSqlSessionFactory();
- }
- @Test
- public void testInsert() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = new User();
- user.setName("张三");
- user.setAge(30);
- sqlSession.insert("com.tiantian.mybatis.mapper.UserMapper.insertUser", user);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testUpdate() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = new User();
- user.setId(1);
- user.setName("李四");
- user.setAge(34);
- sqlSession.update("com.tiantian.mybatis.mapper.UserMapper.updateUser", user);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testFind() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = sqlSession.selectOne("com.tiantian.mybatis.mapper.UserMapper.findById", 1);
- System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testDelele() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- sqlSession.delete("com.tiantian.mybatis.mapper.UserMapper.deleteUser", 2);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- }
2.对于使用Mapper接口加对应的注解来定义的Mapper信息直接使用SqlSession访问Mapper接口中使用注解定义好的statement的测试:
- package com.tiantian.mybatis.test;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.junit.Before;
- import org.junit.Test;
- import com.tiantian.mybatis.model.User;
- import com.tiantian.mybatis.util.Util;
- /**
- *
- *这个类是测试直接使用SqlSession访问UserMapper接口中使用注解定义好的statement
- *
- */
- public class UserMapperTest2 {
- SqlSessionFactory sqlSessionFactory = null;
- @Before
- public void before() {
- sqlSessionFactory = Util.getSqlSessionFactory();
- }
- @Test
- public void testInsert() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = new User();
- user.setName("张三");
- user.setAge(30);
- sqlSession.insert("com.tiantian.mybatis.mapperinterface.UserMapper.insertUser", user);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testUpdate() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = new User();
- user.setId(1);
- user.setName("李四");
- user.setAge(34);
- sqlSession.update("com.tiantian.mybatis.mapperinterface.UserMapper.updateUser", user);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testFind() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = sqlSession.selectOne("com.tiantian.mybatis.mapperinterface.UserMapper.findById", 1);
- System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testDelele() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- sqlSession.delete("com.tiantian.mybatis.mapperinterface.UserMapper.deleteUser", 3);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- }
3.对于使用Mapper接口加注解定义好的Mapper信息通过SqlSession获取其对应的Mapper接口来操作其中定义好的statement的测试:
- package com.tiantian.mybatis.test;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.junit.Before;
- import org.junit.Test;
- import com.tiantian.mybatis.mapperinterface.UserMapper;
- import com.tiantian.mybatis.model.User;
- import com.tiantian.mybatis.util.Util;
- /**
- *
- *这个类是测试使用SqlSession获取UserMapper接口来执行使用注解定义在UserMapper接口中的statement
- *
- */
- public class UserMapperTest3 {
- SqlSessionFactory sqlSessionFactory = null;
- @Before
- public void before() {
- sqlSessionFactory = Util.getSqlSessionFactory();
- }
- @Test
- public void testInsert() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = new User();
- user.setName("张三");
- user.setAge(30);
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- userMapper.insertUser(user);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testUpdate() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- User user = new User();
- user.setId(1);
- user.setName("李四");
- user.setAge(34);
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- userMapper.updateUser(user);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testFind() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- User user = userMapper.findById(1);
- System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testDelele() {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- try {
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- userMapper.deleteUser(5);
- sqlSession.commit();
- } finally {
- sqlSession.close();
- }
- }
- }
Mybatis中配置Mapper的方法的更多相关文章
- Mybatis中的Mapper.xml映射文件sql查询接收多个参数
我们都知道,在Mybatis中的Mapper.xml映射文件可以定制动态SQL,在dao层定义的接口中定义的参数传到xml文件中之后,在查询之前mybatis会对其进行动态解析,通常使用#{}接收 ...
- mybatis框架(2)---mapper代理方法
mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1) ...
- mybatis(三)配置mapper.xml 的基本操作
参考:https://www.cnblogs.com/wuzhenzhao/p/11101555.html XML 映射文件 本文参考mybatis中文官网进行学习总结:http://www.myba ...
- mybatis中的mapper接口文件以及example类的实例函数以及详解
##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列 ...
- mybatis中的mapper接口文件以及selectByExample类的实例函数详解
记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...
- 详解struts2中配置action的方法
如何解决action太多的问题??我们因为需要不同的方法,所以往往建立很多不同的类,但是每个类中往往仅仅几行代码,不仅浪费了时间,而且配置起来也很繁琐,所以,建立一个共有的类,然后根据以下方式来操作, ...
- mybatis中的mapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- MyBatis中in 的使用方法
在MyBatis中使用in关键字参数为集合时,需要使用到foreach标签. 下面详细介绍以下foreach标签的几个参数 foreach属性.png 实例: <select id=" ...
- mybatis中配置文件头
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
随机推荐
- iTween基础之Look(使对象面朝指定位置)
一.基础介绍:二.基础属性 原文地址:http://blog.csdn.net/dingkun520wy/article/details/50578142 一.基础介绍 LookTo:旋转游戏对象使其 ...
- 活动图 Activity Diagram
活动图 可通过一系列操作将业务流程或软件进程以工作流的形式显示出来.这些操作可以由人.软件组件或计算机来执行. 使用活动图可以描述多种类型的流程,如下: 1.用户和您的系统之间的业务流程或工作流. 2 ...
- 包装设计模式的实现以改进BufferedReader中的readLine方法为例
实现与目标对象相同的接口 BufferedReader 定义一个变量记住目标对象 定义一个构造器接收被增强对象 覆盖需要增强的方法 对于不想增强的方法,直接调用目标对象的方法. package ...
- 利用QObject反射实现jsonrpc
1.jsonrpc请求中的params数组生成签名 static QString signatureFromJsonArray(const QJsonArray &array) { QStri ...
- Team Homework #3
我们组采访了以下几组学长学姐.因为隐私问题我们不会写出他们的个人信息. 1:平均每周所花时间:10:平均写的代码总数:2000:最有用的部分:锻炼团队合作精神:最没用的部分:写博客:改进:完全不需要博 ...
- java集合类(二)List学习
接上篇 java集合类(一) List接口继承了Collection接口和Iterable接口,即同样含有Collection和 Iterable的特性,还有方法,其基本方法有: 1)有关添加: b ...
- C#异常类总结
http://msdn.microsoft.com/zh-cn/library/aa664610(v=vs.71).aspx C#异常类相关总结 C#异常类一.基类Exception C#异常类二.常 ...
- UML类图关系大全-转
1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来 ...
- html+css学习笔记 5[表格、表单]
表格 -- 默认样式重置 表格标签: table 表格 thead 表格头 tbody 表格主体 tfoot 表格尾 tr 表格行 th 元素定义表头 ...
- 1069: [SCOI2007]最大土地面积 - BZOJ
Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大.Input 第1行一个正整数N,接下来N行,每行2个数x,y, ...