1.什么是ORM?ORM的工作原理?
①ORM是对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
②
2.了解什么是ORM 半自动框架
- ORM:Object Relational Mapping(对象关系映射),能在数据库和对象之间作映射处理
- 使用JDBC操作数据库必须手动进行数据库和对象之间的转换,而ORM框架能自动进行对象和数据库数据的转换
- ORM框架代替了JDBC技术
3.MyBatis工作原理?
mybatis主要工作流程分为以下四个步骤:
1.获取sqlSessionFactory对象
2.获取sqlSession对象
3.获取mapper接口的代理对象(MapperProxy)
4.执行增删改查方法
#mybatis架构分层图
#步骤一:获取sqlSessionFactory对象
#步骤二:获取sqlSession对象
#步骤3:获取mapper接口的代理对象(MapperProxy)
#步骤四:执行增删改查方法
#查询方法总结流程图
4. SQLSessionFactory 、 SQLSession 作用
每一个线程都应该有一个自己的 SqlSession 实例,并且该实例是不能被共享的 同时, SqlSession 实例也是线程不安全的
1.SQLSessionFactory
1.SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。
2.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
3.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
4.SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。
5.SqlSessionFactory是创建SqlSession的工厂。
2.SQLSession
1.SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection。
2.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。
3.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。
4.每个线程都应该有它自己的SqlSession实例。
5.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。
6.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。
5. MyBatis的映射文件的主要元素(insert、update、select、delete、cache、resultMap)
- resultMap:SQL语句返回值结果集,被称为最强大的元素
- sql:可以被其他语句引用的sql片段,一般使用标签
- select:映射查询语句
- insert:映射插入语句
- update:映射更新语句
- delete:映射删除语句
- cache:该命名空间的缓存配置
- cache-ref:引用其他命名空间的缓存配置
示例
<select id="selectById" parameterType="integer" resultType="com.evader.pojo.User">
select * from User where id = #{id}
</select>
6. MyBatis的映射文件的四种引入方式
- 1.用文件路径引入映射器
- <mappers> <mapper resource="com/szd/mybatis/mapper/RoleMapper.xml"/> </mappers>
- 2.用包名引入映射器
- <mappers> <package name="com.szd.mybatis.mapper"/> </mappers>
- 3.用类注册引入映射器
- <mappers> <mapper class="com.szd.mybatis.RoleMapper"/> <mapper class="..."/> ... </mappers>
- 4.用URL引入映射器
- <mappers> <mapper url="file:///var/mappers/com/szd/mybatis/mapper/RoleMapper.xml" /> <mapper url="..." /> ... </mappers>
7. MyBatis的配置文件 mybatis-cfg.xml (数据库配置信息、 typeAlias)
通过 typeAliases 别名来设置,简化复杂度
8.RequestMap 和 RequestType 的区别。
RequestType是直接返回类型,而RequestMap是对外部RequestMap的引用,当有些复杂查询用RequestType,把参数当做一个对象没有办法完成时,可以用RequestMap来当做集合去完成。
9. ParameterType是做什么用的?
parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。
10. 中 keyProperties 、KeyColum、useGenaratedKeys 三个属性的含义
keyProperty(仅对insert和update有用)此属性的作用是将插入或更新操作时的返回值赋值给PO类的某个属性,通常会设置为主键对应的属性。如果需要设置联合主键,可以在多个值之间用逗号隔开。
useGeneratedKeys(仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部生产的主键,如MySQL和SQLServer等自动递增的字段,其默认值为false。
当使用的数据库不支持主键自动增长(如Oracle),或者支持增长的数据库取消了主键自增的规则时,也可用MyBatis提供的另一种方式来自定义生成主键,具体配置实例如下。
<insert id="insertClass" parameterType="xx.xx.xx">
<selectKey keyProperty="id" resultType="Integer" order="BEFORE">
select if(max(id) is null, 1, max(id) +1) as newId from tableName
</selectKey>
insert into tableNme (id,attribute1,attribute2,attribute3)
values(#{id},#{value1},#{value2},#{value3},)
</insert>
keyColumn(仅对insert和update有用)此属性用于设置第几列是主键,当主键不是表中的第一列时需要设置。在需要联合主键时,值可以用逗号隔开。
11. MyBatis使用传入参数的时候,#{}, ${}的区别是什么?
${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
#{}与${}的区别可以简单总结如下:
- #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
- ${}将传入的参数直接显示生成在sql中,不会添加引号
- #{}能够很大程度上防止sql注入,${}无法防止sql注入
${}在预编译之前已经被变量替换了,这会存在sql注入的风险。
- ${}一般用于传输数据库的表名、字段名等
- 能用#{}的地方尽量别用${}
(1) #{}为参数占位符?,即SQL预编译。${}为字符串替换,即SQL拼接,可以理解为仅仅是个纯碎的string替换,在动态SQL解析阶段将会进行变量替换。
(2) #{}是“动态解析->预编译->执行”的过程。${}是“动态解析->编译->执行”的过程。
(3) #{}的变量替换是在DBMS中。${}的变量替换是在DBMS外。
(4) 变量替换后,#{}对应的变量自动加上引号。变量替换后,${}对应的变量不会加上引号。
(5) #{}能防止SQL注入。${}不能防止SQL注入。
11.动态SQL ()
动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。
Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能
元素 | 作用 | 备注 |
if | 判断语句 | 单条件分支判断 |
choose(when、otherwise) | 相当于 Java 中的 switch case 语句 | 多条件分支判断 |
trim,where | 辅助元素 | 用于处理一些SQL拼装问题 |
foreach | 循环语句 | 在in语句等列举条件常用 |
bind | 辅助元素 | 拼接参数 |
动态 sql 的执行原理?
原理为:使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能
12.了解动态SQL( )
可以自己看书。
13.如何实现MyBatis一对一映射关系
14.如何实现MyBatis一对多映射关系 (标记中,ofType和javaType区别)
主要内容看书就行。
javaType用来指定对象所属的java数据类型,也就是private List<Post>
posts 的ArrayList类型
ofType用来指定对象的所属javaBean类,也就是尖括号的泛型private List<Post
>posts
15.了解如何实现MyBatis多对多映射关系
看书就行。
16. 了解 MyBatis-plus 的特性。
- 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 。
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 。
- 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击 。
- 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 。
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作