72、hibernate中对象的三种状态?
瞬时态:用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;(未与Hibernate发生关系)
持久态:已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;(正在与hibernate发生关系)
游离态(托管态): 持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;(与Hibernate发送过关系,但是现在没有关系了)
73、Hibernate中session的load()和get()的区别
二者在Hibernate都可以实现根据主键(oid)查询出对应的记录他们的区别如下:
1、get()方法执行的时候,会立即向数据库发出查询语句,称为立即加载。
而load()方法执行完之后, 只有等真正使用该对象属性的时候,才会发出sql语句,称为延迟加载;
2、如果数据库中没有对应的记录,get()方法返回的是null。而load()方法出现异常ObjectNotFoundException 。
74、MyBatis的执行流程
1、读取Mybatis配置文件
2、根据读取到的配置文件生成SqlSessionFactory
3、创建SqlSession对象(开启事务)
4、操作目标数据库
5、提交事务
6、关闭SqlSession
75、MyBatis的优点 和缺点
优点:
0、易于上手和掌握
1、对JDBC进行封装,简化操作。
2、可将Sql语句写在xml中,方便统一管理和优化
3、解除的SQL与代码的耦合
缺点:
1、Sql工作量很大,尤其是当表中字段比较多的时候
2、sql依赖数据库,导致数据库移植型比较差
76、MyBatis中用#和$的区别
1、使用#传入参数,MyBatis中会产生PreparedStatement并且可以安全性地设置参数 (用问号 ?)的值。因为sql语句已经编译好了,传入参数的时候,不会重新产生sql语句安全性高。
2、用 $会产生sql注入的问题:
$ (something)则直接将大括号里的something插入字符串。
生成静态SQL所以可能会产生sql注入问题。所以,使用原则是能用的#就不用$
3、在特定场景下,例如根据页面信息动态设计排序字段 : order by ‘{param}’,这时候只能使用$了。