Mybatis中配置Mapper的方法

Posted elim168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis中配置Mapper的方法相关的知识,希望对你有一定的参考价值。

Mybatis中配置Mapper的方法

 

       在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置。关于基础部分的内容可以参考http://blog.csdn.net/elim168/article/details/40622491

       我们知道在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.         
  81.   

 

 

 

以上是关于Mybatis中配置Mapper的方法的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis中配置Mapper的方法

MyBatis—02—代替Dao层的mapper映射文件;MyBatis配置文件详解

mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

Mybatis配置问题解决Invalid bound statement (not found)

mybatis 自动生成 mapper

MyBatis框架中Mapper映射配置的使用及原理