1.MyBatis 中 #和 $ 的区别?
1. 使用 #的原理是? 占位符, 而 $ 的原理为直接字符串拼接方式
2.$ 方式一般使用在写数据库中的固定字段时候才会使用例如表名或者列名 (select * from user order by xxx) 这个中的 xxx 可以使用 $
3.# 可以防止注入,$ 不能防止 sql 注入
4. 一般情况下能使用 #就不适用 $.
2.MyBatis 的编程步骤是什么样的?
1. 创建 SqlSessionFactory
2. 通过 sqlSessionFactory 创建 SqlSession
3. 通过 sqlSession 执行数据库操作.
4. 调用 session.commit()提交事务
5. 调用 sessioin.close()关闭会话
3.JDBC 编程有那些不足之处, NyBatis 是如何解决的?
1. 数据库的创建, 释放频繁造成系统资源浪费从而影响性能, 如果使用数据库连接池可解决此问题.
解决: 在 Sqlmapconfig.xml 中配置数据连接池, 使用连接池管理数据库连接
2.sql 语句写在代码中造成代码不易维护, 实际用 sql 变化大, sql 变动需要改变 java 代码
解决: 将 sql 语句配置在 xxxmapper.xml 文件中与 java 代码分离.
3. 向 sql 语句传参麻烦, 因为 sql 语句的 where 条件不一定, 可能多也可能少, 占位符需要和参数一一对应.
解决: mybatis 自动将 java 对象映射至 sql 语句.
4. 对结果即解析麻烦, sql 变化导致解析代码变化, 且解析前需要进行遍历, 如果能将数据库记录封装成 pojo 对象解析还比较方便.
解决: mybatis 自动将 sql 执行结果映射至 java 对象
4. 使用 mybatis 的 mapper 接口调用时有那些要求?
1.Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径
2.Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同
3.Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同.
4.Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同.
MyBatis 中一级缓存和二级缓存?
1. 一级缓存: 基于 perpetualCache 的 HashMap 本地缓存, 其存储作用域为 session, 当 session flush 或者 close()之后, 该 session 中的所有 cache 将清空.
2. 二级缓存和一级缓存其机制相同, 默认也是采用 PerpetualCache,HashMap 存储, 不同在于其存储作用域为 Mapper(NameSpace), 并且可自定义存储源, 如 Ehcache. 作用域为 namespace 是指该 namespace 对应的配置文件中所有的 select 操作结果都缓存, 这样不同于线程之间就可以共用二级缓存, 启动二级缓存: 在 mapper 配置文件中 < cache/>
二级缓存可以设置返回的缓存对象策略:<cache readOnly="true">. 当 readOnly="true" 时, 表示二级缓存返回给所有调用者同一个缓存对象实例, 调用者可以 update 获取的缓存实例, 但是这样可能造成其他调用者出现数据不一致的情况(因为所有调用的是同一个实例). 当 readOnly=false 时, 返回给调用者的是二级缓存总缓存对象的拷贝, 即不同调用者获取的是缓存对象的不同实例, 这样调用者对各自的缓存对象的修改不会影响到其他的调用者, 即是安全的, 所以默认是 readOnly="false"
3. 对于缓存数据更新机制, 当某一个作用域 (一级缓存 session / 二级缓存 namespaces) 的进行了 cud 操作后, 默认该作用域下所有 select 中的缓存将被 clear'
6.Mybstis 在 insert 插入数据操作时返回主键 ID?
数据库为 MySQL 时:
- <insert id="insertUser" parameterType="com.qingmu.pojo.User" useGeneratedKeys="true" keyProperty="id">
- <!--<selectKey keyProperty="id" order="AFTER" resultType="int">-->
- <!--select LAST_INSERT_ID()-->
- <!--</selectKey>-->
- insert into USER VALUES (#{id},#{username},#{sex},#{birthday},#{address})
- </insert>
keyproperty 表示返回的 id 要保存到对象的那个属性中, useGeneratedKeys 表示主键 id 为自增长模式. MySQL 中做上配置就可以了.
数据库为 Oracle 时 "
"
由于 Oracle 没有自增长这一说, 只有序列这种模仿自增的形式, 所以不能再使用 UserGeneratedKeys 属性, 而是使用 selectKey 将 Id 获取并赋值到对象的属性中, insert 插入操作时正常插入 id
来源: http://www.bubuko.com/infodetail-3070764.html