测试@Mapper注解
1.创建一个接口,不加@Mapper接口,自己创建其实现类
public interface GoodsDao {
public List<Goods> findGoods();
}
2.GoodsDao.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.cy.pj.goods.pojo.dao.GoodsDao">
<select id="findGoods" resultType="com.cy.pj.goods.pojo.Goods">
select * from tb_goods where name="suchao"
</select>
</mapper>
3.创建实现类,获取一个SQLSession对象
@Respository
public class GoodsDaoImpl implements GoodsDao {
@Autowired
private SqlSession sqlSession;
@Override
public List<Goods> findGoods() {
第一种:return sqlSession.selectList("com.cy.pj.goods.pojo.dao.GoodsDao.findGoods");
第二种:return sqlSession.getMapper(GoodsDao.class).findGoods();此方式会转化为第一种代码
4.创建测试类测试,查看结果(成功查询出结果)
@SpringBootTest
public class GoodsDaoTests {
@Autowired
private GoodsDao goodsDao;
@Test
public void testFindGoods(){
List<Goods> list=goodsDao.findGoods();
for(Goods g:list){
System.out.println(g);
}
}
}
5.当我们加上@Mapper让此接口交给框架管理,并创建其实现类
@Mapper
public interface GoodsDao {
public List<Goods> findGoods();
}
6.创建测试类,运行代码结果(成功查询出结果)
@SpringBootTest
public class GoodsDaoTests {
@Autowired
private GoodsDao goodsDao;
@Test
public void testFindGoods(){
List<Goods> list=goodsDao.findGoods();
for(Goods g:list){
System.out.println(g);
}
}
}
7.以上两种方式一个加上了@Mapper注解框架会自动为我们创建一个实现类,另一个我们没有加@Mapper注解不由框架创建实现类,当我们加上了@Mapper注解同时自己也创建出一个实现类,框架会注入谁呢?
这个时候经测试得出,框架会优先注入它自己创建的实现类,而不是我们自己创建实现类,如果需要注入我们自己的实现类,需要用@Qualifier注解指定即可,@Mapper注解底层也会创建一个实现类并调用一个SQLsession对象,来进行对数据库的会话管理