Mybatis常见面试题总结
-
#{} 和 ${}的区别是什么
#{}是在xml文件中的占位符
${}是properties文件中的占位符 -
mysql其实就封装了很多jdbc的操作,与JDBC比少了很多代码。
-
xml映射文件中除了常见的select|insert|update|delete标签外还有那些标签
<resultmap
<sql -
通常一个xml映射文件都会写一个Dao接口阈值对应,这个Dao接口的工作原理是什么。参数不同的方法能重载吗。这个Dao接口也就是Mapper接口
- xml中的id是不允许重复的
-
MyBatis是如何进行分页的?分页的原理是什么?
-
件数一下MyBatis的插件运行原理
-
什么是ORM,ORM技术是建立bean对象和数据库表的一对一映射关系
-
MyBatis和HiberNate有什么不同
- Mybatis不完全是一个ORM框架,他还是需要程序员自己写sql语句的
- Mybatis相对来与hibernate的话灵活读更高
-
Mybatis是如何预防sql注入的
首先要明确一点sql注入是什么。就是利用一些SQL漏洞,构造出一些规避原有规则可以执行的sql语句
而Mybatis中使用#{} 当做占位符,那么在编译截断,被#{}包裹的就变成一个?,然后再最后用原有的值当成字符串去替换它。而 这个符号是做不到的。 这个符号是做不到的 。 这个符号是做不到的。{}是没有经过预编译的,仅仅是变量的值。 -
实体中的属性名和表名中的字段名不一样怎么办
resultMap -
resultMap
resultMap都是用这个的现在谁用resultType啊
一般先定义一个标签
<select id="queryOrderAll" resultMap="orderResultMap">
SELECT id, user_id,
number,
createtime, note FROM `order`
</select>
<resultMap type="order" id="orderResultMap">
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property="id" column="id" />
<!-- 定义普通属性 -->
<result property="userId" column="user_id" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
</resultMap>
======================如果想级联查询这个时候怎么办
<select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
FROM
`order` o
LEFT JOIN `user` u ON o.user_id = u.id
</select>
<resultMap type="order" id="orderUserResultMap">
<id property="id" column="id" />
<result property="userId" column="user_id" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
<!-- association :配置一对一属性 -->
<!-- property:order里面的User属性名 -->
<!-- javaType:属性类型 -->
<association property="user" javaType="user">
<!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
<id property="id" column="user_id" />
<result property="username" column="username" />
<result property="address" column="address" />
</association>
</resultMap>
关键在于什么,在于<association>这个标签
statement和preStatement
statement适合一次性的sql而
preStatement适合多次执行的sql
${}是拼接字符串而#{}是预编译,把占位符变成?,然后set注入进去
如何防止SQL注入:
最好的应该是在参数校验的时候发现SQL注入
其次是preStatement也能防止SQL注入