ORM框架是什么?
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数 据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和 数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
Hibernate 和 MyBatis 的区别
相同点
都是ORM框架,都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。
不同点
1.映射关系
MyBatis 是一个半自动映射的框架,配置Java对象与sql语句执行结果的对应关系,多表关联关系配置简单
Hibernate 是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂
2.SQL优化和移植性
Hibernate 对SQL语句封装,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性, 此外还提供 HQL(Hibernate Query Language)操作数据库,数据库无关性支持好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。
MyBatis 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。 开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但sql语句优化容易。
3.开发难易程度和学习成本
Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目
MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目
半自动框架Mybatis与全自动框架Hibernate的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时, 可以根据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
在mapper中如何传递多个参数?
方法1:顺序传参法
public User selectUser(String name, int deptId);
AI 代码解读
<select id="selectUser" resultMap="UserResultMap">select * from user where user_name = #{0} and dept_id = #{1} </select>
AI 代码解读
#{}里面的数字代表传入参数的顺序。
这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。
方法2:@Param注解传参法
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
AI 代码解读
<select id="selectUser" resultMap="UserResultMap">4 select * from user where user_name = #{userName} and dept_id = #{deptId} </select>
AI 代码解读
#{}里面的名称对应的是注解@Param括号里面修饰的名称。
这种方法在参数不多的情况还是比较直观的,推荐使用。
方法3:Map传参法
public User selectUser(Map<String, Object> params);
AI 代码解读
<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId} </select>
AI 代码解读
#{}里面的名称对应的是Map里面的key名称。
这种方法适合传递多个参数,且参数易变能灵活传递的情况。
方法4:Java Bean传参法
public User selectUser(User user);
AI 代码解读
<select id="selectUser" parameterType="com.pojo.User"resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId}</select>
AI 代码解读
#{}里面的名称对应的是User类里面的成员属性。
这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑 处理方便,推荐使用。
模糊查询的like语句有几种实现方式?
- '%${question}%' 可能引起SQL注入,不推荐
- "%"#{question}"%" 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引 号'',所以这里 % 需要使用双引号" ",不能使用单引号 '',不然会查不到任何结果。
- CONCAT('%',#{question},'%') 使用CONCAT()函数,推荐使用
- 使用bind标签
<select id="listUserLikeUsername" resultType="com.pojo.User"> <bind name="pattern" value="'%' + username + '%'" /> select id,sex,age,username,password from person where username LIKE #{pattern} </select>
AI 代码解读
SQL语句为什么需要预编译?
JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以 优化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行,DBMS 不需要再次编 译,越复杂的SQL,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。同时 预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓 存下来,下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。Mybatis 默认情况下,将对所有的 SQL 进行预编译。
Mybatis中的xml文件中,除了insert、update、delete、select标签外,还有什么你知道的标签?
还有很多其他的标签,、、、、 ,加上动态sql的9个标签,trim 、where、set、foreach、if、choose、when、otherwise、bind 等,其中为sql片段标签, 通过标签引入sql片段,为不支持自增的主键生成策略标签。
Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理吗?
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql的标签,trim 、where、set、foreach、if、choose、when、otherwise、bind
其执行原理为,使用OGNL(OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写)从sql参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态sql的功能。