摘要

因为有持久层框架,和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. 一起来读Netty In Action(一)

    Netty是一款异步事件驱动的网络应用程序框架,支持快速的开发可维护的高性能的面向协议的服务器和客户端.在网络编程中,阻塞.非阻塞.同步.异步经常被提到.同步(synchronous) IO和异步(a ...

  2. this.state.menuList.toArray()[0].get('id')

    用toArray()处理传过来的list用get(")获取里面的值 而我用的是attributes得方法

  3. 你不知道的JavaScript--Item18 JScript的Bug与内存管理

    1.JScript的Bug IE的ECMAScript实现JScript严重混淆了命名函数表达式,搞得现很多人都出来反对命名函数表达式,而且即便是现在还一直在用的一版(IE8中使用的5.8版)仍然存在 ...

  4. 详解MUI顶部选项卡(tab-top-webview-main)的用法

    最近用MUI做手机app的时候,遇到了一点问题.然后就对这个tab-top-webview-main的源码做了点研究,接下来我将和大家详解一下 tab-top-webview-main的用法和应该注意 ...

  5. Guava新增集合类型-Multiset

    Guava新增集合类型-Multiset Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口 ...

  6. 「SDOI 2018」反回文串

    题目大意: 求字符集大小为$k$长度为$n$的经循环移位后为回文串的数量. 题解: 这题是D1里最神的吧 考虑一个长度为$n$回文串,将其循环移位后所有的串都是满足要求的串. 但是显然这样计算会算重. ...

  7. 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】

    题目链接: TP 题解:   可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...

  8. BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针

    BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针 Description Farmer John's N cows (1 <= N <= 100,000) ...

  9. PCB设计检查

    一.资料输入阶段1.在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件)2.确认PCB模板是最新的3. 确认模板 ...

  10. Postman----设置代理抓取手机上的请求

    一般为方便接口测试,我们都会设置代理,抓取手机上的请求来方便测试,具体的操作方法如下. 操作步骤: 一.手机和电脑连接同一网络,查看电脑连接网络的IP,配置手机的代理 1.查看电脑连接的网络与IP地址 ...