zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    求正方形的面积和周长
    面向对象练习——校园管理系统
    python--面向对象(最全讲解)
    git删除远程仓库的文件或目录
    git设置忽略文件和目录
    计算器
    织梦标签整理
    比较恶心的360老年版浏览器 文件导出下载
    织梦文章列表样式多元化实现
    php函数整理
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7084590.html
Copyright © 2011-2022 走看看