什么是mybatis
mybatis是一款优秀的持久层框架,他几乎可以让我们避免JDBC的编写已经对结果集的映射,他也支持自定义sql,我们可以通过配置xml文件或者注解的方式来实现
#{}和${}有什么区别?
${}是变量占位符,相当于字符串替代,我们也可以传一个sql片段作为变量,他会将sql片段拼接到sql语句中,但这种做法不建议,会造成sql注入#{}是参数占位符,mybatis会将它变成 ?,当执行sql语句时,会进行预编译,然后将参数按顺序替代 ?#{}会进行预编译,不会造成sql注入
当实体类中的属性名和表中的字段名不一样怎么办
我们可以使用resultMap来配置,也可以给sql中的字段名起别名
Mybatis 动态 SQL 是做什么的?都有哪些动态 SQL ?能简述一下动态 SQL 的执行原理吗?
mybatis 动态sql是可以使用动态sql标签,编写在xml配置文件里,然后根据表达式的值,完成sql逻辑判断并实现sqlmybatis中有9中动态sql标签,我们常用的标签有<if> <choose> <where> <when> <foreach>等
Mapper 接口绑定有几种实现方式,分别是怎么实现的?
第一种我们可以使用Mapper xml文件来进行绑定,xml里面的nameplace要指定对应的mapper接口
第二种是我们可以通过注解的方式来进行绑定,也就是在接口方法上贴上注解,如@Update @Select @Delete @Insert来进行sql语句的编写
在 Mapper 中如何传递多个参数
①我们可以使用@Param注解来给参数起别名,将多个参数一起传递,然后在sql中就使用别名来做参数注入
使用@Param注解我们可以使用#{},也可以使用${}, 如果没有使用该注解的话sql语句中是不能使用 ${}的
②我们也可以不使用@Param注解给参数起别名,也是将多个参数一起传递,但是在sql语句的占位符我们要对应参数顺序写,如#{param1},#{param2}...
③我们也可以使用map来将参数封装起来,然后将map作为参数传递到配置文件中,但是我们的xml代码 需要再加上parameterType="Map"
Mybatis中使用的分页是什么?常用的分页插件有哪些?
mybatis是使用自身的RowBound来实现分页的,他是对resultSet结果集进行分页,不适合我们使用
我们通常使用插件来帮我们实现分页功能,如mybatis-plus,mybatis-PageHelper
mybatis的优点
mybatis是一款优秀的持久层框架,他可以帮我们避免了很多重复的JDBC的代码编写,我们只需要使用xml方式,或者注解的方式,就可以给对应的方法编写对应的sql语句,这也让我们方便管理sql语句,实现了sql与代码的分离。它还提供了动态sql标签,让我们可以根据实际情况对sql进行编写,而且他与spring也能很好的集成
mybatis的缺点
mybatis虽然可以帮我们减少很多JDBC代码的重复编写,但是我们还是需要自己手动编写sql语句,如果字段多或者很多表要进行连接的话,对程序员很不友好,很容易就将sql语句写错,而且sql依赖数据库,我们不能随意更改数据库
MyBatis 与 Hibernate 的区别
①mybatis不是完全一个ORM框架,他需要我们手动编写sql语句,而Hibernate是一个完全的ORM框架,不需要我们手动编写sql
②myvatis高度依赖数据库,所以不能换数据库,而Hibernate可屏蔽数据库,所以我们可以换数据库
③mybatis的话我们是手动写sql的,所以灵活性比较高,而Hibernate是不需要手动编写代码,他是根据模型配置自动生成sql并执行的
mybatis 的一级缓存和二级缓存
一级缓存:mybatis的一级缓存是默认开启的,当我们第一次执行查询语句时,他会到数据库里执行sql语句,然后将结果存储到sqlSession的缓存中,当我们第二次再次查询同样的sql语句时,就不会到数据库里面查找,而是从sqlSession里拿出结果,但是如果这两次查询之间发生了增删改操作的话,sqlSession这个缓存会被清空
二级缓存:二级缓存是属于Mapper的,也就是当我们第一次查询一个Mapper接口时,他会到数据库里面将结果查出来,然后存到sqlSessionFactory这个缓存里,当我们再次执行配置文件namespace对应的Mapper接口的sql语句时,就不会到数据库里面找了,而是从sqlSessionFactory中去获得结果,这就是二级缓存
preparestatement和statement的区别
preparestatement:他是预编译会话,会事先对sql进行预编译的,他比普通会话的效率要高,而且编译后的语句可以重复使用,还有可以避免sql注入,比较安全Statement:他是普通会话,没有预编译的功能