Mybatis——mapper代理详解编程语言

使用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

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/20572.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论