Mybatis 学习—基础知识
1. 原生JDBC存在的一些问题
- jdbc 连接数据库的一般步骤
1、 加载数据库驱动
2、 创建并获取数据库链接
3、 创建jdbc statement对象
4、 设置sql语句
5、 设置sql语句中的参数(使用preparedStatement)
6、 通过statement执行sql并获取结果
7、 对sql执行结果进行解析处理
8、 释放资源(resultSet、preparedstatement、connection)
Connection connection = null;
// 预编译的Statement, 使用preparedStatement能够为预先进行编译计划的执行,
// 提高数据库性能,而且能够防止sql注入
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8",
"root", "011152");
//定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
}
- jdbc 连接数据库的缺点及解决方案设想
1.数据库连接使用时就连接,不使用时就释放,浪费了大量的资源,影响数据库性能
解读方案:使用数据库连接池
2.sql语句硬编码到Java代码中,一旦修改sql也需要修改Java代码,不利于维护
解决方案: sql 配置到xml中
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
4.从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。
2. Mybatis 框架
Mybatis 是一个持久层的ORM的轻量级的框架,原来是Apach的开源项目,后来托管到google code,现在在github上。
让程序员将其主要精力放在sql上面,通过mybatis提供的映射方式,自由灵活生成sql语句
与hibernate不同,mybatis一般需要程序员自己写sql,比较灵活易控,而hibernate则自动生成sql
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
mybatis 与hibernate的对比
mybatis | hibernate | |
---|---|---|
特点 | 轻量级的ORM框架,需要程序员自己写sql,sql修改、优化比较方便 | 标准的ORM框架,提供了HQL语言,不需要程序员自己写SQL,全表映射 |
开发速度 | 简单相对容易上手,但是根据你的项目的内容来说,如果需要的查询语句比较复杂,则使用mybatis会会快些 | 相对掌握困难一些,如果项目是一些简单的增删查改,则项目开发会快一些 |
对象管理 | 需要维护SQL与对象,可移植性比较差 | hibernate对象管理会更好一些,因为对象与底层数据库的映射关系已经建好,不需要考虑SQL语句,只需要关注对象就好,可移植性比较好 |
缓存 | 二级缓存要比hibernate差,Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置,而mybatis则在表-对象映射中进行配置,针对不同的表可以实现不同的缓存配置,可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现 | hibernate 提供了二级缓存,一级缓存是Session缓存,二级缓存是SessionFactory级的缓存,分为内置缓存(SessionFactory对象的一些集合属性包含的数据,只读)和外置缓存(存放的是数据库中数据副本),它可以被所有session共享,Hibernate对查询对象有着良好的管理机制,如果在适应二级缓存查询时出现脏数据,程序会自动报错 |
应用场景 | 适用与需求变化较多的项目,比如:互联网项目 | 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、oa |
更多的一个对比可以查看博客 : https://www.cnblogs.com/inspurhaitian/p/4647485.html
Hibernate 消除了代码的映射规则(即与数据库中表的映射规则),它被分离到XML中去配置或者注解实现,而且数据库的连接也被配置在XML中,通过Session进行操作,消除了JDBC的大量代码,提高了可编程性和简洁性,而且提供了级联、缓存、映射、一对多等功能
mybatis 解决了hibernate的哪些痛点?
1. Hibernate屏蔽了SQl,是全表映射,带来性能问题,因为有时我们可能只关注表中的某些字段,例如更新修改时需要发送表中的所有字段
2. 虽然提供了HQL,但是封装了SQL,SQL修改与优化困难
3. 无法根据不同的条件组装不同SQL
4. 对于多表关联与复杂SQL查询支持差,不能支持存储过程
说明: 本文大部分内容都是跟随者传播智课的教学视频学习而来,可以看做是翻译文章,只是自己吸收之后又书写一遍,加深自己的知识理解。