为什么要用Mybatis框架---Mybatis学习笔记(一)

首先先看一下原生态JDBC操作数据库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; 

public class JdbcTest {
	public static void main(String[] args) {
		Connection connection = null;
		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", "123");
			//定义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{
			//释放资源
			if(resultSet!=null){
				try {
					resultSet.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(preparedStatement!=null){
				try {
					preparedStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}  

通过上面的代码我们可以发现

  1. 数据库连接在使用的时候就创建,使用完成之后就关闭。这就会对数据库进行频繁的连接开启和关闭,就会造成数据库的资源浪费,影响了数据库的性能。
    解决方案:使用数据库的连接池来管理数据库的连接。
  2. 将sql语句硬编码(也就是把变量写死了)到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
    解决方案:可以将sql语句配置在xml的配置文件中。这样即使sql语句变化了,也不需要对java代码进行重新编译。
  3. 向preparedStatement中设置参数(preparedStatement.setString(1, "王五");),对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
    解决方案:将sql语句及占位符和参数全部配置到xml文件中。
  4. 从resutSet中遍历结果集数据时存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
    解决方案:将查询的结果集自动映射成java对象。

mybatis的优点

  1. 在mybatis中数据库没有连接池,每次请求都会重新创建。 mybatis:使用线程池 ;
  2. sql语句是写死在代码中,不利于代码维护。 mybatis:在xml中配置 ;
  3. preparedStatement 中的设置的参数也是写的死,同样不利于维护。 mybatis:在xml中配置 ;
  4. 数据从数据库获取后,读取方式同样是写死的。 mybatis:自动映射。
  5. ORM其实最大的好处是对SQL的封装性。原生SQL对于数据库系统的耦合太大,如果使用原生SQL,一旦要把系统部署到不同的数据库上,代码的修改和重构是个很大的麻烦。严格的说ibatis在这方面做得并没有hibernate彻底。但是总比原生JDBC要好。

  6. ORM算是对象化的一种实现(尽管现在看起来越来越臃肿),比如增加和修改的操作,如果用原生SQL,一点不进行封装的话,操作起来还是略麻烦的。

  7. 但是ORM和原生JDBC相比弱的地方在于SQL局限性很大,比如很多报表需要多表JOIN,还需要临时表进行数据组合,ORM会显得无能为力。

MyBatis和 hibernate本质上的区

Hibernate: 是一个标准的 ORM 框架(对象关系映射)。学生成本较高,不需要编写sql语句,SQL语句自动生成。对于sql语句的优化,修改比较困难。
应用场景:
适合用于sql语句简单的,效率要求不是特别高的项目。

Mybatis: 专注于sql语句,对象映射和输入输出,都由框架帮你完成,所以属于半 ORM系统,
适用场景:
sql语句逻辑复杂,效率要求特别高的应用

疑问解释

为什么导入的都是java.sql包中的接口?
原因: 这里使用mysql的jar包中实现了这些接口,如果以后更换了数据库oracle,oracle的数据库jar包也实现了这些接口。就不需要重新引入了。如果这里导入的是mysql的jar中的实现类的话,那么更换为oracle数据库之后,要重新导入oracle的jar的实现类。

为什么要使用PreparedStatement而不使用Statement呢?
原因:preparedStatement是预编译的statement,
通过preparedStatement向数据库发送sql语句,然后数据库那边要对sql语句进行编译,编译完成之后把编译的结果存储到数据库端的缓存中。下次如果发送相同的sql语句的话,数据库就不需要编译了,直接将缓存中的结果取过来就可以了。这样提高了数据库的性能。

如果系统不考虑数据库改变,自己能利用反射等思想对SQL所操作的对象进行一定程度的封装的话,JDBC其实优于ORM。

大力推荐一下oschina所使用的jdbc工具库:dbutils。本人在超过4个中型以上项目使用了该框架,觉得非常好。

猜你喜欢

转载自blog.csdn.net/yy_csdn1314/article/details/81586678