Mybatis中配置Mapper的方法

幽沉谢世事,俯默窥唐虞。这篇文章主要讲述Mybatis中配置Mapper的方法相关的知识,希望能为你提供帮助。
Mybatis中配置Mapper的方法

 
            在这篇文章中我主要想讲一下Mybatis配置文件里mappers元素的配置。
关于基础部分的内容能够參考http://blog.csdn.net/elim168/article/details/40622491。
            我们知道在Mybatis中定义Mapper信息有两种方式,一种是利用xml写一个对应的包括Mapper信息的配置文件;还有一种就是定义一个Mapper接口,然后定义一些对应的操作方法,再辅以对应的操作注解。

            现如果我有这样一个实体类:
java代码 

Mybatis中配置Mapper的方法

文章图片
  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中配置Mapper的方法
 
然后我要利用Mybatis对它做一个简单的增删改查操作。那么假设利用xml配置Mapper的方式来定义的话,我相应的UserMapper.xml文件会是这样:
Xml代码  Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  1. < mappers>    
  2.       < mapper  class=" com.tiantian.mybatis.mapperinterface.UserMapper" />    
  3. < /mappers>    
 
【Mybatis中配置Mapper的方法】            除了通过class属性指定Mapper接口外。Mybatis还为我们提供了一个能够同一时候指定多个Mapper接口的方法。在如今的Mybatis版本号中我们能够在mappers元素以下定义一个package子元素,用以指定Mapper接口所在的包,这样Mybatis就会把这个包以下的全部Mapper接口都进行注冊。
Xml代码 
Mybatis中配置Mapper的方法

文章图片
  1. < mappers>    
  2.       < package  name=" com.tiantian.mybatis.mapperinterface" />    
  3. < /mappers>    
 
            这里的一个package仅仅针对于一个包。当在多个包里面定义有Mapper接口时,我们须要定义相应的多个package元素。

这四种注冊Mapper的方式就是我想在这篇文章中表达的。总结一下:
Xml代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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=https://www.songbingjia.com/android/" ${jdbc.driver}" />
  16.                             < property  name=" url"   value=https://www.songbingjia.com/android/" ${jdbc.url}" />
  17.                             < property  name=" username"   value=https://www.songbingjia.com/android/" ${jdbc.username}" />
  18.                             < property  name=" password"   value=https://www.songbingjia.com/android/" ${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代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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代码 
Mybatis中配置Mapper的方法

文章图片
  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. }   
 
 
 




    推荐阅读