Mybatis中配置Mapper的方法

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

Mybatis中配置Mapper的方法

 

       在这篇文章中我主要想讲一下Mybatis配置文件中mappers元素的配置。关于基础部分的内容可以参考http://elim.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();
              }
       }
      
}

 

 

 

 

 

目录
相关文章
|
24天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
27 10
|
2月前
|
SQL XML Java
mybatis复习01,简单配置让mybatis跑起来
文章介绍了MyBatis的基本概念、历史和特点,并详细指导了如何配置MyBatis环境,包括创建Maven项目、添加依赖、编写核心配置文件、创建数据表和实体类、编写Mapper接口和XML配置文件,以及如何编写工具类和测试用例。
mybatis复习01,简单配置让mybatis跑起来
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
缓存 Java 数据库连接
mybatis1.常见配置
本文介绍了MyBatis框架中的常见配置及其加载顺序。配置可通过`properties`元素、资源文件或方法参数传递,其中方法参数传递的属性具有最高优先级。文章列举了几个重要的配置项,如`cacheEnabled`用于全局开启或关闭缓存功能;`lazyLoadingEnabled`控制对象的延迟加载行为;`useGeneratedKeys`允许JDBC支持自动生成主键;`defaultExecutorType`设定默认执行器类型等。此外,还介绍了多环境配置方法,通过`environments`元素可定义不同环境下的数据库连接信息,并可根据需求动态选择加载特定环境
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
85 3
|
3月前
|
XML Java 数据库连接
Mybatis 模块拆份带来的 Mapper 扫描问题
Mybatis 模块拆份带来的 Mapper 扫描问题
43 0
|
4月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改