网站开发报价标准,域名备案的网站建设方案书模板,深圳品牌手表有哪些,做网站除了有服务器还需要什么问题一、ORM
ORM(Object/Relation Mapping)#xff0c;中文名称#xff1a;对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。
使用JDBC技术时#xff0c;手动实现ORM映射#xff1a; 使用ORM时#xff0c;自动关系映射#xff1a; 中文名称对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。
使用JDBC技术时手动实现ORM映射 使用ORM时自动关系映射 1ORM的具体实现可以认为是一个整体。 2SQL执行结果后如果执行的是增删改不需要去编写拆卸对象的代码而是由ORM把对象中属性值取出放入到SQL中。 3SQL执行结果后如果执行的是查询会由ORM将数据库中查询到的结果转换为对象。 4ORM技术相当于一个转换器是面向对象语言和数据库之间的纽带。 5ORM框架封装了对象/关系的自动映射。 MyBatis目前使用最多的ORM框架。
二、Mybatis中的SQL语句中的参数
1.MyBatis中最常用的占位符为 #{}。 1.SQL语句中使用#{}获取Test类中传递过来的参数值。 2. 当参数对象类型时可以使用#{对象中属性名}获取对象属性值。 2.${} 的使用 ${}在被MyBatis进行解析时不会解析为占位符而是直接解析成对应的值。也就是说使用${}时有点类似字符串拼接会有SQL注入问题。 但是使用${}可以动态设置列名或表名。 3.#{}和${}的区别(经典面试题) #{}被解析为用在设置列的值或条件值时也可以使用在分页等需要设置具体值的情况。 ${}表示字符串拼接用在动态设置表名和动态设置列名的情况下。 三、MyBatis中DQL操作 yBatis的DQL操作在映射文件都是通过select标签实现的。
SqlSession根据根据查询结果类型不同提供了五种查询方法
方法名解释说明selectOne()查询一行数据时返回值为Object。如果没有查询到返回为nill但是不能查询到多行。selectMap()查询多行数据时把其中某列结果当做key每行结果为Value。selectList()当查询多行数据时返回值为List。如果没有查询到返回长度为零的List对象。selectCursor()使用游标查询时使用在大量数据时可以代替分页。select()万能方法需要自己定义结果处理器
四、SQL查询结果填充的几种方式面试题
1. 介绍
MyBatis会根据句映射关系把查询到的结果填充到指定结果集类型中。支持方式 auto mapping自动映射。当列名或列的别名与实体类属性名相同时不需要做额外配置。 resultMap手动定义映射关系。 camel case驼峰命名规则。
2. 驼峰转换
MyBatis提供了驼峰转换的能力。通过全局配置文件开启驼峰转换功能后就可以让xxx_yyy自动映射到xxxYyy上。例如列名叫做peo_id可以自动映射到peoId的属性上。转换时去掉列中的下划线把下划线后面单词首字母变大写。
五、接口绑定方案
MyBatis提供了一种接口绑定方案通过SqlSession的getMapper方法产生接口的动态代理对象。然后通过对象调用接口中提供的功能。
1.接口绑定方案中映射文件的要求 在接口绑定方案中对于映射文件有几点强制要求 映射文件和接口需要在同一个包中 映射文件名称要和接口名称相同 namespace取值必须是接口的全限定路径 id属性值必须和方法名对应 resultType必须和方法返回值类型对应。如果方法返回值是集合类型resultType中写泛型的类型 2.接口绑定方案下参数传递
接口中方法SqlSession的方法int insertPeople(People peo);session.insert(insertPeople,peo);int deleteById(int id);session.delete(deleteById,id);int updatePeople(People peo);session.update(updatePeople,peo);People selectById(int id);session.selectOne(selectById,id);ListPeople selectAll();session.selectList(selectAll);ListPeople selectByUnameAndAddr(String name,String address);session.selectList(selectByUnameAndAddr,Map类型参数)
当方法带有多个参数将使用session.selectList(,Map类型参数)或session.selectOne(,Map类型参数)作为底层调用。 Mybatis会自动创建Map的key 如果接口中方法没有使用注解定义名称MyBatis使用内置名称作为key。 规则arg0、arg1、argM(M为从0开始的数字和方法参数顺序对应)或param1、param2、paramNN为从1开始的数字和方法参数顺序对应。 也可以在接口方法参数中通过Param(key名称)的形式进行定义key。一定使用了注解argN的这种形式就不能使用了但是paramN的方式还是可以使用。 六、动态SQL
1. if标签 通过if处理用户多变的查询条件。类似于 if(){}
if(){}if标签的test属性值为OGNL对象导航图语言表达式通过对象属性名可以快速获取到对象属性值。 2. choose choose标签相当于Java中的if...else if....else。在choose标签里面可以有多个when标签和一个otherwise(可以省略)标签。只要里面有一个when成立了后面的when和otherwise就不执行了。 3. trim标签 trim标签包含四个属性 prefix子内容不是空字符串()就在子内容前面添加特定字符串。prefixOverrides子内容是以某个内容开头去掉这个内容。suffix子内容不是空字符串()就在子内容后面添加特定字符串。suffixOverrides子内容以某个内容结尾就去掉这个内容。 trim只会对里面的子内容进行操作。如果子内容为空则不进行任何操作。后添加的内容会有空格。
特例
如果内部字符串为要去掉的字符串去掉后认为内容不为空prefix依然添加。 4. where标签 where标签属于trim标签的简化版被where标签包含的内容具备 如果里面内容不为空串在里面内容最前面添加where。 如果里面内容是以and开头去掉最前面的and。 5. set标签 set标签是专门用在修改SQL中的属于trim的简化版带有下面功能 如果子内容不为空串在最前面添加set。 去掉最后一个逗号。 6. foreach标签
foreach标签表示循环主要用在in查询或批量新增的情况。 foreach标签的属性解释说明 collection要遍历的数组或集合对象。如果参数没有使用Param注解arg0或array或list。. 如果使用Param注解使用注解的名称或param1。 open遍历结束在前面添加的字符串。close遍历结束在后面添加的字符串。item迭代变量。在foreach标签里面#{迭代变量}获取到循环过程中迭代变量的值。separator分隔符。在每次循环中间添加的分割字符串。index迭代的索引。从0开始的数字。nullable是否允许数组或集合对象为null。如果设置为true表示集合或数组允许为null。如果设置为false表示不允许数组或集合对象为null一旦为null会出现异常。 7. bind标签拼接使用 bind标签表示对传递进来的参数重新赋值。最多的使用场景为模糊查询。通过bind可以不用在Java代码中对属性添加%。 8. sql和include标签 MyBatis的sql标签用于定义SQL片段include标签用于引用sql标签定义的片段。 七、MyBatis中常用注解
八、多表查询面试题
1. 介绍 在学习MyBatis多表查询时其实就是在学习association标签和collection标签。 1.如果一个实体类关联另一个实体类的一个对象使用association。 2.如果一个实体类关联一个实体类的List集合对象需要使用collection。 这两个标签根据编写的SQL分为N1查询和联合查询两种方式。 2. 联合查询方式
mapper namespacecom.bjsxt.mapper.EmpMapper!-- 每行数据最终返回的是Emp对象 --resultMap idempMap typeEmpid columne_id propertyid/result columne_name propertyname/!-- 单个对象类型属性使用association进行填充 --!-- property:对象名 javaType对象类型支持别名--association propertydept javaTypeDept!-- 对属性对象里面的属性配置映射关系 --id columnd_id propertyid/result columnd_name propertyname//association/resultMap!-- 使用resultMap配置结果集映射 --select idseletAll resultMapempMapselect d_id,d_name,e_id,e_name,e_d_id from dept d,emp e where d.d_ide.e_d_id/select
/mapper
3. N1查询方式
N1查询方式命名由来当查询Emp表中N条数据时需要编写1条查询全部的SQL和N条根据外键列值作为另一张表主键查询条件的N条SQL语句。
resultMap iddeptMap2 typeDeptid columnd_id propertyid/idresult columnd_name propertyname/result
/resultMap
select idselectById resultMapdeptMap2select * from dept where d_id#{id}
/selectresultMap idempMap2 typeEmpid columne_id propertyid/result columne_name propertyname/!-- 此处依然使用association填充单个对象属性值.property和javaTye依然需要写 --!-- select 调用另一个查询的路径同一个映射文件中前面namespace可以省略--!-- column: 当前SQL查询结果哪个列值当做参数传递过去。如果是多个参数{key:column,key2:column2}--association propertydept javaTypeDept selectcom.bjsxt.mapper.DeptMapper.selectById columne_d_id/association
/resultMapselect idselectAllN1 resultMapempMap2select e_id,e_name,e_d_id from emp
/select
九、延迟加载面试题 延迟加载只能出现在多表联合查询的N1方式中。表示当执行当前方法时是否立即执行关联方法的SQL。 配置延迟加载 全局配置。整个项目所有N1位置都生效。 局部配置。只配置某个N1位置。 两种方式需要选择其中一种如果两种方式都使用了局部配置方式生效。 1.全局配置方式
settingssetting namelazyLoadingEnabled valuetrue/
/settings
2.局部配置方式 局部配置方式需要在collection或association标签中配置fetchType属性。fetchType可取值lazy延迟加载和earge(立即加载)。 当配置了fetchType属性后全局settings的配置被覆盖对于当前标签以fetchType属性值为准。 十、缓存面试题
1. 缓存介绍
MyBatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中当下次遇到一模一样的查询SQL时候不在执行SQL与数据库交互而是直接从缓存中获取结果。 MyBatis分为一级缓存和二级缓存同时也可配置关于缓存设置。 一级存储是SqlSession上的缓存。 二级缓存是在SqlSessionFactory(namespace)上的缓存。 默认情况下MyBatis开启一级缓存没有开启二级缓存。当数据量大的时候可以借助一些第三方缓存框架或Redis缓存来协助保存Mybatis的二级缓存数据。 2. 一级缓存 一级缓存想要生效必须同时满足3个条件 1. 同一个SqlSession对象。 2. 同一个select标签。本质为底层同一个JDBC的Statemen对象。 3. 完全相同的SQL包含SQL的参数值也必须相同。 4. insert、delete、update操作会清空一级缓存数据。 5. close()commit也会清空缓存。 2.1 一级缓存流程图 命中缓存从Map中查询是否存在指定key。如果存在表示命中缓存如果不存在这个key需要访问数据库。 更新到缓存把查询结果put到map中。 3. 二级缓存
3.1 二级缓存介绍 二级缓存是以namespace为标记的缓存可能要借助磁盘磁盘上的缓存可以由一个SqlSessionFactory创建的SqlSession之间共享缓存数据默认并不开启。 二级缓存生效条件 同一个SqlSessionFactory对象。 同一个方法(select)。 SQL完全相同 重要提示 二级缓存默认不开启需要手动开启。只有当SqlSession执行commit或close时才会存储到二级缓存中。 3.2 配置二级缓存生效
1.全局开关在mybatis.xml文件中的settings标签配置开启二级缓存。
settingssetting namecacheEnabled valuetrue/
/settings
2.分开关在要开启二级缓存的mapper文件中开启缓存。使用cache/配置时注解的查询无法缓存。 mapper namespacecom.bjsxt.mapper.EmpMappercache/
/mapper
3.二级缓存未必完全使用内存有可能占用硬盘存储缓存中存储的JavaBean对象必须实现序列化接口
public class Dept implements Serializable { }
4.重要总结 查询数据顺序 二级--一级---数据库---把数据保存到一级 ---把数据保存到二级临时当sqlsession关闭或者提交的时候把数据刷新到二级缓存非临时中。 执行了DML操作、close()、commit 会清空一级缓存所以数据变更不可能到达二级缓存中。
十一、四大核心接口介绍及执行流程面试题
1. 四大核心接口介绍 Executor执行器执行器负责整个SQL执行过程的总体控制。默认SimpleExecutor执行器。 StatementHandler语句处理器语句处理器负责和JDBC层具体交互包括prepare语句执行语句以及调用ParameterHandler.parameterize()。默认是PreparedStatementHandler。 ParameterHandler参数处理器参数处理器负责PreparedStatement入参的具体设置。默认使用DefaultParameterHandler。 ResultSetHandler结果集处理器结果处理器负责将JDBC查询结果映射到java对象。默认使用DefaultResultSetHandler。 2. 执行顺序 1使用执行器Executor控制整个执行流程 2实例化StatementHandler进行SQL预处理 3使用ParameterHandler设置参数 4使用StatementHandler执行SQL 5使用ResultSetHandler处理结果集 3.Executor执行器类型面试题 BaseExecutor主要是使用了模板设计模式共性被封装在 BaseExecutor 中容易变化的内容被分离到了子类中 。 SimpleExecutor默认的执行器类型。每次执行query和updateDML都会重新创建Statement对象。 ReuseExecutor执行器会重用预处理语句。不会每一次调用都去创建一个新的 Statement 对象而是会重复利用以前创建好的如果SQL相同的话。 BatchExecutor用在updateDML操作中。所有SQL一次性提交。适用于批量操作。 CachingExecutor处理缓存的执行器。无论使用上面三种执行器中的哪个。都是会执行CachingExecutor。 十二、MyBatis执行原理详解较常见面试题 首先加载全局配置文件为输入流交给XPathParser解析器解析为Document文档对象然后使用DOM解析Document文档对象把解析结果存放在Configuration配置类中。通过DefaultSqlSessionFactory实例化工厂实例SqlSession的对象。创建了SqlSession接口的实现类DefaultSqlSession对象在创建过程中会同时创建Transaction事务对象、Executor执行器对象。如果当前项目有Interceptor拦截器创建执行器时会执行拦截器。通过JDK提供的Proxy创建接口的动态代理对象。可以通过接口的代理对象调用方法。在调用方法时MyBatis会根据方法的类型判断调用SqlSession的哪个方法。例如selectList、selectOne、update、insert等。确定好具体调用SqlSession的哪个方法后会按照执行器类型执行MyBatis四大核心接口执行时也会触发拦截器Interceptor。最终会返回SQL的执行结果。执行完方法后需要提交事务提交时清空缓存、清除存储的Statement对象。最后关闭SqlSession对象释放资源。