JDBC操作数据库的学习(2)
在上一篇博客《JDBC操作数据库的学习(1)》中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本篇就在简单开发中如何对上一篇的例子进行“升级”,满足简单开发中对数据库的增删改查(CRUD)。
如果按照上一篇中的例子,那么我们在做增删改查的话将会出现每个方法都要获取连接,释放资源,代码会出现很大的重复性,因此我们应该将每个增删改查每个方法中可以复用的代码抽取出来,同时为了能切换数据库方便,也该将一些配置信息在配置文件中单独定义,而不是在程序中写死。
例1:
在数据库中的数据定义:
//创建一个库
create database jdbcdemo; //使用该库
use jdbcdemo; //创建一个user表
create table user(
id int primary key,
name varchar(40),
age int
);
创建工程,并编写好配置信息文件:
创建一个工程,将数据库驱动jar包导入,在【src】目录下新建一个database.properties文件:

在database.properties配置文件中的内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root
编写数据库工具类JdbcUtils
不管一个工程中的哪个方法中要操作数据库之前,都要先确保驱动管理器中有数据库的驱动,获取连接,释放资源,这些操作有些只要执行一次,有些要重复的被调用,因此使用一个工具类来封装是最适合不过的。
public class JdbcUtils {
private static Properties config = new Properties();
static{
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("database.properties");
try{
config.load(in);
Class.forName(config.getProperty("driver"));
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException {
String url = config.getProperty("url");
String username = config.getProperty("username");
String password = config.getProperty("password");
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
public static void release(Connection conn,Statement st,ResultSet rs) {
if(rs!=null) {
try{
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(st!=null) {
try{
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null) {
try{
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
在这个工具类中,因为从配置文件中加载数据库的信息和使用反射向驱动管理器中注册数据库的驱动在整个工程应用中只需要执行一次,因此使用静态代码块来编写这些功能。视同Property对象将保存数据库信息,以便在该工具类获取连接的方法getConnection方法中能为每次调用提供URL,用户名和密码信息。另外既然作为工具类,该类中的方法最好都是静态的。
可以看到如果在JdbcUtils工具类中发生异常,那么我是直接转型为ExceptionInInitializerError错误,因为数据库作为底层最关键的一个环节都出错了,那么这个应用不应该再执行,当然要抛出异常还是错误可以根据个人或情况选择。
这个工具类只是做了最简单的注册驱动器,获取连接和释放资源,实际开发时可以根据需要再往该工具类中添加其他实用的方法。
对数据库进行增删改查:
前面写好了工具类,那么我们在一些类中的方法要对数据库进行操作,那么就可以从工具类中先获取方法,再写好自己的业务逻辑操作后再使用工具类的方法进行资源释放。
public class Demo {
public void insert() throws SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection(); //获取连接
st = conn.createStatement();
String sql = "insert into user(id,name,age) value(1,'Ding',25)";
int num = st.executeUpdate(sql);
if(num>0) {
System.out.println("数据添加成功!");
}
}finally{
JdbcUtils.release(conn, st, rs); //释放资源
}
}
}
这里只在demo中演示了对数据库进行添加数据的操作,修改和删除只是在sql语句上有所不同,而如果是查询则会返回结果集ResultSet对象,在上一篇中的例1和例2都已经说明,这里不再叙述。在一般的WEB开发中,我们会将对数据库的增删改查放在DAO层进行。
本篇以对数据库的增删改查为例,主要在于描述如何创建一个工具类,并在该工具类中注册数据库驱动,编写实用的获取连接和释放资源的静态方法,这些都是在我看来比较有用的设计思想。
JDBC操作数据库的学习(2)的更多相关文章
- JDBC操作数据库的学习(1)
单单对数据库的操作,比如说MySQL,我们可以在命令行窗口中执行,但是一般是应用程序要操作数据库,因此我们应该在程序中的代码上体现对数据库的操作,那么使用程序应用如何操作数据库呢?那就要使用到数据库的 ...
- springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务
springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...
- JDBC操作数据库的三种方式比较
JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...
- Spark Streaming通过JDBC操作数据库
本文记录了学习使用Spark Streaming通过JDBC操作数据库的过程,源数据从Kafka中读取. Kafka从0.10版本提供了一种新的消费者API,和0.8不同,因此Spark Stream ...
- Java笔记(第七篇 JDBC操作数据库)
JDBC是连接数据库和java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.学习java语言,必须学习JDBC技术,因为JDBC技术实在java语言中被广泛使用的一种操作数据库 ...
- 用于JDBC操作数据库的公共类
/* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...
- JDBC操作数据库的基本步骤:
JDBC操作数据库的基本步骤: 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操 ...
- Spring入门(十五):使用Spring JDBC操作数据库
在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...
- JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
随机推荐
- Fundamental types
Fundamental types void type boolean type character types integer types Modifiers signedness size Pro ...
- 4.5 HOOK分发函数
4.5 HOOK分发函数 本节开始深入的探讨键盘的过滤与反过滤.有趣的是,无论是过滤还是反过 滤,其原理都是进行过滤.取胜的关键在于:谁将第一个得到信息. 黑客可能会通过修改一个已经存在的驱动对象(比 ...
- 一个库搞定各种分享--ShareSDK
ShareSDK是为iOS.Android.WindowsPhone提供社会功能的一个组件,开发者只需10分钟即可集成到自己的APP中,它不仅支持分享给QQ好友.微信好友.微信朋友圈.新浪微博.腾迅微 ...
- 基于JSP+SERVLET的新闻发布系统(三)
拖了这么久..今天把栏目管理还有新闻管理模块的也挂出来.. 栏目管理跟用户管理一样. 这里重点讲解新闻管理. 效果图如上: 1,可选择栏目类别,且栏目类别是动态生成的. 默认生成的文章是未审核状态的. ...
- OpenRisc-31-关于在设计具有DMA功能的ipcore时的虚实地址转换问题的分析与解决
引言 之前,我们在讨论基于ORPSoC的ipcore设计时提到过DMA的问题,当时我们实现DMA的功能时,访问的是local memory,并没有使用主存(即外部的SDRAM),使用的是本地的一块存储 ...
- PopupWindow 的showatlocation参数解释
showAtLocation(parent, gravity, x, y) 第一个参数指定PopupWindow的锚点view,即依附在哪个view上.第二个参数指定起始点第三个参数设置以起始点的右下 ...
- C++部分术语(Terms)
翻译自msdn,如有不妥当的地方,欢迎指正. 声明(Declaration):声明引入了一个名字以及其类型进入程序中,并没有定义一个相关的对象或者函数.然而,很多声明都作为定义使用. 定义(def ...
- HDOJ 1272 并查集 不相同父节点
判断两点:1.任何2点的父节点不能相同->否则会导致2点间有多条通路2.所有点只有1个集合 存在一个小坑,就是第一次输入 0 0 的时候,应该输出 Yes , 否则会WA MY AC Code ...
- Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件
原文 Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件 第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Win ...
- PredictionIO Open Source Machine Learning Server
PredictionIO Open Source Machine Learning Server Build Smarter Software with Machine Learning Predic ...