本章介绍Mybatis的基础,使用框架实现增,删,改,查的功能,并介绍一些常见的问题,例如参数处理。总共有9个小节:
- 第一小节创建相关的数据库表,用户,角色,权限表,以及关联表。略
- 第二小节手动编写Mapper配置文件,编写Mapper接口,介绍它们之间的映射关系。略
- 第三小节介绍select标签。
- 第四小节介绍insert标签。
- 第五小节介绍update标签。
- 第六小节介绍delete标签。
- 第七小节介绍参数处理。
- 第八小节介绍了动态代理的原理。
- 第九小节为总结。略
1、查询(select标签)
查询标签主要理解两个映射,第一个映射发生在执行SQL语句之前,根据Mapper接口中的方法找到Mapper文件中对应的SQL语句。第二个映射发生在执行SQL语句之后,根据查询得到的结果集,将结果集映射为Java对象。接下来也分为两个阶段介绍它的每个属性
执行SQL之前:
- id:该属性在同一个命名空间中必须唯一,它建立Mapper配置文件中标签与Mapper中方法的映射关系。
- parameterType:用于指定接口方法中参数的类型。如果是基本数据类型或与之对应的Java类,则不用设置。如果是其他类型,例如Map,必须设置参数类的全名。
- statementType:执行SQL语句需要创建的statement对象,每个值对应JDBC中的一种statement。
- timeout:设置执行SQL语句的超时时间,单位为毫秒。
- databaseId:设置数据库厂商的标识,在某些情况下用处很大,例如分页时Oracle和mysql的写法完全不同。一般情况下会自动判断,但是也可以手动配置,此时databaseId的值必须与config配置文件中的databaseIdProvider对应。
- useCache:是否启用二级缓存。一般不在单个select配置,直接配置cache标签。
- flushCache:是否停用一级缓存,当该值为true时,每次执行select语句都会清空一级缓存。一级缓存是sqlSession的缓存,它默认是开启的。
执行SQL之后:
- resultType:建立结果集与Java类的映射关系,此时使用的是默认的驼峰方式,例如user_name会转换为userName属性。
- resultMap:建立结果集与Java类的映射关系,它的值为resultMap标签的id,这个标签在第六章节介绍一对一,一对多,多对多时在详细介绍。
- resultsetType:指定结果集的类型,它与JDBC中resultSet对象的类型一一对应。
杂项:
- fetchSize:指定返回条数,这个没什么用,一般使用分页插件实现。
- resultSets:多个结果集的名称,基本只有在调用存储过程时,存在多个出参时才会发生,基本没用过。
- resultOrdered:这个标签没有用到过,也没有理解具体的意思。
2、插入(insert标签)
Insert标签中大部分的属性与select标签相同,含义也相同,这里介绍insert标签独有的属性。
- useGeneratedKeys:默认为false。如果为true,Mybatis会调用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键。
- keyProperty:表中主键对应的属性名称。一般都是id。
插入之后获取主键:
使用selectKey标签,mysql数据库的语句为select last_insert_id()。不同的数据库使用不同的SQL语句。
3、更新(update标签)
与select标签的属性基本相同。参考select
4、删除(delete标签)
与select标签的属性基本相同。参考select。
5、传参
如果理解JDBC中PreparedStatement传参的方式,那么mybatis传参的方式很好理解。JDBC的传参方式有三种:
- 第一种方式是根据参数的位置,即第一个问号对应第一个参数,第二个问号对应第二个参数,以此类推,多余的参数会被忽略,参数少直接报错。在mybatis也存在这种方式,它可以通过#{0}或#{param0}访问第一个参数,以此类推。
- 第二种方式是根据名称,JDBC中属性名必须与列名相同或者是驼峰式转换为列名。在mybatis中将其修改为@Param注解,注解包含value属性,该值为参数名称。
- 第三种方式根据类型,这种方式要求数据库每一列的返回值的数据类型必须不同,例如表中只有id,name,date,而在实际中属性很多,这种方式基本不适用。
6、动态代理
本小节通过编写代理类理解Mapper接口与Mapper文件的映射关系。在代理方法中执行sqlSession的selectList方法,该方法的参数为mapper接口的包名和方法名,它与Mapper文件的namespace属性和select标签的id属性一一对应。
它意味着namespace和标签ID的组合是唯一的。