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