• 中的别名不区分大小写
  • @param 命名参数 写在接口里,以注解的值为键,参数为值,声明修饰的对象在Mapper中识别的别名
  • @MapKey() 给map集合设定键
  • {}相当于占位符,在最终输出的sql语句中会取对应键的值,并且加上''让其变为字符串

  • ${}相当于字符串拼接,会把对应值的字符串直接加到sql语句中,并且不带''。
  • 分布查询能实现延迟加载,它可以根据你选择加载的信息有选择的加载sql语句,不加载其他关联的未被选择的信息
  • 注意查询中的多对一中里的和一对多中里的的区别
  • choose、when、otherwise 中只要第一个when条件满足,后面的就不会执行(相当于if..else..中else再嵌套if..else...)
  • 清空一级缓存sqlsession的方法:调用sqlSession.clearCache()
  • 二级缓存中readOnly属性 为false的时候会拷贝一个对象返回,此时是可以对这个被拷贝的对象进行读写的
  • MBG插件的generate产生的方法中,带Selective的意味如果输入字段是null就不传入该数值给数据库,不带的则是如果字段是null也传入进数据库

复习

mybatis的执行步骤

  1. 在xml先利用org.mybatis.spring.SqlSessionFactoryBean创建sqlSessionFactory
  2. 通过SqlSessionFactory创建SqlSession
  3. 通过sqlsession执行数据库操作
  4. 调用session.commit()提交事务
  5. 调用session.close()关闭会话

ps:在xml中创建org.mybatis.spring.mapper.MapperScannerConfigurer的bean对象,使其自动扫描指定位置的pojo

在Mapper中如何传递多个参数原理

  1. 可以用默认的arg0 arg1
  2. 否则就应该使用@Param注解,然后多个参数会被封装成Map传递到Mapper中

Mybatis的一级、二级缓存

1、 一级缓存:默认打开一级缓存。基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空,

2、 二级缓存与一级缓存机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(namespace),并且可自定义存储源,如Ehcache。默认打不开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。

3、当某个作用域进行增删改查后,缓存会被自动clear

多对一映射处理

利用resultMap、association处理

一对多映射处理

collection

  • collection:用来处理一对多的映射关系
  • ofType:表示该属性对饮的集合中存储的数据的类型
 private List<Emp> emps;
 ....
 <collection property="emps" ofType="Emp">
 

关于JDBC

sqlSessionFactory底层是加载连接池的,而连接池是使用com.mysql.jdbc.Driver来加载各类sql执行方法的

Statement和PreparedStatement

  • Statement接口利用

    int excuteUpdate(String sql) //执行更新操作INSERT、UPDATE、DELETE
    ResultSet executeQuery(String sql) //执行查询操作SELECT

    它需要拼串,容易造成sql注入

  • PreparedStatement是Statement的子接口

    它则是可以调用Connection 对象的 preparedStatement(String sql) 方法获取 PreparedStatement 对象,该对象中的sql参数都用?表示,使用setXxx(int index,String sql)来插入参数

查询返回的结果

查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象,里面包含查询回来一个表的所有信息

JDBC事务处理

  • 数据一旦提交,就不可回滚。
  • 数据什么时候意味着提交?

    • 当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
    • 关闭数据库连接,数据就会自动的提交。如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
  • JDBC程序中为了让多个 SQL 语句作为一个事务执行:

    • 调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
    • 在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
    • 在出现异常时,调用 rollback(); 方法回滚事务
    若此时 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态 setAutoCommit(true)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态。

总结

最重要的几个组件

  • SqlSessionFactory:装配数据源,配置SqlSession连接
  • SqlSession:数据库的连接
  • SqlSessionTemplate:执行、处理数据库
  • mapperLocations:mapper文件定位、装载

杂项

  • association是复杂嵌套匹配用的
  • 由于占位符#{}会加上单引号,只能使用${}的情况:

    1.批量删除delete from t_user where id in (1,2,3)

    2.动态表名select * from ${tableName},因为表名不能加单引号

如果对你有帮助就太好了)))