摘要

因为有持久层框架,和Spring的存在,越来越多的人对数据库连接这块不甚了解,只知使用方便,不知其原理。所以写一个数据库连接的系列文章,总结下本人在数据库连接方面遇到的问题,和对数据库连接的理解。

JDBC

jdbc:Java DataBase Connectivity,Java 数据库连接,一套标准的Java API,用来执行SQL语句。这套命名应该是很老了,毕竟将Data Base直接映射成了关系型数据库,或者说,像我之前在介绍NoSQL数据库时多次提到的,NoSQL数据库还没有一套统一的访问标准语句。

jdbc的作用就是将SQL变成了Java API 访问。

		Connection conn = null;
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test?"
+ "user=root&password=123456&useUnicode=true&characterEncoding=UTF8";
conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
String sql = "select *from post where user_id=1";
ResultSet resultSet = stmt.executeQuery(sql);
List<Post> posts = new ArrayList<>();
while (resultSet.next()) {
Post post = new Post();
post.setId(resultSet.getLong("id"));
post.setTitle(resultSet.getString("title"));
post.setContents(resultSet.getString("contents"));
posts.add(post);
}
stmt.close();
conn.close();

其中Connection,DriverManager,Statement这些类都是jdk提供的,不依赖其他的jar。jdk提供了一套通用的SQL访问API,但是各个数据库并不相同,有各自的标准,所以各个针对MySQL,Oracle提供了不同的驱动。比如MySQL的驱动。

		<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>

执行Class.forName("com.mysql.jdbc.Driver");加载MySQL驱动

DriverManager.registerDriver(new Driver());

这段代码中包含了所有的基本的数据库操作对象

JDBC 四大对象: DataSource , Connection, Statement,ResultSet

  1. 连接url

  2. 连接: 数据库Server通信与服务的通信

  3. statement:把 SQL 语句发送到 DBMS

  4. ResultSet : 数据库操作返回结果

后续的其他扩展,都是基于以上各个部分的扩展

获取connection,构建statement,执行时Java操作数据库最基本的操作,以后的所有扩展都围绕这个。

从上面的代码中我们可以看到这只是一个hello world,在实际开发中,有很多的数据库操作,如果每个都写一个,那重复代码太多了

Spring-Template--解决重复代码

将1的url封装成了一个DataSource对象

@Bean
public DataSource dataSource() {
return new DriverManagerDataSource("jdbc:mysql://localhost:3306/test?"
+ "user=root&password=123456&useUnicode=true&characterEncoding=UTF8");
}
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}

将3 Statement重复代码解决了

@Service
public class JdbcTemplateService {
@Autowired
private JdbcTemplate mJdbcTemplate; public void queryById(long userId) {
String sql = "select * from post where user_id = " + userId;
List<Post> result =mJdbcTemplate.query(sql, new PostRowMapper());
} class PostRowMapper implements RowMapper<Post> {
public Post mapRow(ResultSet rs, int rowNum) throws SQLException {
Post post = new Post();
post.setId(rs.getLong("id"));
post.setTitle(rs.getString("title"));
post.setContents(rs.getString("contents"));
return post;
} }
}

解决了连接获取,查询重复语句的问题,

但是没有解决对象映射的问题,需要为每个数据库对象生成独自的Mapper

那么JdbcTemplate是如何做到的呢,因为statemnt的前提是需要一个连接,然后执行。

所以对于Spring框架而言,它当前没有connection对象,所以它需要一个回调来执行。

public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException {
Assert.notNull(sql, "SQL must not be null");
Assert.notNull(rse, "ResultSetExtractor must not be null");
if (logger.isDebugEnabled()) {
logger.debug("Executing SQL query [" + sql + "]");
} class QueryStatementCallback implements StatementCallback<T>, SqlProvider {
@Override
@Nullable
public T doInStatement(Statement stmt) throws SQLException {
ResultSet rs = null;
try {
rs = stmt.executeQuery(sql);
return rse.extractData(rs);
}
finally {
JdbcUtils.closeResultSet(rs);
}
}
@Override
public String getSql() {
return sql;
}
} return execute(new QueryStatementCallback());
}

对外暴露JdbcTemplate,

内部实现是通过回调方法来实现Statement的执行

连接池

Template只是解决了重复代码的问题,并没有解决连接的资源消耗问题,所以需要连接池,通过一个容器储存连接,然后复用已有的连接,来实现节约资源的目的

一些开源的数据库连接池

  • DBCP

    Apache 下面的,实现了基本的数据库连接池功能,没有自动回收空闲连接的功能

  • C3P0

    实现了数据源与JNDI的绑定,目前使用它的开源项目有Hibernate,

  • Druid

    阿里的开源数据库连接池,分库分表数据库中间件TDDL就是用的这个

数据库连接池是一个老生常谈的话题,不做过多的介绍,在下面的mybatis框架中讲它的实现

持久层框架-mybatis

虽然有了JdbcTemplate,但是还缺乏一些操作,比如对象映射,查询数据的时候希望自动映射到对象上,

另外需要自动生成SQL语句,不需要进行SQL的拼接,赋值。

mybatis的介绍

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

重点在于避免了所有的JDBC代码,和手动设置参数以及获取结果集



对外暴露:SqlSession

在jdbc中是没有session这个概念,只有connection.session即会话,mybatis与数据库的一次交互

内部实现:Executor,StatmentHandler 替换Statement,ResultHander替换resultset,另外多了一个ParameterHandler来处理参数

构建一个SqlSessionFactory

    @Bean
public SqlSessionFactory sqlSessionFactory() {
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource());
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session
.Configuration(environment);
configuration.addMapper(PostMapper.class);
return new SqlSessionFactoryBuilder().build(configuration);
}

获取session然后执行

 @Autowired
private SqlSessionFactory sqlSessionFactory;
public void queryByUserId(long userId) {
SqlSession session = sqlSessionFactory.openSession();
PostMapper postMapper = session.getMapper(PostMapper.class);
Post post = postMapper.findPostByUserId(userId);
}
}

spring-mybatis

spring-mybatis 的作用就是让你不知道mybatis

Spring 将会加载必要的 MyBatis 工厂类和 session 类。由spring来接管数据库连接的创建。

并且提供一个简单的方式来注入 MyBatis 数据映射器和 SqlSession 到业务层的 bean 中

所有代码

https://github.com/FS1360472174/javaweb/tree/master/db-connection/mysql-jdbc

mybatis 与hibernate一些区别,下期再讲

关注【方丈的寺院】,与方丈一起开始技术修行之路

喜欢这篇文章的话,点个赞呗

参考

http://www.cnblogs.com/JavaSubin/p/5294721.html

http://www.mybatis.org/mybatis-3/zh/index.html

http://www.mybatis.org/spring/zh/index.html

http://blog.csdn.net/u014723529/article/details/41288333

https://github.com/spring-projects/spring-framework/blob/master/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java

数据库连接(1)-从JDBC到MyBatis的更多相关文章

  1. jdbc、Mybatis、Hibernate介绍(非原创)

    文章大纲 一.jdbc介绍二.Mybatis介绍三.Hibernate介绍四.jdbc.Mybatis.Hibernate比较五.参考文章   一.jdbc介绍 1. jdbc编程步骤 (1)加载数据 ...

  2. 数据库连接之SQL JDBC

    数据库连接之SQL JDBC SQlServer的配置: 1).外围配置服务器中将远程连接设置为:同时使用TCP/IP和named pipes 2).点击该连接->属性->安全性-> ...

  3. jdbc hibernate myBatis比较

    jdbc hibernate myBatis比较 jdbc 优点:性能高,易掌握 缺点:代码繁琐 hibernate 优点:不用写sql,代码简洁 缺点:性能不好 自动生成的sql效率低下(复杂业务) ...

  4. jdbc、Mybatis插入数据主键回显的实现方法

    插入数据的时候,往往需要获取主键值.但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法, 下面以jdbc.mybatis的实现举例 此时使用的是jdbc的话或 ...

  5. Data Source与数据库连接池简介 JDBC简介(八)

    DataSource是作为DriverManager的替代品而推出的,DataSource 对象是获取连接的首选方法. 起源 为何放弃DriverManager DriverManager负责管理驱动 ...

  6. [转载]JDBC/Spring/MyBatis性能比较

    原文地址:JDBC/Spring/MyBatis性能比较作者:tom_lt 测试目的: 比较JDBC,SpringJdbc和MyBatis的性能.   测试用例: 1. 查询:查询一张10000条数据 ...

  7. 原理分析之一:从JDBC到Mybatis

    原理分析之一:从JDBC到Mybatis Mybatis学习(一)原生态的JDBC编程总结 -----系列 深入浅出MyBatis-快速入门

  8. SpringBoot 整合jdbc和mybatis

    摘要 该文章主要为记录如何在SpringBoot项目中整合JDBC和MyBatis,在整合中我会使用简单的用法和测试用例,毕竟该文章目的是为了整合,而不是教大家如何去使用.希望大家多多包涵. 通用配置 ...

  9. Mybatis原理分析之一:从JDBC到Mybatis

    1.引言 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架.再而论述Mybatis作为一个数据持久层框架本身有待改进之处. 2 ...

随机推荐

  1. Extjs--12种布局方式

    按照Extjs的4.1的文档来看,extjs的布局方式大致有12种,下面一一介绍,有些代码就是文档中的. 1.Border 边界布局 border布局,最多可以将页面分割为"东南西北中&qu ...

  2. selenium设置proxy、headers(phantomjs、Chrome、Firefox)

    phantomjs 设置ip 方法1: service_args = [ '--proxy=%s' % ip_html, # 代理 IP:prot (eg:192.168.0.28:808) '--p ...

  3. vue的传参方式和router使用技巧

    vue传参方法一 1,路由配置 { path: '/describe/:id', name: 'Describe', component: Describe } 2,使用方法 // 直接调用$rout ...

  4. 自动化测试基础二(Python基础)

    1.为什么学习Python 1)简单.易学 2)强大:交互性.解释性.编译性.跨平台 3)市场需求上升快.顺应市场需要 4)自动化测试需要使用编程语言来写脚本 2.需要学习Python哪些内容? 1) ...

  5. Go 延迟函数 defer 详解

    Go 延迟函数 defer 详解 Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.re ...

  6. iOS 社交化分享功能

    iOS 开发过程中可能会遇到需要进行第三方分享的需求,比如向QQ,微信,微博等分享 如下图 我们今天要讲到的方式是使用了一个第三方工具: http://www.sharesdk.cn 一,注册账号 去 ...

  7. 虚拟机console基础环境部署——系统基础环境

    1. 概述2. 工具类安装2.1 安装vim2.2 安装tree2.3 安装expect2.4 安装lsof3. 编译环境类安装 1. 概述 本系列博客是在最小化安装CentOS6.5的基础上,通过配 ...

  8. 【STM32H7教程】第13章 STM32H7启动过程详解

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章       STM32H7启动过程详解 本章教 ...

  9. 为什么面试你要25K,HR只给你20K?

    周末了,我们来聊个轻松的话题,关于涨薪,哈哈~ 前阵子,栈长给大家分享了<为什么公司宁愿 25K 重新招人,也不给你加到 20K?>,今天我们来聊一个差不多的话题: 为什么面试你要25K, ...

  10. ES踩坑笔记

    现在开始在业务上使用ES,记录一些踩坑经历,做点笔记. 2018-11-13 source不返回问题 使用了角色校验,客户端插入成功之后获取数据没有source,和查询参数无关. 检查mapping, ...