MyBatis
上期讲了用MyBatis来解决硬编码问题,但其实在测试用例里还是有硬编码的问题。
List<Brand> brands = sqlSession.selectList("com.happyfan.mapper.BrandMapper.selectAll");//com.happyfan.mapper.BrandMapper.selectAll 仍然是字符串,锁死在代码里了。
而咱们用mapper代理开发,就能解决这个硬编码问题。
mapper 代理
- 定义一个与 SQL 映射文件同名的 Mapper 接口,并将 Mapper 接口和 SQL 映射文件搁置在同一目录下
- 设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名(就是类的全称,带包的要用 . 隔开)
- 在 Mapper 接口中定义方法,办法名就是 SQL 映射文件中 sql 语句的 id ,并放弃参数类型和返回值类型统一
编码
- 通过 SqlSession 的 getMapper 办法获取 Mapper 接口的代理对象
- 调用对应办法实现 sql 执行
1、定义一个与 SQL 映射文件同名的 Mapper 接口,并将 Mapper 接口和 SQL 映射文件搁置在同一目录下
相似这样:
留神,在resource包下创立的Directory命名要用分隔符 / 而不能用 . ,用 . 会产生一些奇怪的事件(他可能会认为这个Directory就叫做com.happyfan.mapper).
2、设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名(就是类的全称,带包的要用 . 隔开)
<mapper namespace="com.happyfan.mapper.BrandMapper">
3、在 Mapper 接口中定义方法,办法名就是SQL映射文件中 sql 语句的 id,并放弃参数类型和返回值类型统一
<?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"><!-- namespace:名称空间--><mapper namespace="com.happyfan.mapper.BrandMapper"> <select id="selectAll" resultType="com.happyfan.pojo.Brand"> select id, brand_name as brandName, company_name as companyName, ordered, description, status from tb_brand; </select></mapper>
在SQL映射文件中咱们的 id="selectAll" 那么在 Mapper 接口定义的办法就肯定是 selectAll 。这个sql语言查问的是一个汇合,所以返回类型也要是个汇合。
public interface BrandMapper { List<Brand> selectAll();}
4、编码
public static void main(String[] args) throws IOException { //1. 加载mybatis的外围配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.获取SqlSession对象,用它来执行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //3.执行sql语句 //List<Brand> brands = sqlSession.selectList("com.happyfan.mapper.BrandMapper.selectAll"); //通过 SqlSession 的 getMapper 办法获取 Mapper 接口的代理对象 BrandMapper brandmapper = sqlSession.getMapper(BrandMapper.class); //调用对应办法实现 sql 执行 List<Brand> brands = brandmapper.selectAll(); System.out.println(brands); //4.开释资源 sqlSession.close(); }
执行!
胜利!硬编码问题就这样解决啦!
补充:如果 Mapper 接口名称和 SQL 映射文件名称雷同,并且在同一目录下,能够用包扫描的形式简化 SQL 映射文件的加载
在 mybatis-config.xml 下批改
<mappers> <!--加载sql映射文件--> <!--<mapper resource="com/happyfan/mapper/BrandMapper.xml"/>--> <!--Mapper代理形式--> <package name="com.happyfan.mapper"/></mappers>
当然咱们还能在 mybatis-config.xml 中增加
<typeAliases> <package name="com.happyfan.pojo"/></typeAliases>
能够简化 SQL 映射文件中 resultType 的写法( Brand 也能够写成 brand 不辨别大小写)。
<?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"><!-- namespace:名称空间--><mapper namespace="com.happyfan.mapper.BrandMapper"> <select id="selectAll" resultType="Brand"> select id, brand_name as brandName, company_name as companyName, ordered, description, status from tb_brand; </select></mapper>
执行!
仍旧胜利!
配置文档的顶层构造能够上官网文档浏览
官网文档:https://mybatis.org/mybatis-3...