Mybatis中配置Mapper的方法

来源:互联网 发布:网络维护常用工具 编辑:程序博客网 时间:2024/05/16 18:37

Mybatis中配置Mapper的方法

 

       在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置。关于基础部分的内容可以参考http://haohaoxuexi.iteye.com/blog/1333271。

       我们知道在Mybatis中定义Mapper信息有两种方式,一种是利用xml写一个对应的包含Mapper信息的配置文件;另一种就是定义一个Mapper接口,然后定义一些相应的操作方法,再辅以相应的操作注解。

       现假设我有这样一个实体类:

Java代码  收藏代码
  1. package com.tiantian.mybatis.model;  
  2.    
  3. public class User {  
  4.    
  5.     private int id;  
  6.     private String name;  
  7.     private int age;  
  8.     public int getId() {  
  9.        return id;  
  10.     }  
  11.     public void setId(int id) {  
  12.        this.id = id;  
  13.     }  
  14.     public String getName() {  
  15.        return name;  
  16.     }  
  17.     public void setName(String name) {  
  18.        this.name = name;  
  19.     }  
  20.     public int getAge() {  
  21.        return age;  
  22.     }  
  23.     public void setAge(int age) {  
  24.        this.age = age;  
  25.     }  
  26.      
  27. }  

 

       它对应的数据库表结构是这样的:


 

然后我要利用Mybatis对它做一个简单的增删改查操作,那么如果利用xml配置Mapper的方式来定义的话,我对应的UserMapper.xml文件会是这样:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3.   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5.    
  6. <mapper namespace="com.tiantian.mybatis.mapper.UserMapper">  
  7.     <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyColumn="id">  
  8.        insert into t_user(name, age) values(#{name}, #{age})  
  9.     </insert>  
  10.      
  11.     <update id="updateUser" parameterType="User">  
  12.        update t_user set name=#{name}, age=#{age} where id=#{id}  
  13.     </update>  
  14.      
  15.     <select id="findById" parameterType="int" resultType="User">  
  16.        select * from t_user where id=#{id}  
  17.     </select>  
  18.      
  19.     <delete id="deleteUser" parameterType="int">  
  20.        delete from t_user where id=#{id}  
  21.     </delete>  
  22. </mapper>  

 

       如果使用接口加注解的方式,那么我们的UserMapper接口应该这样定义:

Java代码  收藏代码
  1. package com.tiantian.mybatis.mapperinterface;  
  2.    
  3. import org.apache.ibatis.annotations.Delete;  
  4. import org.apache.ibatis.annotations.Insert;  
  5. import org.apache.ibatis.annotations.Select;  
  6. import org.apache.ibatis.annotations.Update;  
  7.    
  8. import com.tiantian.mybatis.model.User;  
  9.    
  10. public interface UserMapper {  
  11.    
  12.     @Insert("insert into t_user(name, age) values(#{name}, #{age})")  
  13.     public void insertUser(User user);  
  14.      
  15.     @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")  
  16.     public void updateUser(User user);  
  17.      
  18.     @Select("select * from t_user where id=#{id}")  
  19.     public User findById(int id);  
  20.      
  21.     @Delete("delete from t_user where id=#{id}")  
  22.     public void deleteUser(int id);  
  23.      
  24. }  

 

       注意看这里我故意把UserMapper接口的namespace也就是它的包名置为与UserMapper.xml的namespace属性不一样。这主要是为了要更好的讲以下的内容。

       接下来要做的就是把Mapper信息注册到Mybatis的配置中,告诉Mybatis我们定义了哪些Mapper信息。这主要是在Mybatis的配置文件中通过mappers元素来进行的。在以前版本的Mybatis中我们在Mybatis的配置文件中需要这样定义Mapper信息资源的位置。

Xml代码  收藏代码
  1. <mappers>  
  2.    <mapper resource="com/tiantian/mybatis/mapper/UserMapper1.xml"/>  
  3.    <mapper url="file:///E:/UserMapper.xml"/>  
  4. </mappers>  

 

       这主要是通过mapper元素的resource和url属性来指定的,resource属性指定的是相对于跟类路径下的资源,url属性指定的是通过URL可以获取到的资源。这有一点不好的地方,当我们使用Mapper接口加注解来定义当前Mapper的操作信息时,我们还需要定义一个与它对应的Mapper.xml文件。如:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3.   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="com.tiantian.mybatis.mapperinterface.UserMapper">  
  6.    
  7. </mapper>  

 

 

Java代码  收藏代码
  1. package com.tiantian.mybatis.mapperinterface;  
  2.    
  3. import org.apache.ibatis.annotations.Delete;  
  4. import org.apache.ibatis.annotations.Insert;  
  5. import org.apache.ibatis.annotations.Select;  
  6. import org.apache.ibatis.annotations.Update;  
  7.    
  8. import com.tiantian.mybatis.model.User;  
  9.    
  10. public interface UserMapper {  
  11.    
  12.     @Insert("insert into t_user(name, age) values(#{name}, #{age})")  
  13.     public void insertUser(User user);  
  14.      
  15.     @Update("update t_user set name=#{name}, age=#{age} where id=#{id}")  
  16.     public void updateUser(User user);  
  17.      
  18.     @Select("select * from t_user where id=#{id}")  
  19.     public User findById(int id);  
  20.      
  21.     @Delete("delete from t_user where id=#{id}")  
  22.     public void deleteUser(int id);  
  23.      
  24. }  

 

 

       我发现在现在使用的这个Mybatis3.2.1中这个问题已经得到了改善,现在我们在定义基于接口的定义的Mapper时可以通过一个class属性来指定接口。

Xml代码  收藏代码
  1. <mappers>  
  2.    <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>  
  3. </mappers>  

 

       除了通过class属性指定Mapper接口外,Mybatis还为我们提供了一个可以同时指定多个Mapper接口的方法。在现在的Mybatis版本中我们可以在mappers元素下面定义一个package子元素,用以指定Mapper接口所在的包,这样Mybatis就会把这个包下面的所有Mapper接口都进行注册。

Xml代码  收藏代码
  1. <mappers>  
  2.    <package name="com.tiantian.mybatis.mapperinterface"/>  
  3. </mappers>  

 

       这里的一个package只针对于一个包。当在多个包里面定义有Mapper接口时,我们需要定义对应的多个package元素。

这四种注册Mapper的方式就是我想在这篇文章中表达的。总结一下:

Xml代码  收藏代码
  1. <mappers>  
  2.    <!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 -->  
  3.    <package name="com.tiantian.mybatis.mapperinterface"/>  
  4.    <!-- 通过mapper元素的resource属性可以指定一个相对于类路径的Mapper.xml文件 -->  
  5.    <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>  
  6.    <!-- 通过mapper元素的url属性可以指定一个通过URL请求道的Mapper.xml文件 -->  
  7.    <mapper url="file:///E:/UserMapper.xml"/>  
  8.    <!-- 通过mapper元素的class属性可以指定一个Mapper接口进行注册 -->  
  9.    <mapper class="com.tiantian.mybatis.mapperinterface.UserMapper"/>  
  10. </mappers>  

 

       当使用mapper元素进行Mapper定义的时候需要注意:mapper的三个属性resource、url和class对于每个mapper元素只能指定一个,要么指定resource属性,要么指定url属性,要么指定class属性,不能都指定,也不能都不指定。

下面将对上面的代码给出一些对应的测试代码。先贴出测试对应的Mybatis的配置文件:

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration  
  3.   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4.   "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.    
  7.     <properties resource="config/jdbc.properties"></properties>  
  8.     <typeAliases>  
  9.        <package name="com.tiantian.mybatis.model"/>  
  10.     </typeAliases>  
  11.     <environments default="development">  
  12.        <environment id="development">  
  13.            <transactionManager type="JDBC" />  
  14.            <dataSource type="POOLED">  
  15.               <property name="driver" value="${jdbc.driver}" />  
  16.               <property name="url" value="${jdbc.url}" />  
  17.               <property name="username" value="${jdbc.username}" />  
  18.               <property name="password" value="${jdbc.password}" />  
  19.            </dataSource>  
  20.        </environment>  
  21.     </environments>  
  22.     <mappers>  
  23.        <mapper resource="com/tiantian/mybatis/mapper/UserMapper.xml"/>  
  24.        <package name="com.tiantian.mybatis.mapperinterface"/>  
  25.     </mappers>  
  26. </configuration>  

 

       1.对于使用xml方式定义的UserMapper.xml,然后直接使用SqlSession访问定义在其中的statement的测试:

Java代码  收藏代码
  1. package com.tiantian.mybatis.test;  
  2.    
  3. import org.apache.ibatis.session.SqlSession;  
  4. import org.apache.ibatis.session.SqlSessionFactory;  
  5. import org.junit.Before;  
  6. import org.junit.Test;  
  7.    
  8. import com.tiantian.mybatis.model.User;  
  9. import com.tiantian.mybatis.util.Util;  
  10.    
  11. /** 
  12.  * 
  13.  * 这个类主要用来测试直接使用SqlSession访问定义在UserMapper.xml文件中的statement 
  14.  * 
  15.  */  
  16. public class UserMapperTest {  
  17.    
  18.     SqlSessionFactory sqlSessionFactory = null;  
  19.      
  20.     @Before  
  21.     public void before() {  
  22.        sqlSessionFactory = Util.getSqlSessionFactory();  
  23.     }  
  24.      
  25.     @Test  
  26.     public void testInsert() {  
  27.        SqlSession sqlSession = sqlSessionFactory.openSession();  
  28.        try {  
  29.            User user = new User();  
  30.            user.setName("张三");  
  31.            user.setAge(30);  
  32.            sqlSession.insert("com.tiantian.mybatis.mapper.UserMapper.insertUser", user);  
  33.            sqlSession.commit();  
  34.        } finally {  
  35.            sqlSession.close();  
  36.        }  
  37.     }  
  38.      
  39.     @Test  
  40.     public void testUpdate() {  
  41.        SqlSession sqlSession = sqlSessionFactory.openSession();  
  42.        try {  
  43.            User user = new User();  
  44.            user.setId(1);  
  45.            user.setName("李四");  
  46.            user.setAge(34);  
  47.            sqlSession.update("com.tiantian.mybatis.mapper.UserMapper.updateUser", user);  
  48.            sqlSession.commit();  
  49.        } finally {  
  50.            sqlSession.close();  
  51.        }  
  52.     }  
  53.      
  54.     @Test  
  55.     public void testFind() {  
  56.        SqlSession sqlSession = sqlSessionFactory.openSession();  
  57.        try {  
  58.            User user = sqlSession.selectOne("com.tiantian.mybatis.mapper.UserMapper.findById", 1);  
  59.            System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());  
  60.        } finally {  
  61.            sqlSession.close();  
  62.        }  
  63.     }  
  64.      
  65.     @Test  
  66.     public void testDelele() {  
  67.        SqlSession sqlSession = sqlSessionFactory.openSession();  
  68.        try {  
  69.            sqlSession.delete("com.tiantian.mybatis.mapper.UserMapper.deleteUser", 2);  
  70.            sqlSession.commit();  
  71.        } finally {  
  72.            sqlSession.close();  
  73.        }  
  74.     }  
  75.      
  76. }  

 

 

       2.对于使用Mapper接口加对应的注解来定义的Mapper信息直接使用SqlSession访问Mapper接口中使用注解定义好的statement的测试:

Java代码  收藏代码
  1. package com.tiantian.mybatis.test;  
  2.    
  3. import org.apache.ibatis.session.SqlSession;  
  4. import org.apache.ibatis.session.SqlSessionFactory;  
  5. import org.junit.Before;  
  6. import org.junit.Test;  
  7.    
  8. import com.tiantian.mybatis.model.User;  
  9. import com.tiantian.mybatis.util.Util;  
  10.    
  11. /** 
  12.  * 
  13.  *这个类是测试直接使用SqlSession访问UserMapper接口中使用注解定义好的statement 
  14.  * 
  15.  */  
  16. public class UserMapperTest2 {  
  17.    
  18.        SqlSessionFactory sqlSessionFactory = null;  
  19.         
  20.        @Before  
  21.        public void before() {  
  22.               sqlSessionFactory = Util.getSqlSessionFactory();  
  23.        }  
  24.         
  25.        @Test  
  26.        public void testInsert() {  
  27.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  28.               try {  
  29.                      User user = new User();  
  30.                      user.setName("张三");  
  31.                      user.setAge(30);  
  32.                      sqlSession.insert("com.tiantian.mybatis.mapperinterface.UserMapper.insertUser", user);  
  33.                      sqlSession.commit();  
  34.               } finally {  
  35.                      sqlSession.close();  
  36.               }  
  37.        }  
  38.         
  39.        @Test  
  40.        public void testUpdate() {  
  41.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  42.               try {  
  43.                      User user = new User();  
  44.                      user.setId(1);  
  45.                      user.setName("李四");  
  46.                      user.setAge(34);  
  47.                      sqlSession.update("com.tiantian.mybatis.mapperinterface.UserMapper.updateUser", user);  
  48.                      sqlSession.commit();  
  49.               } finally {  
  50.                      sqlSession.close();  
  51.               }  
  52.        }  
  53.         
  54.        @Test  
  55.        public void testFind() {  
  56.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  57.               try {  
  58.                      User user = sqlSession.selectOne("com.tiantian.mybatis.mapperinterface.UserMapper.findById", 1);  
  59.                      System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());  
  60.               } finally {  
  61.                      sqlSession.close();  
  62.               }  
  63.        }  
  64.         
  65.        @Test  
  66.        public void testDelele() {  
  67.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  68.               try {  
  69.                      sqlSession.delete("com.tiantian.mybatis.mapperinterface.UserMapper.deleteUser", 3);  
  70.                      sqlSession.commit();  
  71.               } finally {  
  72.                      sqlSession.close();  
  73.               }  
  74.        }  
  75.         
  76. }  

 

 

       3.对于使用Mapper接口加注解定义好的Mapper信息通过SqlSession获取其对应的Mapper接口来操作其中定义好的statement的测试:

Java代码  收藏代码
  1. package com.tiantian.mybatis.test;  
  2.    
  3. import org.apache.ibatis.session.SqlSession;  
  4. import org.apache.ibatis.session.SqlSessionFactory;  
  5. import org.junit.Before;  
  6. import org.junit.Test;  
  7.    
  8. import com.tiantian.mybatis.mapperinterface.UserMapper;  
  9. import com.tiantian.mybatis.model.User;  
  10. import com.tiantian.mybatis.util.Util;  
  11.    
  12. /** 
  13.  * 
  14.  *这个类是测试使用SqlSession获取UserMapper接口来执行使用注解定义在UserMapper接口中的statement 
  15.  * 
  16.  */  
  17. public class UserMapperTest3 {  
  18.    
  19.        SqlSessionFactory sqlSessionFactory = null;  
  20.         
  21.        @Before  
  22.        public void before() {  
  23.               sqlSessionFactory = Util.getSqlSessionFactory();  
  24.        }  
  25.         
  26.        @Test  
  27.        public void testInsert() {  
  28.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  29.               try {  
  30.                      User user = new User();  
  31.                      user.setName("张三");  
  32.                      user.setAge(30);  
  33.                      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  34.                      userMapper.insertUser(user);  
  35.                      sqlSession.commit();  
  36.               } finally {  
  37.                      sqlSession.close();  
  38.               }  
  39.        }  
  40.         
  41.        @Test  
  42.        public void testUpdate() {  
  43.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  44.               try {  
  45.                      User user = new User();  
  46.                      user.setId(1);  
  47.                      user.setName("李四");  
  48.                      user.setAge(34);  
  49.                      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  50.                      userMapper.updateUser(user);  
  51.                      sqlSession.commit();  
  52.               } finally {  
  53.                      sqlSession.close();  
  54.               }  
  55.        }  
  56.         
  57.        @Test  
  58.        public void testFind() {  
  59.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  60.               try {  
  61.                      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  62.                      User user = userMapper.findById(1);  
  63.                      System.out.println(user.getId() + "--" + user.getName() + "--" + user.getAge());  
  64.               } finally {  
  65.                      sqlSession.close();  
  66.               }  
  67.        }  
  68.         
  69.        @Test  
  70.        public void testDelele() {  
  71.               SqlSession sqlSession = sqlSessionFactory.openSession();  
  72.               try {  
  73.                      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  74.                      userMapper.deleteUser(5);  
  75.                      sqlSession.commit();  
  76.               } finally {  
  77.                      sqlSession.close();  
  78.               }  
  79.        }  
  80.         

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完孩子有肚腩怎么办 生完宝宝肚子还是很大怎么办 生完孩子小腹大怎么办 生完孩子肚皮松怎么办 生过孩子肚子松怎么办 生完孩子肚皮痒怎么办 生完小孩肚子松弛怎么办 生了孩子肚子大怎么办 嫁到别的省户口怎么办 孕中期假性宫缩怎么办 频繁的假性宫缩怎么办 显卡风扇不转了怎么办 老是想不好的事怎么办 做人工受孕多囊怎么办 子宫内有囊肿该怎么办 子宫长了个囊肿怎么办 怀孕后不想要该怎么办 20多岁雌激素低怎么办 生完小孩后子宫下垂怎么办 取环之前同房了怎么办 做人流后又怀孕怎么办 仓鼠长了个肿瘤怎么办 过敏留下的黑印怎么办 脸上痘痘发炎了怎么办 脸上皮肤红痒怎么办啊 皮肤有一片红痒怎么办 脸过敏期间很干怎么办 怀孕了用了消糜栓怎么办 乳酸杆菌少或无怎么办 怀孕了白带有异味怎么办 怀孕清洁度iv度怎么办 怀孕了下面有异味怎么办 孕妇尿白细胞1是怎么办 药流期间喂奶了怎么办 20多岁卵巢早衰怎么办 3岁儿童肚子胀气怎么办 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办