文章目录
Mybatis是什么?
mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。
Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。
MyBatis可以通过xml或注解完成ORM映射关系配置。
- ORM框架:对象关系映射框架,Java的JavaBean (对象)与数据库的表(关系) 之间的对应关系。通过对象可以直接操作表。save(User) --> 用户数据进入表中
@Select(“select * from t_user ”)
public List<User> findAll()
Mybatis和JDBC的关系?
JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。
MyBatis对JDBC操作数据库做了一系列的优化:
(1) mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。
(2) mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。
(3)mybatis 提供了一级和二级缓存,提高了程序性能。
(4) mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置)
(5) mybatis对数据库操作结果进行自动映射
什么是ORM?
ORM的全称是Object Relational Mapping,即对象关系映射。
描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。
在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。
常见的ORM框架:Mybatis、Hibernate
MyBatis的两种配置方式?
注解、XML
MyBatis 注解版增删改查
通常增删改使用通过mapper,@Insert等注解很少使用
- @Select()
- @Insert()
- @Update()
- @Delete()
多表关系映射
@Results({
@Result( property=”属性” , column=”列”)
})
Mybatis中#{}和${}的区别是什么?
- #{}实现的是sql语句的预处理参数,之后再sql中用?号代替,使用时不需要关注数据类型,Mybatis自动实现数据类型的转换,并且可以防止SQL注入;
- ${}实现的是sql语句的直接拼接,不做数据类型转换,需要自行判断数据类型,不能防止SQL注入;
- 在某些特定情况下必须使用 , 如 : 在 分 表 存 储 的 情 况 下 , 对 哪 张 表 的 查 询 是 不 确 定 的 , 也 就 是 s q l 语 句 不 能 写 死 , 表 明 是 动 态 的 , 查 询 条 件 是 固 定 的 , 此 时 表 明 只 能 使 用 {},如:在分表存储的情况下,对哪张表的查询是不确定的,也就是sql语句不能写死,表明是动态的,查询条件是固定的,此时表明只能使用 ,如:在分表存储的情况下,对哪张表的查询是不确定的,也就是sql语句不能写死,表明是动态的,查询条件是固定的,此时表明只能使用{}方式进行字符串拼接,这样:slect * from ${tableName} where id = #{id}
总结:#{}占位符,用于参数传递; ${}用于SQL拼接
使用Mybatis过程中当实体类中的属性名和表中的字段名不一样 ,怎么解决?
- 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
- 使用通用Mapper时,可以通过@Column注解设置
- 如果进行自定义查询,可以通过@Result进行设置
- 如果使用的xml配置,通过 < resultMap >进行配置
使用Mybatis时Dao接口里的方法能重载吗?
不能重载的,
因为是全限定名+方法名的必须唯一。
XML id值和dao 方法名,进行匹配,要求必须唯一
<select id="findAll">
select * from...
</select>
Mybatis是如何进行分页的?
使用第三方分页助手:PageHelper
使用方式:
在将要执行查询sql语句之前使用分页助手:PageHelper.startPage(pageNum:页码, pageSize:每页显示数量);
Mybatis分页插件的原理是什么?
使用MyBatis插件(也称为拦截器)机制,对需要使用分页的功能进行增强。也就是重写SQL,根据不同的数据库生产不同的分页语句。
Mysql生成limit语句,Oracle借助rownum生成对应子查询语句。
持续学习,日后更新~~~