1.mybatis和Hibernate的区别
mybatis需要自己编写sql语句,可以专注优化sql,更加灵活,性能更高,但是工作量大,依赖数据库,可移植性差
Hibernate 可以节省很多代码,和数据库无关,映射能力强。
2.#{}和${}的区别
#{}是预编译处理,${}是字符串替换,
mybatis处理#{}时会将sql中的它替换成?,调用PreparedStatement的set方法赋值
处理${}时,就是把它替换成变量
#{}可以防止sql注入,提高系统安全性
3.当实体类中的属性名和表中的字段名不一样怎么办
1.通过查询的sql语句定义字段名的别名,让别名和实体类名字一样
2.通过resultMap来映射字段名和实体类属性名的对应关系
4.模糊查询Like语句怎么写
1.在java代码中添加%通配符
String likeString = "%aaa%"
List list = mapper.selectLike(@Param("likeString") String likeString);
<select>
select * from table where name like #{likeString}
</select>
2.在sql语句中拼接通配符,会引起sql注入
String likeString = "aaa"
List list = mapper.selectLike(@Param("likeString") String likeString);
<select>
select * from table where name like "%"#{likeString}"%"
</select>
5.Mapper接口的工作原理
Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。
6.SqlSession四大对象
1.Execute;调度执行StatementHandler、ParmamterHandler、ResultHandler执行响应的语句
是真正执行java与数据库交互的东西,参与了整个sql过程
有三种执行器 简易执行器SIMPLE(默认) 重用预处理语句REUSE 批量更新处理器BATCH
Executor会先调用StatementHandler的prepare()方法预编译SQL语句,同时设置一些基本的运行参数,然后调用StatementHandler的parameteshrize()方法设置参数,resultHandler再组装查询结果返回调用者,完成一次查询完成预编译
2.StatementHandler 数据库会话器
专门处理数据库会话, 进行预编译并且调用ParameterHandler的setParameters()方法设置参数
有三种会话器,分别对应三种执行器
3.ParameterHandler参数处理器
对预编译进行参数设置
4.ResultSetHandler结果处理器
组装结果返回结果集