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对表进行增.删.改.查操作_ ...
随机推荐
- CentOS Linux使用crontab运行定时任务详解
参考博文: (总结)CentOS Linux使用crontab运行定时任务详解
- Python 2.7 学习笔记 模块和包
我们来考虑下如下几种场景: 1.编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中.但如果程序功能比较多,可能需要多个python文件来组织源代码.而这些文件之间的代码 ...
- 转:python中函数curry化
1 柯里化(Currying) 一个函数有多个参数,我们希望能固定其中几个参数的值. from functools import partial def foo(a,b,c): return a+b+ ...
- bad interpreter: No such file or directory解决
执行shell脚本时出现bad interpreter: No such file or directory错误, 一般是因为linux无法识别出Windows的DOS格式,此时只需将文件格式转换成u ...
- 基于visual Studio2013解决算法导论之013基数排序
题目 基数排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...
- vnc server配置、启动、重启与连接,图形管理linux系统
环境:RedHat Linux 5企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...
- WTL---WxWidget---MFC 何去何从
C++程序员打交道最多的就是MFC了,这个我不想多说,说来都是泪(C#年年更新,C++十年才出了一个featurePack还不是很好用) 现在另外两支队伍越来越庞大(所谓穷则思变,呵呵),一是WTL, ...
- mailcore -- Mail port
以163为例的各个MailserverSSL协议port号和非SSL协议port号
- Ganglia 权威指南-安装Ganglia过程
转自于:http://blog.csdn.net/xxd851116/article/details/21527055 http://www.dataguru.cn/article-3816-1.ht ...
- sql2008r2局域网复制订阅实操
10.129.186.37 本机 10.129.186.95 服务器 局域网环境 复制类型:事务复制 注意点:要复制的表,必须有主键,否则不可选复制表. 要点1,局域网尝试用共享的方式保存快照文件夹, ...