叩丁狼java学习第八天-mybatis

发布于 2021-03-15  755 次阅读


1.maven安装

这一点已经在第一天的环境安装中教过了,不会的话可以去看第一天的笔记。

2.Mapper接口

2.1注意事项:

接口的命名为实体名 Mapper,一般和其对应 XML 文件放一起(只要编译之后字节码文件和 XML
文件在一起);
XML 命名空间用其对应接口的全限定名;
Mapper 接口的方法名要和 Mapper XML 文件元素(select | update | delete | insert) id 值一
样;
方法的返回类型对应 SQL 元素中定义的 resultType / resultMap 类型;
方法的参数类型对应 SQL 元素中定义的 paramterType 类型(一般不写)。

2.2定义mapper接口

package cn.wolfcode.mapper;
    public interface UserMapper {
    User get(Long id);
}

2.3使用mapper接口

package cn.wolfcode.mapper;
    public interface UserMapper {
    User get(Long id);
}

2.4mapper接口的原理

通过打印接接口,发现打印的是:class com.sun.proxy.$Proxy5,底层使用的是动态代理(后面Spring 再讲),生成 Mapper 接口的实现类。
接口是规范,实质做的实现还是要由实现类对象来做,而这个实现类不需要我们写,实现类对象也不由我们创建,这些都 MyBatis 使用动态代理帮我们做了;
我们只需提供 Mapper 接口对应 Mapper XML 文件,获取实现类对象的时候传入 Mapper 接口就可以了(不然 MyBatis 也不知道你要获取哪个 Mapper 接口的实现类对象);
至于实现类中操作方式底层还是和之前的一样,因为 Mapper XML 命名空间是使用 Mapper 接口的全限定名,方法名又与对应 XML 元素 id 一致,所以可以通过获取调用方法所在 Mapper 接口的权限名和方法名,拼接出 namespace + id,再配合调用方法的实参就可以像之前一样操作了。

3.MyBatis 的 # 和 $

3.1相同点

都可以获取对象(Map 对象或者 JavaBean 对象)的信息。

3.2不同点

使用 # 传递的参数会先转换为?,无论传递是什么类型数据都会带一个单引号;

使用 $ 传递的参 数,直接把值作为 SQL 语句的一部分。 使用 # 支持把简单类型(八大基本数据类型及其包装类、String、BigDecimal 等等)参数作为 值;

使用 $ 不支持把简单类型参数作为值。 使用 # 好比使用 PrepareStatement,没有 SQL 注入的问题,相对比较安全;

使用 $ 好比使用 Statement,可能会有 SQL 注入的问题,相对不安全。

3.3使用总结

若需要作为 ORDER BY 或 GROUP BY 子句获取参数值使用 $;若需要作为其它子句获取参数值使用


欢迎欢迎~热烈欢迎~