mybatis

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结果处理器

组装结果返回结果集

 

上一篇:SqlSession的执行流程


下一篇:Mybatis的SqlSession运行原理(转)