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();
}

<mapper namespace="com.test.dao.MybatisAccountDAO">
	<select id="selectAll" resultType="com.test.do.MybatisAccountDO">
		select * from mybatis_account
	select>
mapper>



<configuration>

    <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="BaseResultMap" type="com.test.entity.MybatisAccountDO">

	
    <id column="id" jdbcType="BIGINT" property="id" />
 
    
    <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:
因为在做了映射了,所以如果sql查询列名和最终要映射的DO的属性名不一致也没事。
推荐用resultMap

你可能感兴趣的:(Mybatis——mapper代理)