“入门:Mybatis”的版本间差异

来自Wikioe
跳到导航 跳到搜索
(建立内容为“category:Mybatis”的新页面)
 
无编辑摘要
 
(未显示同一用户的18个中间版本)
第1行: 第1行:
[[category:Mybatis]]
[[category:Mybatis]]
== 关于JDBC ==
=== 依赖包 ===
* '''<code>mysql-connector-java-5.1.7-bin.jar</code>''':Mysql驱动
* '''<code>ojdbc14-10.2.0.1.0.jar</code>''':Oracle驱动
=== JDBC步骤 ===
# 加载数据库驱动;
# 创建并获取数据库链接;
# 创建statement对象;
# 编写sql语句;
# 设置sql语句中的参数(使用preparedStatement);
# 通过statement执行sql并获取结果;
# 对sql执行结果进行解析处理;
# 释放资源(resultSet、preparedstatement、connection);
=== JDBC代码 ===
<syntaxhighlight lang="java">
package cn.xxx.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;
//预编译的Statement,使用预编译的Statement提高数据库性能
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", "admin");
           
//定义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();
}
}
}
}
}
</syntaxhighlight>
=== JDBC问题 ===
# 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
# 采用硬编码方式,不能灵活操作数据库,代码不易维护。
#: sql语句、查询条件、preparedStatement向占有位符号传参数、结果集解析,均是硬编码方式写入代码;
== 关于Mybatis ==
Mybatis 是三层架构【表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)】中的数据访问层(持久层)框架。<br/>
Mybatis 把对jdbc的操作数据库的过程都进行了封装(不再需要关注注册驱动、创建connection、创建statement、手动设置参数、结果集检索等),使开发更专注于SQL本身:
: 通过'''xml'''或'''注解'''的方式将要执行的各种'''statement'''(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成'''java对象'''并返回。<br/>
<br/>
相对于Hibernate更加轻量。Hibernate更加关注实体对象,而Mybatis更加关注sql语句。
== 相关包 ==
# 核心包:
#: '''<code>mybatis-3.2.7.jar</code>'''
# 数据驱动包:
#: '''<code>mysql-connector-java-5.1.7-bin.jar</code>'''
#: '''<code>ojdbc14-10.2.0.1.0.jar</code>'''
# 依赖包:
#: '''<code>asm-3.3.1.jar</code>''':Java字节码操纵框架
#: '''<code>cglib-2.2.2.jar</code>''':动态代理jar包(依赖于asm)
#: '''<code>commons-logging-1.1.1.jar</code>''':日志处理
#: '''<code>javassist-3.17.1-GA</code>''':字节码编辑工具
#: '''<code>log4j-1.2.17.jar</code>''':slf4j(日志框架)
#: '''<code>log4j-api-2.0-rc1.jar</code>''':..
#: '''<code>log4j-core-2.0-rc1.jar</code>''':..
#: '''<code>slf4j-api-1.7.5.jar</code>''':slf4j(用户日志系统的facade)
#: '''<code>slf4j-log4j12-1.7.5.jar</code>''':slf4j与log4j的桥接包
# 其他
#: '''<code>junit-4.9.jar</code>''':单元测试包
== 架构 ==
{| class="wikitable"
! colspan="2"| 架构图
|-
| colspan="2"| [[File:Mybatis架构.png|center|800px]]
|-
! 组件 !! 说明
|-
| '''SqlMapConfig.xml'''
| mybatis的全局配置文件,包括:
# mybatis的运行环境的配置;
# mapper.xml文件(sql映射文件)的加载;
|-
| '''SqlSessionFactory'''
| 通过SqlMapConfig.xml中的环境配置信息构造SqlSessionFactory(会话工厂)
|-
| '''sqlSession'''
| 由SqlSessionFactory创建sqlSession(会话),通过sqlSession进行数据库操作
|-
| '''Executor'''
| mybatis底层自定义了Executor(执行器)接口操作数据库:
# Executor接口有两个实现:“基本执行器”、“缓存执行器”
|-
| '''Mapped Statement'''
| mybatis的底层封装对象,它包装了mybatis配置信息及sql映射信息等:
# mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id;
# 输入参数映射:通过Mapped Statement在执行sql前将输入的java对象映射至sql中;
#: 参数类型包括:基本类型、HashMap、pojo
#: 对应于:jdbc编程中对preparedStatement设置参数
# 输出参数映射:通过Mapped Statement在执行sql后将输出结果映射至java对象中;
#: 参数类型包括:基本类型、HashMap、pojo
#: 对应于:jdbc编程中resultset解析
|}

2020年10月10日 (六) 00:41的最新版本


关于JDBC

依赖包

  • mysql-connector-java-5.1.7-bin.jar:Mysql驱动
  • ojdbc14-10.2.0.1.0.jar:Oracle驱动

JDBC步骤

  1. 加载数据库驱动;
  2. 创建并获取数据库链接;
  3. 创建statement对象;
  4. 编写sql语句;
  5. 设置sql语句中的参数(使用preparedStatement);
  6. 通过statement执行sql并获取结果;
  7. 对sql执行结果进行解析处理;
  8. 释放资源(resultSet、preparedstatement、connection);

JDBC代码

package cn.xxx.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;
		//预编译的Statement,使用预编译的Statement提高数据库性能
		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", "admin");
            
			//定义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();
				}
			}
		}
	}
}

JDBC问题

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  2. 采用硬编码方式,不能灵活操作数据库,代码不易维护。
    sql语句、查询条件、preparedStatement向占有位符号传参数、结果集解析,均是硬编码方式写入代码;

关于Mybatis

Mybatis 是三层架构【表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)】中的数据访问层(持久层)框架。
Mybatis 把对jdbc的操作数据库的过程都进行了封装(不再需要关注注册驱动、创建connection、创建statement、手动设置参数、结果集检索等),使开发更专注于SQL本身:

通过xml注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。


相对于Hibernate更加轻量。Hibernate更加关注实体对象,而Mybatis更加关注sql语句。

相关包

  1. 核心包:
    mybatis-3.2.7.jar
  2. 数据驱动包:
    mysql-connector-java-5.1.7-bin.jar
    ojdbc14-10.2.0.1.0.jar
  3. 依赖包:
    asm-3.3.1.jar:Java字节码操纵框架
    cglib-2.2.2.jar:动态代理jar包(依赖于asm)
    commons-logging-1.1.1.jar:日志处理
    javassist-3.17.1-GA:字节码编辑工具
    log4j-1.2.17.jar:slf4j(日志框架)
    log4j-api-2.0-rc1.jar:..
    log4j-core-2.0-rc1.jar:..
    slf4j-api-1.7.5.jar:slf4j(用户日志系统的facade)
    slf4j-log4j12-1.7.5.jar:slf4j与log4j的桥接包
  4. 其他
    junit-4.9.jar:单元测试包

架构

架构图
Mybatis架构.png
组件 说明
SqlMapConfig.xml mybatis的全局配置文件,包括:
  1. mybatis的运行环境的配置;
  2. mapper.xml文件(sql映射文件)的加载;
SqlSessionFactory 通过SqlMapConfig.xml中的环境配置信息构造SqlSessionFactory(会话工厂)
sqlSession 由SqlSessionFactory创建sqlSession(会话),通过sqlSession进行数据库操作
Executor mybatis底层自定义了Executor(执行器)接口操作数据库:
  1. Executor接口有两个实现:“基本执行器”、“缓存执行器”
Mapped Statement mybatis的底层封装对象,它包装了mybatis配置信息及sql映射信息等:
  1. mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id;
  2. 输入参数映射:通过Mapped Statement在执行sql前将输入的java对象映射至sql中;
    参数类型包括:基本类型、HashMap、pojo
    对应于:jdbc编程中对preparedStatement设置参数
  3. 输出参数映射:通过Mapped Statement在执行sql后将输出结果映射至java对象中;
    参数类型包括:基本类型、HashMap、pojo
    对应于:jdbc编程中resultset解析