张店专业网站优化哪家好,怎样提高网站流量,如何看网站关键词,漯河网站超市建设1#xff0c;什么是Mybatis
#xff08; 1 #xff09;Mybatis 是一个半 ORM#xff08;对象关系映射#xff09;框架#xff0c;它内部封装了 JDBC#xff0c;开发时只需要关注 SQL 语句本身#xff0c;不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…1什么是Mybatis 1 Mybatis 是一个半 ORM对象关系映射框架它内部封装了 JDBC开发时只需要关注 SQL 语句本身不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 程序员直 接编写原生态 sql可以严格控制 sql 执行性能灵活度高。 2 MyBatis 可以使用 XML 或注解来配置和映射原生信息将 POJO 映射成数据库中的记录 避 免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 3通过 xml 文件或注解的方式将要执行的各种 statement 配置起来并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句最后由 mybatis 框架执行 sql 并 将结果 映射为 java 对象并返回。从执行 sql 到返回 result 的过程。
2说说Mybatis的优点和缺点
优点 1基于 SQL 语句编程相当灵活不会对应用程序或者数据库的现有设计造成任何影响SQL 写 在 XML 里解除 sql 与程序代码的耦合便于统一管理提供 XML 标签支持编写动态 SQL 语句并 可重用。 2与 JDBC 相比减少了 50%以上的代码量消除了 JDBC 大量冗余的代码不需要手动开 关连 接 3很好地与各种数据库兼容因为 MyBatis 使用 JDBC 来连接数据库所以只要 JDBC 支持的 数据 库 MyBatis 都支持。 4能够与 Spring 很好地集成 5提供映射标签支持对象与数据库的 ORM 字段关系映射提供对象关系映射标签支持对 象 关键组件维护。
缺点 1 SQL 语句的编写工作量较大尤其当字段多、关联表多时对开发人员编写 SQL 语句的功 底有 一定要求。 2 SQL 语句依赖于数据库导致数据库移植性差不能随意更换数据库。
3、#{} 和 ${} 的区别是什么
#{是预编译处理${是字符串替换。
Mybatis 在处理#{时会将 sql 中的#{替换为号调用 PreparedStatement 的 set 方法来赋 值
Mybatis 在处理${时就是把${替换成变量的值。
使用#{可以有效地防止 SQL 注入提高系统安全性。
4、当实体类中的属性名和表中的字段名不一样怎么办?
第 1 种 通过在查询的 sql 语句中定义字段名的别名让字段名的别名和实体类的属性名一致。 select idselectorder parametertypeint resultetypeme.gacl.domain.order〉 selectorder_id id, order_no orderno ,order_price price form orders where
order_id#{id};/select
第 2 种 通 过 映射字段名和实体类属性名的一一对应的关系。
select idgetOrder parameterTypeint resultMaporderresultmapselect * from orders where order_id#{id}/selectresultMap typeme.gacl.domain.order idorderresultmap〉!–用 id 属性来映射主键字段–id propertyid columnorder_id〉!–用 result 属性来映射非主键字段property 为实体类属性名column 为数据表中的属性– result property “orderno” column order_no/result propertyprice columnorder_price /
/reslutMap
5、 是如何进行分页的分页插件的原理是什么
Mybatis 使用 RowBounds 对象进行分页它是针对 ResultSet 结果集执行的内存分页而非物理 分 页。可以在 sql 内直接拼写带有物理分页的参数来完成物理分页功能也可以使用分页插件 来完成物 理分页比如MySQL 数据的时候在原有 SQL 后面拼写 limit。
分页插件的基本原理是使用 Mybatis 提供的插件接口实现自定义插件在插件的拦截方法内拦 截 待执行的 sql然后重写 sql根据 dialect 方言添加对应的物理分页语句和物理分页参数。
6、 Mybatis 是如何将sql 执行结果封装为目标对象并返回的 都有 哪些映射形式
第一种是使用标签逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用 sql 列的别名功能将列的别名书写为对象属性名。
有了列名与属性名的映射关系后Mybatis 通过反射创建对象同时使用反射给对象的属性逐一 赋 值并返回那些找不到映射关系的属性是无法完成赋值的。
7、 如何执行批量插入
首先创建一个简单的 insert 语句
insert idinsertname〉insert into names (name) values (#{value})
/insert
然后在 java 代码中像下面这样执行批处理插入:
liststring names new arraylist();names.add(“fred”);names.add(“barney”);names.add(“betty”);names.add(“wilma”);// 注意这里 executortype.batchsqlsession sqlsession sqlsessionfactory.opensession(executortype.batch);try {namemapper mapper sqlsession.getmapper(namemapper.class);for (string name : names) {mapper.insertname(name);}sqlsession.commit();}catch(Exception e){e.printStackTrace();sqlSession.rollback();throw e;}finally {sqlsession.close();}
8xml 映 射 文 件 中 除了常见的seleect、insert、update、delete标签之外还有哪些标签
加上动态 sql 的 9 个标签其中为 sql 片段标签通过标签引入 sql 片段为不支持自增的主键 生成策 略标签。
9Mybatis 实现一对一有几种方式具体怎么操作的
有联合查询和嵌套查询联合查询是几个表联合查询只查询一次 通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成
嵌套查询是先查一个表根据这个表里面的结果的 外键 id去在另外一个表里面查询数据也是 通过 association 配置但另外一个表的查询通过 select 属性配置。
10、Mybatis是否支持延迟加载如果支持它的实现原理是什么吗
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载association 指的就是一对一collection 指的就是一对多查询。在 Mybatis 配置文件中可以配置是否启用延迟加 载 lazyLoadingEnabledtrue|false。
它的原理是使用 CGLIB 创建目标对象的代理对象当调用目标方法时进入拦截器方法比如调 用 a.getB().getName()拦截器 invoke(方法发现 a.getB(是 null 值那么就会单独发送事先保 存好的
查询关联 B 对象的 sql把 B 查询上来然后调用 a.setB(b)于是 a 的对象 b 属性就有值了接 着完成 a.getB().getName(方法的调用。这就是延迟加载的基本原理。
当然了不光是 Mybatis几乎所有的包括 Hibernate支持延迟加载的原理都是一样的。
11说说 Mybatis的缓存机制
Mybatis 整体 一级缓存 localCache
在应用运行过程中我们有可能在一次数据库会话中执行多次查询条件完全相同的 SQL MyBatis 提供了一级缓存的方案优化这部分场景如果是相同的 SQL 语句会优先命中一级缓 存 避免直接对数据库进行查询提高性能。
每个 SqlSession 中持有了 Executor每个 Executor 中有一个 LocalCache。当用户发起查询 时 MyBatis 根据当前执行的语句生成 MappedStatement在 Local Cache 进行查询如果 缓存命中 的话直接返回结果给用户如果缓存没有命中的话查询数据库结果写入 Local Cache最后 返回结果给用户。具体实现类的类关系图如下图所示 MyBatis 一级缓存的生命周期和 SqlSession 一致。MyBatis 一级缓存内部设计简单只是一个没有容量限定的 HashMap在缓存的功能性上 有 所欠缺。MyBatis 的一级缓存最大范围是 SqlSession 内部有多个 SqlSession 或者分布式的环境 下 数据库写操作会引起脏数据建议设定缓存级别为 Statement。
二级缓存
在上文中提到的一级缓存中其最大的共享范围就是一个 SqlSession 内部如果多个 SqlSession 之间需要共享缓存则需要使用到二级缓存。开启二级缓存后会使用 CachingExecutor 装饰
Executor进入一级缓存的查询流程前先在 CachingExecutor 进行二级缓存的查询具体的工 作 流程如下所示。 二级缓存开启后同一个 namespace 下的所有操作语句都影响着同一个 Cache即二级缓存 被 多个 SqlSession 共享是一个全局的变量。
当开启缓存后数据的查询执行的流程为
二级缓存 - 一级缓存 - 数据库
MyBatis 的二级缓存相对于一级缓存来说实现了 SqlSession 之间缓存数据的共享同时粒 度 更加细能够到 namespace 级别通过 Cache 接口实现类不同的组合对 Cache 的 可控性 也更强。MyBatis 在多表查询时极大可能会出现脏数据有设计上的缺陷安全使用二级缓存的条 件 比较苛刻。在分布式环境下由于默认的 MyBatis Cache 实现都是基于本地的分布式环境下必然会出 现 读取到脏数据需要使用集中式缓存将 MyBatis 的 Cache 接口实现有一定的开发成本 直 接使用 Redis、 Memcached 等分布式缓存可能成本更低安全性也更高。
12JDBC 编程有哪些步骤
1.装载相应的数据库的 JDBC 驱动并进行初始化
Class.forName(com.mysql.jdbc.Driver);
2.建立 JDBC 和数据库之间的 Connection 连接
Connection c DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/test?
characterEncodingUTF-8, root, 123456);
3.创建 Statement 或者 PreparedStatement 接口执行 SQL 语句。
4.处理和显示结果。
5.释放资源。
13Mybatis中比如 UserMapper.java是接口为什么没 有实 现类还能调用
使用 JDK 动态代理MapperProxy。本质上调用的是 MapperProxy 的 invoke 方法。