我们之前都用过JDBC方式开发Java程序,那么你是否对其有什么想法呢?
首先我们来看一段jdbc的代码:
package com.itcats.mybatis.jdbc;
import java.sql.DriverManager;
import java.sql.ResultSet;
import javax.xml.transform.Result;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
/**
* 查询jrkj中的Student信息
* @author Y
*
*/
public class jdbcTest {
private static String sql="";
public static void main(String args[]){
Connection conn= null;
PreparedStatement prepareStatement=null;
Result result= null;
try {
//加载数据驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库连接
conn=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/jrkj_java?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull","root","123456");
prepareStatement=(PreparedStatement) conn.prepareStatement(sql);
prepareStatement.setString(1, "王五");
result=(Result) prepareStatement.executeQuery();
//遍历结果集
while (((ResultSet) result).next()) {
System.out.println("ok");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
// 注意关闭顺序
}
}
}
那么这段代码存在什么问题呢?
首先,将sql语句直接硬编码到Java中,不利于系统维护。
其次,数据库连接不能重复利用,造成了资源浪费。
再次,向statement中设置参数时,对参数的位置通过硬编码制定,也不利于系统维护。
我们先来简单介绍一下mybatis。
Mybatis是一个不完全的ORM框架,不同于Hibernate。mybatis也可以实现关系映射,但还需要手写sql语句。它与Hibernate不同的是封装的不彻底,它更能适用于灵活多变的项目需求。
架构图:
说明:
SqlMapConfig.xml是Mybatis的核心配置文件,配置了数据源、连接池和事务。
SQLSessionFactory是会话工厂,用于生产用户会话session。
SqlSession会话是一个面向用户的门面接口,用户操作数据库。
Executor是执行器,SQLSession就是通过Executor来执行和操作数据库的。
Mapping Statement是Mybatis的一个封装对象,封装了sql语句、传入sql语句的参数,以及将sql查询结果映射成的Java对象。
上面的代码是我们jdbc实现连接数据库的常用代码段,那么mybatis是怎么解决这些问题的?
1、对于sql语句的硬编码,它将sql语句配置在了其映射文件中,如user.xml。
2、关于数据库连接问题,我们首先想到的就是利用连接池来管理。mybatis也没有离开这一点,只是在其内部已经配置好了,在sqlMapConfig.xml中配置的运行环境,就使用了连接池技术。
3、MyBatis能够通过一些配置,自动将Java对象的值设置到Statement中。
在user.xml中,设置参数类型,在sql语句中通过#{ }表示占位符号,{ }表示变量名,也可以写Po的属性,完成自动将Java对象映射到sql语句中。
关于MyBatis的具体使用,之后再为大家介绍。大家可以参考其他的实现Demo,来搭建自己的Mybatis框架。