jdbc连接MySQL数据库+简单实例(普通JDBC方法实现和连接池方式实现)
jdbc连接数据库
总结内容
1. 基本概念
jdbc的概念
- sun公司提供操作数据库的一套接口(规范、标准)。
2. 数据库连接
数据库的连接
- 代码如下
// 贾琏欲执事(口诀)
// 定义一些需要使用的参数
String sql = "delete from Student where id = ? ";
String url = "jdbc:mysql://localhost:3306/db_test";
String username = "root";
String password = "admin";
// 加载数据库驱动(贾)
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接(琏)
Connection conn = DriverManager.getConnection(url, username, password);
// 预编译sql语句(欲)
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
// 执行sql语句(执)
ps.executeUpdate();
// 释放资源(事)
statement.close();
conn.close();
- 数据库CRUD(增删改查)操作
1)在连接数据库之后我们需要根据需求对数据进行CRUD(增删改查)操作,一般我们会把CRUD操作放入DAO层中;
DAO层思想
DAO(Data Access Object)数据访问对象
1)一个面向对象的数据库接口。也就是与数据库打交道,夹在业务逻辑与数据库资源中间,将所有对数据源的访问操作封装在一个公共API中。程序书写就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法;DAO中的主要操作
1)增删改查(CRUD);
重构设计
重构原因
1)由于我们每次进行CRUD操作时都要创建数据库连接,以及释放资源等操作,这样会有大量冗余的代码,所以我们需要对重复操作的代码进行抽取;代码如下:
public class JDBCUtil {
/**
* @description: 使用单例模式建立工具类
*/
private static JDBCUtil jdbc = new JDBCUtil();
private JDBCUtil() {
}
public static JDBCUtil getInstance() {
return jdbc;
}
static Properties p = null;
static{
// 加载 db.properties 配置文件
p = new Properties();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties");
try {
p.load(in);
} catch (IOException e) {
e.printStackTrace();
}
try {
Class.forName(p.getProperty("jdbc.driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* @description: 获取数据库连接
*/
public Connection getCon() throws IOException, ClassNotFoundException, SQLException {
return DriverManager.getConnection(p.getProperty("jdbc.url"), p.getProperty("jdbc.username"), p.getProperty("jdbc.password"));
}
/**
* @description: 关闭资源
*/
public void release(PreparedStatement ps, Connection conn, ResultSet rs) {
// 释放资源
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// DML(增删改)操作的时候不需要使用ResultSet,只需要释放2个资源即可
public void release(PreparedStatement ps, Connection conn) {
// 重载调用前面的方法
release(ps, conn, null);
}
}
3. 事务
概念
- 事务(Transaction,简写为tx)在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换成另一种状态。
事务的ACID属性
原子性(Atomicity)
1)原子在化学中是最小单位,不可以再分割了。原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生;一致性(Consistency)
1)包装数据的完整性。事务必须使数据库从一个一致性状态转变成另一个一致性状态(数据不被破坏);
2)例如:你从银行取钱,你取多少,你的账户就会被扣除多少,如果你账户余额不足,也就是取钱失败,账户余额会保持不变。数据库的数据一直处于一个一致性的状态,数据没有被破坏;隔离性(Isolation)
1)事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;持久性(Durability)
1)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
事务的操作
事务操作步骤
1)先定义开始一个事务,然后对数据做修改操作;
2)执行过程中,如果没有问题就提交(Commit)事务,此时的修改将永久的保存下来;
3)如果执行过程中有问题(异常),回滚事务(rollback),数据库管理系统将放弃你开始事务后的所有修改而会带开始事务时的状态。事务操作模板
try {
// 取消事务的自动提交机制,设置为手动提交
connection对象.setAutoCommit(false);
// 操作1
// 操作2
// ......
// 手动提交事务
connection对象.commit();
} catch(Exception e) {
// 处理异常
// 回滚事务
connection对象.rollback();
}
- 事务操作原理
1)connection改为手动提交之后就被加锁了,必须使用commit()或者rollback()释放锁;
2)rollback() 回滚并不是回滚数据,因为数据并没有提交,他的作用是释放connection的锁,让资源能够正常关闭。
4. 连接池
为什么要使用连接池
- 普通JDBC连接数据库的缺点
1)因为我们每次对数据库进行访问时都会先建立一个连接,访问后又会关闭该资源,而普通的JDBC数据库连接使用DriverManager获取,每次建立连接都要把COnnection加载到内存中,再验证用户名和密码(得话费0.05s~1s的时间),数据库的连接是比较昂贵的(创建的成本较大)。这样造成了资源和时间的大量浪费,所以我们使用连接池来连接数据库;
2)每次建立连接都需要关闭,如果出现异常没能及时关闭会出现数据库系统的内存泄漏,导致数据库系统重启;
3)每次建立连接又关闭的方式会让不能控制数据库的连接数,会导致系统资源被无限制的分配出去,如果连接过多也可能导致数据库内存泄漏,最终导致服务器崩溃。 - 解决方案
1)解决方案就是连接池的运用,在系统初始化的时候,主动去建立足够多的连接对象,组成一个连接池,使用的时候,我们只需要去连接池中取出,用完后不再是关闭连接,而是归还即可。
连接池分类
1)DBCP:Spring 框架推荐的;
2)Hibernate:Hibernate框架推荐的(已经被慢慢淘汰了);
3)Druid:阿里巴巴的连接池(号称Java语言中性能最好的连接池)。
使用连接池和不使用连接池的区别
获取 Connection 对象
1)没有使用连接池:Connection conn = DriverManager.getConnection(url,username,passwrod);
2)使用了连接池:Connection conn = DataSource对象.getConnection();释放 Connection 对象
1)没有使用连接池:直接和数据库服务器断开连接;
2)使用了连接池:把 Connection 对象返回到连接池中,并没有与数据库服务器断开连接;
Druid连接池
Druid的使用
druid下载地址
1)是阿里巴巴研发出来的号称Java语言领域性能最好的连接池;
2)wiki地址:http://github.com/alibaba/druid/wikidruid的使用
1)使用与 DBCP 类似
2)支持数据库 MySQL,Oracle,DB2,MS Server;
3)支持对配置文件的密码加密。
4)需要 jar:druid-版本号.jar数据库配置文件(db.properties)
// 这里的 key 必须要和 DruidDataSource 中对应的属性名一致
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web_test02?characterEncoding=UTF-8&serverTimezone=GMT%2b8:00&useSSL=false
username=数据库的用户名
password=数据库密码
- Druid工具类
1)代码:
public class DruidUtil {
/**
* 创建单例模式
*/
private DruidUtil() {
}
private static DruidUtil druidUtil = new DruidUtil();
public static DruidUtil getInstance() {
return druidUtil;
}
/**
* 使用工厂类获取数据库连接池
*/
static Properties ps = new Properties();
static DataSource dataSource = null;
static {
try {
// 加载 db.properties 配置文件
ps.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
dataSource = DruidDataSourceFactory.createDataSource(ps);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
*/
public Connection getCon() throws SQLException {
return dataSource.getConnection();
}
/**
* 释放资源
*/
public void close(Connection conn, PreparedStatement ps, ResultSet rs) {
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();
}
}
}
public void close(Connection conn, PreparedStatement ps){
close(conn, ps, null);
}
}
2)调用
// 获取连接对象
Connection conn = DruidUtil.getInstance().getCon();
总结
以上就是 jdbc 连接数据库的总结了,代码仅供参考,欢迎讨论交流。
jdbc连接MySQL数据库+简单实例(普通JDBC方法实现和连接池方式实现)的更多相关文章
- Java连接MySQL数据库增删改查通用方法
版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...
- java web 程序---jsp连接mysql数据库的实例基础+表格显示
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="g ...
- JDBC课程1-实现Driver接口连接mysql数据库、通用的数据库连接方法(使用文件jdbc.properties)
package day_18; import jdk.internal.util.xml.impl.Input; import org.junit.Test; import java.io.Input ...
- python连接mysql数据库简单例子
今天用pyhton2连接本地的mysql数据库,总的来说比较简单,但还是遇到一些小问题 代码如下: # -*- coding: utf-8 -*- import os import MySQLdb i ...
- ThinkPHP中连接mysql数据库的四种实用和通用的连接方法
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库适配器来处理.目前的数 ...
- JAVA中JDBC连接Mysql数据库简单测试
一.引用库 maven库:mysql:mysql-connector-java:6.0.6 二.SDK环境 JAVA JDK10 三.测试代码 package com.mysql.mysqlconne ...
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...
- JDBC连接MySQL数据库及示例
JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一 ...
- 通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中
1.安装所需软件 ①安装java和tomcat,建立JSP网页最基础的软件②安装MySQL数据库(下载地址:https://www.mysql.com/)③安装Navicat Premium来查看数据 ...
- python3.4怎么连接mysql pymysql连接mysql数据库
本文介绍了python3 4连接mysql数据库的方法,在python3 4中使用原来python2 7的mysqldb已不能连接mysql数据库了,可以使用pymysql. 在python3.4 ...
随机推荐
- MATLAB菜鸟入门笔记【作图章】
1.函数标签[legend] http://blog.csdn.net/wangcj625/article/details/6287735/
- tp6微信公众号开发者模式基础消息
官方文档 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages ...
- [SniperOJ](web) Inject again 注入 过滤左右括号 order by
0x00 题目概述 题目地址:http://web2.sniperoj.cn:10004/ 拿到题,尝试注入,发现有过滤. 进行fuzz,发现过滤了 左右括号,分号,等号 ,还有一些查询关键字 . 在 ...
- Go语言- import 导入包的语法
一 包的导入语法 在go语言中一个包(文件夹)中可以包含多个 go 文件,每一个文件通过文件第一行的 package 来指明自己所在的包,原则上应该与自己所在的文件夹同名,但也可以指定为其他名称,但同 ...
- 使用VS Code编译Marlin固件
参考:https://marlinfw.org/docs/basics/install_platformio_vscode.html 前言 在阅读本文之前,您应该已经阅读了使用 PlatformIO ...
- 一个lseek引起的思考
先看一段代码: int find_value(int fd) { int ret; char buff[8] = ""; struct timeval st,ed; long lo ...
- 通过Kuberneters Goat学习K8S安全(上)
实验环境:https://katacoda.com/madhuakula/scenarios/kubernetes-goat 0x1.敏感信息泄露利用 第一关是代码泄露利用,打开网站后显示: 告诉我们 ...
- JDBC中大数据量的分页解决方法?
最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容. sql语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql: oracle: selec ...
- 描述一下 JVM 加载 class 文件的原理机制?
JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的 类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件 中的类. 由于 Java 的 ...
- Spring源码分析笔记--AOP
核心类&方法 BeanDefinition Bean的定义信息,封装bean的基本信息,从中可以获取类名.是否是单例.是否被注入到其他bean中.是否懒加载.bean依赖的bean的名称等. ...