目前主流的持久层框架:JDBC、Hibernate、Mybatis. 后两者其实都是基于JDBC的封装后的ORM框架,国内基本以Mybatis为主流。
ORM
ORM代表对象关系映射(Object-Relational Mapping),是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系。ORM允许开发人员使用面向对象的方式来操作数据库,可以不需要直接编写SQL查询语句。
优点 | 缺点 | |
JDBC | 性能高,使用简单 | 编码量大,硬编码多,开发效率低,需要手动开启和关闭链接 |
Hibernate | 开发效率高,代码耦合度低 | 对JDBC高度封装, 对于动态SQL,复杂SQL,联表查询等支持较差,也不能sql优化 |
Mybatis | 开发效率较高,代码耦合度低,自动映射,也可以自定义映射,自定义SQL,也能对sql优化 | 手写sql代码量较高,对于开发人员的SQL要求较高,数据库移植性差 |
JDBC执行顺序:
① 注册驱动和数据库信息
② 获得Connection,并使用它打开Statement对象
③ 通过Statement对象执行SQL语句,并获得结果对象ResultSet
④ 通过代码将ResultSet对象转化为POJOJO对象
⑤ 关闭数据库资源
MyBatis中# 与$ 的区别及SQL注入攻击
#{}:参数占位符,即:预编译;在预处理时,会把参数用占位符"?" 代替变成:select *from user where name = ?;
${}:字符串替换符,即:SQL拼接;只是简单的字符串替换,传参 'tom' , 在动态解析时直接在SQL语句末尾拼上参数:select* from user where name = 'tom'; 所以${}会导致SQL注入。
SQL注入:即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
例如:参数为 '0 or 1 = 1', 使用${}拼接后的SQL:select* from user where id = 0 or 1 = 1
MyBatis中的缓存机制
一级缓存默认是开启的,作用范围为SqlSession。即:同一个SqlSession对象调用同一个Mapper的方法,如果没有声明需要刷新,并且缓存没超时的情况下,一般只执行一次SQL,其他的查询SqlSession都只会取出当前缓存的数据。
二级缓存需要手动开启,作用范围为SqlSessionFactory。在xxxMapper.xml中添加<cache/>标签 或者在对应的Dao类上面增加@CacheNamespace(blocking = true)注解以开启二级缓存。并且执行sqlSession.commit()使得二级缓存生效,其中,POJOJO必须实现Serializable接口。因范围较大,一般不会使用。
MyBatis三剑客
Mybatis-generator (Mybatis-X)
Mybatis-Pagehelper
MyBatis-Plus