广州响应式网站建设,免费虚拟主机管理系统,广州网络推广招聘,网站维护费用目录
1.什么是MyBatis
2.MyBatis优缺点
3.MyBatis工作原理
4.MyBatis缓存模式
5.MyBatis代码相关问题
6.MyBatis和hibernate区别 1.什么是MyBatis
MyBatis是一个半ORM持久层框架#xff08;对象关系映射#xff09;#xff0c;基于JDBC进行封装#xff0c;使得开发者…目录
1.什么是MyBatis
2.MyBatis优缺点
3.MyBatis工作原理
4.MyBatis缓存模式
5.MyBatis代码相关问题
6.MyBatis和hibernate区别 1.什么是MyBatis
MyBatis是一个半ORM持久层框架对象关系映射基于JDBC进行封装使得开发者可以专注于SQL语句不用关系JDBC操作的流程。
MyBatis支持定制化 、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息将接口和 Java 的 POJOS(Plain Ordinary Java Object普通的 Java对象即实际开发中的实体类)映射成数据库中的记录。
2.MyBatis优缺点
MyBatis作为市面上应用最为广泛的数据库框架具有以下优点 简单易学本身就很小且简单。易于学习易于使用。通过文档和源代码可以比较完全的掌握它的设计思路和实现。 灵活便捷mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。同时减少了JDBC相关代码大大减少了代码量。 解除sql与程序代码的耦合通过提供DAO层将业务逻辑和数据访问逻辑分离使系统的设计更清晰更易维护更易单元测试。sql和代码的分离提高了可维护性。 兼容性好基于JDBC进行封装所以可以和很多数据库兼容。 提供xml标签支持编写动态sql。
但同时MyBatis也还具有一定的缺点
SQL语句编程量较大较为考验使用者的SQL功力。SQL语句与具体数据库依赖很大使得数据库移植性差。
3.MyBatis工作原理
MyBatis的工作原理主要依赖于SqlSessionFactory和SqlSession两大类。其主要分为两大过程
1MyBatis启动加载。Mybatis会获取一个SqlSessionFactory对象完成全局配置文件和映射文件的加载解析操作然后把相关信息保存到Configuration对象中。然后通过SqlSessionFactory获取SqlSession对象基于DefaultSqlSessio对象实现。
SqlSessionFactory类它是单个数据库映射关系经过编译后的内存镜像主要是创建DefaultSqlSessionFactory对象进行具体实现。而SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得而SqlSessionFactoryBuildr则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
2MyBatis处理请求。SqlSession类中提供了处理请求的方法select、update等并调用对应的Executor处理。处理过程中如果有配置缓存先走二级缓存再走一级缓存缓存不命中再走数据库操作。会通过StatementHandler处理先通过ParameterHandler处理SQL中的占位符再通过ResultSetHandler处理结果集的映射。
SqlSession类同理主要是创建DefaultSqlSession对象进行具体实现。SqlSession接口实例执行方法的过程中主要会去执行Executor类的方法进行请求的具体处理。 总结来说具体的工作流程就是通过SqlSessionFactoryBuilder从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例再由SqlSessionFactory创建出一个SqlSession并由该SqlSession进行请求的处理执行事务和SQL语句。
4.MyBatis缓存模式
mybatis为减轻数据库压力提高数据库性能提供了两级缓存机制
1一级缓存
基于会话session的缓存。一级缓存是默认放开的但需开启事务进行使用就是同一个事务中的第二次查询会走缓存。MyBatis中一级缓存也叫做本地缓存于SqlSession层面实现的所以作用范围是在同一个SqlSession中,不同的SqlSession及时查询相同的数据也不会走缓存。
2二级缓存
基于进程使用装饰器维护涉及到了装饰器模式需要了解可参考java设计模式——装饰器模式的缓存。MyBatis中二级缓存的作用域是namespace命名空间所以很显然二级缓存是需要存储在SqlSession之外的
二级缓存缓存范围比一级缓存更大不同的SQLSession可以访问二级缓存的内容所以二级缓存需要自己开启哪些数据放入二级缓存需要自己指定。
开启方式application.yml文件配置 # mybatis相关配置
mybatis:configuration:#开启MyBatis的二级缓存cache-enabled: true或是在mapper.xml文件中添加代码
其中eviction属性指缓存回收策略flushInterval则是缓存更新时间上述代码中为1分钟
eviction缓存的回收策略默认的是 LRU。
LRU - 最近最少使用移除最长时间不被使用的对象。 FIFO - 先进先出按对象进入缓存的顺序来移除它们。 SOFT - 软引用移除基于垃圾回收器状态和软引用规则的对象。 WEAK - 弱引用更积极地移除基于垃圾收集器和弱引用规则的对象。
3三级缓存
三级缓存又称为自定义缓存如使用Redis进行缓存等需要自行进行配置操作。
实际代码中如何开启
5.MyBatis代码相关问题
1获取自增主键如果数据库中设计了主键id自动增长那么可以通过MyBatis中的mapper.xml文件中的属性配置获取该值并进行插入
insert idaddEmployee parameterTypeemployee useGeneratedKeystrue keyPropertyidinsert into tbl_employee (id, name, email, gender)values (#{id}, #{name}, #{email}, #{gender});
/insert核心代码为 useGeneratedKeystrue keyPropertyid
2属性名和字段名不一致主要通过resultMap标签处理。
resultMap idempResultMap typeEmpid columnstudent_id propertyid/idresult columns_name propertyname/result
/resultMap
select resultMapempResultMapselect * from student where student_id #{id}
/select3#和$的区别
#{}是预编译处理会把传入的数据都当成一个字符串来处理所以会在传入的数据上面加一个双引号。其在mybatis处理时替换为?然后进行赋值。${}是在mybatis处理时直接替换作用相等于是字符串拼接所以会有SQL注入风险。
例子
select * from student where name #{name}
上述语句中该sql语句会将#{name}替换为?然后获取到传入的Param的参数值时比如nameseven再传入整个seven进行传入。
select * from student where name ${name} 如果传入的name类型为整型类型那么在执行sql语句时就不会出错但是如果传入的name类型为字符串型就会变成select * from student where nameseven执行会报错。 所以一般情况下传入参数使用 #{}如果需要凭借SQL语句时才使用${}。
6.MyBatis和hibernate区别
Hibernate也是一个对象关系映射框架同样基于JDBC进行封装工作原理与MyBatis类似。其余MyBatis之间主要区别如下
MyBatisHibernate半自动框架需要手动编写SQL语句全自动的orm框架hibernate可以自动生成SQL语句自动执行日志模块只有基本记录功能拥有完成的日志系统缓存模块需要在每个表-对象进行详细配置缓存机制上更优移植性较差移植性更强由于sql都是手动编写且存于xml文件中优化更为便捷 由于sql都是自动生成优化较为困难且遇到一些较为复杂的sql操作时无法达成目的。 总结来说mybatis较为轻便简单而直接使用sql语句开发更方便上手更快。Hibernate框架更为复杂也更加严谨。