mybatis 详解(一)------JDBC

1、什么是MyBatis?

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

  iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

  MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

2、为什么会有 MyBatis?

  通过上面的介绍,我们知道 MyBatis 是来和数据库打交道。那么在这之前,我们是使用 JDBC 来对数据库进行增删改查等一系列操作的,而我们之所以会放弃使用 JDBC,转而使用 MyBatis 框架,这是为什么呢?或者说使用 MyBatis 对比 JDBC 有什么好处?

  下面我们通过一段 JDBC 对 Person 表的操作来具体看看。

   person 表为:

public class Person {
	private Long pid;
	private String pname;
	public Long getPid() {
		return pid;
	}
	public void setPid(Long pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
}

  JDBC 查询操作:

package com.ys.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DebugGraphics;

import com.ys.bean.Person;

public class CRUDDao {
	//MySQL数据库驱动
	public static String driverClass = "com.mysql.jdbc.Driver";
	//MySQL用户名
	public static String userName = "root";
	//MySQL密码
	public static String passWord = "root";
	//MySQL URL
	public static String url = "jdbc:mysql://localhost:3306/test";
	//定义数据库连接
	public static Connection conn = null;
	//定义声明数据库语句,使用 预编译声明 PreparedStatement提高数据库执行性能
	public static PreparedStatement ps = null;
	//定义返回结果集
	public static ResultSet rs = null;
	/**
	 * 查询 person 表信息
	 * @return:返回 person 的 list 集合
	 */
	public static List<Person> readPerson(){
		List<Person> list = new ArrayList<>();
		try {
			//加载数据库驱动
			Class.forName(driverClass);
			//获取数据库连接
			conn = DriverManager.getConnection(url, userName, passWord);
			//定义 sql 语句,?表示占位符
			String sql = "select * from person where pname=?";
			//获取预编译处理的statement
			ps = conn.prepareStatement(sql);
			//设置sql语句中的参数,第一个为sql语句中的参数的?(从1开始),第二个为设置的参数值
			ps.setString(1, "qzy");
			//向数据库发出 sql 语句查询,并返回结果集
			rs = ps.executeQuery();
			while (rs.next()) {
				Person p = new Person();
				p.setPid(rs.getLong(1));
				p.setPname(rs.getString(2));
				list.add(p);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭数据库连接
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(ps!=null){
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		return list;
	}

	public static void main(String[] args) {
		System.out.println(CRUDDao.readPerson());
	}
}

3、分析  

  通过上面的例子我们可以分析如下几点:

  ①、问题一:数据库连接,使用时就创建,使用完毕就关闭,这样会对数据库进行频繁的获取连接和关闭连接,造成数据库资源浪费,影响数据库性能。

    设想解决:使用数据库连接池管理数据库连接

  ②、问题二:将 sql 语句硬编码到程序中,如果sql语句修改了,那么需要重新编译 Java 代码,不利于系统维护

    设想解决:将 sql 语句配置到 xml 文件中,即使 sql 语句变化了,我们也不需要对 Java 代码进行修改,重新编译

  ③、问题三:在 PreparedStatement 中设置参数,对占位符设置值都是硬编码在Java代码中,不利于系统维护

    设想解决:将 sql 语句以及占位符和参数都配置到 xml 文件中

  ④、问题四:从 resultset 中遍历结果集时,对表的字段存在硬编码,不利于系统维护

    设想解决:将查询的结果集自动映射为 Java 对象

  ⑤、问题五:重复性代码特别多,频繁的 try-catch

    设想解决:将其整合到一个 try-catch 代码块中

  ⑥、问题六:缓存做的很差,如果存在数据量很大的情况下,这种方式性能特别低

    设想解决:集成缓存框架去操作数据库

  ⑦、问题七:sql 的移植性不好,如果换个数据库,那么sql 语句可能要重写

    设想解决:在 JDBC 和 数据库之间插入第三方框架,用第三方去生成 sql 语句,屏蔽数据库的差异

  既然直接使用 JDBC 操作数据库有那么多的缺点,那么我们如何去解决呢?请看下面 mybatis 框架的入门实例介绍。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木木玲

Netty 源码解析 ——— Netty 优雅关闭流程

1903
来自专栏岑玉海

利用WCF改进文件流传输的三种方式

WCF在跨域传输使用了两种模型的方法调用:一种是同步模型,这种模型显然对那些需要大量操作时间的方法调用(如从数据库中获取大量数据时)是一种痛苦的选择。另一种是异...

2826
来自专栏好好学java的技术栈

jdbc就是这么简单

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问...

573
来自专栏xingoo, 一个梦想做发明家的程序员

漫谈Java IO之普通IO流与BIO服务器

今天来复习一下基础IO,也就是最普通的IO。 网络IO的基本知识与概念 普通IO以及BIO服务器 NIO的使用与服务器Hello world Netty入...

2455
来自专栏cmazxiaoma的架构师之路

Redis分布式锁解决方案

我们知道分布式锁的特性是排他、避免死锁、高可用。分布式锁的实现可以通过数据库的乐观锁(通过版本号)或者悲观锁(通过for update)、Redis的setnx...

864
来自专栏Java学习网

Spring中@Transactional事务回滚实例及源码

Spring中@Transactional事务回滚实例及源码 一、使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transacti...

2439
来自专栏菩提树下的杨过

ZooKeeper 笔记(6) 分布式锁

  目前分布式锁,比较成熟、主流的方案有基于redis及基于zookeeper的二种方案。   大体来讲,基于redis的分布式锁核心指令为SETNX,即如果目...

1848
来自专栏FD的专栏

一步步理解python的异步IO

看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下。 因为是初学者,在理解上有很多不到...

972
来自专栏一名合格java开发的自我修养

java:JDBC详解

JDBC全称为:Java DataBase Connectivity(java数据库连接)。

585
来自专栏分布式系统进阶

ReplicaManager源码解析1-消息同步线程管理

基本上就是作三件事: 构造FetchRequest, 同步发送FetchRequest并接收FetchResponse, 处理FetchResponse, 这三...

702

扫码关注云+社区