1. SqlSessionFactoryBuilder:
读取配置信息创建 SqlSessionFactory,建造者模式,方法级别生命周期,方法结束生命周期结束;
重点是建造出SqlSessionFactory工厂对象
2. SqlSessionFactory:
SqlSession工厂对象,用于创建 Sqlsession,工厂单例模式,存在于程序的整个生命周期;
3. SqlSession:
代表一次数据库连接,一般通过调用 Mapper 访问数据库,也可以直接发送SQL 执行;
线程不安全,要保证线程独享(方法级);
4. SQL Mapper:
由一个 Java 接口和 XML 文件组成,包含了要执行的 SQL 语句和结果集映射规则。方法级别生命周期;
** 结果集映射规则:**
resultType 和 resultMap
resultType:当使用 resultType 做 SQL 语句返回结果类型映射时,对于 SQL 语句查询出的字段在相应的 pojo 中必须有和它相同的字段对应,而 resultType 中的内容就是 pojo 在本项目中的位置。
自动映射注意事项 :
1. 前提:SQL 列名和 JavaBean 的属性是一致的,或列名和 JavaBean 不一致,但列名符合单词下划线分割,Java 是驼峰命名法,则mapUnderscoreToCamelCase 可设置为 true;
config的xml中设置
2. 使用 resultType,如用简写需要配置 typeAliases (别名);
当使用resultMap,需要进行手工映射,pojo与数据库字段,需要一一对应,包括类型、名称:
resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets
数据提取代码中解放出来,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的
同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂
一点的语句只需要描述它们的关系就行了。
resultType与resultMap如何选择,
简单查询用resultType,复杂查询如多表关联查询和需要自定义转换规则的使用resultMap
resultMap多表查询配置
一对一查询:
一对多查询:
collecction,复杂关联查询集合。
阿里规范推荐使用resultMap,可以解耦,减少代码依赖度
参数传递方式
1.通过map方式,可读性差,避免使用
2.通过注解方式,非常直观,但参数不能超过5个
3.通过pojo方式,也直观,参数大于5个后使用比较方便。
主键获取
一、通过通过 insert/update 标签相关属性
1.通过设置 useGeneratedKeys=true自动开启获取主键
2.keyProperty=id 用于指定主键字段
二、 通过 selectKey 元素
Oracle 通过 sequnce 获取主键示例:
select SEQ_ID.nextval from dual
Mysql 通过自增长序号获取主键示例:
select LAST_INSERT_ID()
</selectKey
三、自定义ID,如UUID或雪花算法生成的ID,需要插入之前java代码提前设置
SQL参数传递
{},预编译参数,PrepareStatement,会对传入的参数进行预编译,并多增加单引号,优点是可以 防止sql注入
${},物预编译,底层用Statment,不会添加单引号,直接拼接sql,= 'xx' or 1=1,无法防止sql注入。
强制推荐#{}传参