乐趣区

关于mybatis:初见MyBatis的理解与认知-三

MyBatis

上期讲了用 MyBatis 来解决硬编码问题,但其实在测试用例里还是有硬编码的问题。

 List<Brand> brands = sqlSession.selectList("com.happyfan.mapper.BrandMapper.selectAll");//com.happyfan.mapper.BrandMapper.selectAll 仍然是字符串,锁死在代码里了。

而咱们用 mapper 代理开发,就能解决这个硬编码问题。


mapper 代理

  1. 定义一个与 SQL 映射文件同名的 Mapper 接口,并将 Mapper 接口和 SQL 映射文件搁置在同一目录下
  2. 设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名(就是类的全称,带包的要用 . 隔开)
  3. 在 Mapper 接口中定义方法,办法名就是 SQL 映射文件中 sql 语句的 id,并放弃参数类型和返回值类型统一
  4. 编码

    1. 通过 SqlSession 的 getMapper 办法获取 Mapper 接口的代理对象
    2. 调用对应办法实现 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…

退出移动版