Mybatis——mapper代理

本文介绍了Mybatis的mapper代理机制,详细讲解了mapper.xml的编写规则,包括namespace、id、parameterType和resultType的设置。建议mapper.xml文件名与DAO接口匹配,并在mybatis-config.xml中注册。此外,讨论了多参数方法的处理和resultMap的使用,推荐使用resultMap以提高灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用mapper代理的好处就是,当我们写了DAO后,Mybatis会自动帮我们自动实现实现类,不用我们再写DAOImpl。
而我们要做的就是:

  • 编写DAO接口
  • 编写与DAO中方法相对应的mapper.xml

mapper.xml标签编写规则

  • namespace为DAO接口的全类名
  • id为DAO接口中对应方法的名字
  • parameterType为DAO接口中对应方法的参数类型
  • resultType为DAO接口中对应方法的返回值类型(添加修改删除的返回就是影响的行数,所以肯定是int类型,所以这三个标签中其实并无也不必要写resultType )
  • 建议: mapper.xml的文件名与DAO接口名保持一致

写完mapper.xml之后,同样需要在mybatis-config.xml中注册这个mapper,然后在测试方法中生成代理对象使用就行

示例

public interface MybatisAccountDAO{
	List<MybatisAccountDO> selectAll();
}
<!--MybatisAccountDAO.xml-->
<mapper namespace="com.test.dao.MybatisAccountDAO">
	<select id="selectAll" resultType="com.test.do.MybatisAccountDO">
		select * from mybatis_account
	</select>
</mapper>
<!--mybatis-config.xml-->
<?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>
<!--    如果我们有多个数据库这里就可以配置多个数据源,然后在default里-->
    <environments default="MyBatisLearning">
        <environment id="MyBatisLearning">
<!--            配置当前环境的事务管理-->
            <transactionManager type="JDBC"></transactionManager>
<!--            数据源,也就是要跟哪个数据库链接-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/tx"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="sqlmapper/MybatisAccountDAO.xml"></mapper>
    </mappers>
</configuration>
import java.io.InputStream;
import java.util.List;

import com.test.dao.MybatisAccountDAO;
import com.test.entity.MybatisAccountDO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;

/**
 * @author Song X.
 * @date 2020/03/23
 */
public class Test{

    @Test
    public void test(){
        SqlSession sqlSession = new SqlSessionFactoryBuilder()
            .build(TestMADOTostring.class.getClassLoader().getResourceAsStream("mybatis/mybatis-config.xml"))
            .openSession();

		//生成mapper代理对象
        MybatisAccountDAO mapper = sqlSession.getMapper(MybatisAccountDAO.class);
        
        List<MybatisAccountDO> selectAllResult = mapper.selectAll();
        for(MybatisAccountDO account : selectAllResult){
            System.out.println(account.toString());
        }

        sqlSession.commit();
        sqlSession.close();
    }
}

mapper.xml详细说明及注意事项

假如DAO的方法有多个参数,parameterType该怎么写?
这时我们就不写parameterType了,而改成#{paramX}的方式对应方法参数,注意X从1开始。(根据mybatis版本不同,可能写法不同,具体需要参照官方文档)

//DAO
List<MybatisAccountDO> selectByNameAndAge(String name, Integer age);
<select id="selectByNameAndAge" resultType="com.test.entity.MybatisAccountDO">
    select * from mybatis_account where username = #{param1} and age = #{param2}
 </select>

resultMap
使用resultMap可以代替resultType

<!-- 定义resultMap,列名和属性名映射配置
   id:mapper.xml中的唯一标识
   type:最终要映射的DO
-->
  <resultMap id="BaseResultMap" type="com.test.entity.MybatisAccountDO">

	<!--
      id:要映射结果集的唯一标识,称为主键
      column:结果集的列名
      property:type指定的哪个属性中
	-->
    <id column="id" jdbcType="BIGINT" property="id" />
 
    <!-- result就是普通列的映射配置 -->
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="age" jdbcType="INTEGER" property="age" />
  </resultMap>
  
  <select id="selectAll"  resultMap="BaseResultMap">
    select * from mybatis_account
  </select>

resultType和resultMap的区别
resultType :
sql查询的列名必须要和resultType指定DO的属性名相同,指定相同属性方可映射成功,有一点不同就会异常。

resultMap:
因为在<reusltMap>做了映射了,所以如果sql查询列名和最终要映射的DO的属性名不一致也没事。
推荐用resultMap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值