MyBatis 介绍
Mybatis是一个基于jdbc的支持普通SQL、存储过程以及高级映射的持久化框架技术。
mybatis原本叫ibatis,是Apache组织的一个项目。后来被托管到googlecode下,并且改名为mybatis,当然mybatis和ibatis不只是改了个名字,它在ibatis的基础之上更是优化了一些东西,使程序员更容易学习和使用mybatis。现在mybatis被托管到github。
首先要知道mybatis在项目中的使用是处于哪一层?
Dao数据访问层
Dao层已经有jdbc和hibernate技术了,为啥还学习mybatis?
有两个方面考虑:
1、原生态jdbc程序存在问题;
2、Hibernate框架有些场景不好用。
Mybatis是对JDBC的一种封装,我们看看jdbc存在哪些问题,为什么要封装它。
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
//3、定义sql语句 ?表示占位符
Stringsql = "select * from user whereusername = ?";
//4、获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//6、向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7、遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//8、释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e){
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
1.1.5 Jdbc编程步骤(预处理preparedStatement)1、 加载数据库驱动; 2、 通过驱动管理器创建数据库连接; 3、 编写业务SQL语句,并设置占位符; 4、 通过数据库连接创建PreparedStatement; 5、 通过PreparedStatement设置预处理SQL的参数; 6、 执行PreparedStatement; 7、 遍历并输出结果集信息; 8、 关闭连接等资源信息。
1、加载数据库驱动,存在硬编码;
2、通过驱动管理器创建数据库连接,存在硬编码。且频繁的创建数据库连接,会造成数据库的性能降低;
3、编写业务SQL,并设置占位符,存在硬编码;
4、 没毛病;
5、通过PreparedStatement设置预处理SQL的参数,存在硬编码;
6、 没毛病;
7、遍历并输出结果集信息,存在硬编码;
8、频繁的关闭数据库连接,会造成数据库的资源浪费且会造成数据库的性能降低。
MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
如何解决jdbc的问题:
一、Jdbc编程步骤中的1、2、8,mybatis通过SqlMapConfig.xml配置来进行管理,并采取了连接池来获取连接,避免了资源的频繁创建与关闭。
二、jdbc编程步骤中的3、5、7,mybatis通过mapper映射文件来让程序员进行SQL的编写,参数的设置以及结果集的映射。
是不是只有mybatis可以解决jdbc的问题呢?当然不是,hibernate也可以解决JDBC的这些问题。那既然有可以解决jdbc问题的持久层框架了,为什么还要学mybatis呢?
下面讲解一下mybatis和hibernate各自的技术特点及最佳应用场景。
Mybatis技术特点:
1、 通过直接编写SQL语句,可以直接对SQL进行性能的优化;
2、 学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
3、 由于直接编写SQL语句,所以灵活多变,代码维护性更好。
4、 不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。
5、 需要编写结果映射。
Hibernate技术特点:
1、 标准的orm框架,程序员不需要编写SQL语句。
2、 具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
3、 学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
4、 程序员不能自主的去进行SQL性能优化。
Mybatis应用场景:
需求多变的互联网项目,例如电商项目。
Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。