鉴于linux系统下安装oracle数据库过于麻烦,而相关的java连接mysql基本方法的参考文章过少且参差不齐,故本人查阅了一些书和网络资料写下此文章。

从数据库环境搭建、基本语法到封装工具类全过程,可作为参考。转载请注明来源。

Content:

  • 常用的JDBC API

  • 数据库环境的搭建

  • 建立数据库连接

  • 数据库访问优化

一. 常用的JDBC API

1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务。应用程序和数据库之间可以通过此类建立连接。常用的静态方法如下

  • static connection getConnection(String url, String user, String password)  -   获取指定URL的数据库连接
  • static Driver getDriver(String url)   -   返回能够打开url所制定的数据库的驱动程序

2. Connection接口 : 用于连接数据库。每个Connection对象代表一个数据库连接会话。一个应用程序可与多个数据库建立连接。常用的静态方法如下

  • void close()  -   断开连接,释放此Connection对象的数据库和JDBC资源
  • Statement createStatement()  -   创建一个Statement对象来将SQL语句发送到数据库
  • void commit()  -   用于提交SQL语句,确认从上一次提交/回滚以来进行的所有更改
  • boolean isClosed()  -   这个就不解释了
  • CallableStatement prepareCall(String sql)  -   创建一个CallableStatement对象来调用数据库存储过程
  • PreparedStatement prepareStatement(String sql)   -   创建一个PreparedStatement对象来将参数化的SQL语句发送到数据库
  • void rollback()  -   用于取消SQL语句,取消在当前事物中进行的所有更改

3. Statement接口 :Statement接口一般用于执行SQL语句。Statement接口的主要功能是将SQL语句传送给数据库,并返回SQL语句的执行结果。

  • boolean execute(String sql)  -   执行给定的SQL语句,该语句可能返回多个结果
  • ResultSet executeQuery(String sql)  -   执行给定的SQL语句,该语句返回单个ResultSet对象
  • int executeUpdate(String sql)  -   执行和给定SQL语句,该语句可能为INSERT、UPDATE或DELETE语句,或者不返回任何内容的SQL语句(如SQL DDL 语句)
  • Connection getConnection()  -   获取生成此Statement对象的Connection对象

4. ResultSet接口 :用于封装结果集对象,该对象包含访问查询结果的方法。 使用Statement中的executeQuery()方法可以返回有符合查询条件的记录。

  • boolean first()  -   将游标移动到结果集的第一行
  • boolean next()  -   将游标移动到结果集的下一行
  • boolean previous()  -   将游标移动到结果集的上一行
  • void close()  -   释放此ResultSet对象的数据库和JDBC资源

注: 以上仅是列举后面要用到的方法,更多方法请查询相关文档。

二. 数据库环境的搭建

  在ubuntu 17.10系统下安装并配置mysql(ubuntu系统下安装mysql非常简单,过程略),使用eclispe开发环境,需要下载并配置mysql的驱动jar包(可参考:http://blog.csdn.net/Kindle_code/article/details/49531977),使用MySQL Workbench图形化软件管理数据库,执行以下语句创建一个本地数据库

  1.创建数据库

create database CS;
use CS;
create table Userdetails(
id int primary key, -- 主键id
username varchar(50) not null, -- 用户名
password varchar(50) not null,
sex char(1) not null -- 性别,1:男,0:女
) insert into Userdetails(id,username,password,sex) values(1,'zhangsan','zs123',1);
insert into Userdetails(id,username,password,sex) values(2,'lisi','lisi123',1);
insert into Userdetails(id,username,password,sex) values(3,'wangwu','wangwu123',1);
insert into Userdetails(id,username,password,sex) values(4,'maliu','maliu123',1);
insert into Userdetails(id,username,password,sex) values(5,'lsy','lsy123',1);

  SQL语法请查阅相关文档,要注意 MSSQL 、Oracle、MySQL 这三个常见的数据库在语法上是有一定区别的

执行结果:

三. 建立数据库连接

  1.加载数据库驱动

Class.forName("com.mysql.jdbc.Driver");

  2.建立数据库连接

String url = "jdbc:mysql://localhost:3306/CS?useSSL=false"; //注意因为版本问题要添加后面的useSSL语句
String user = "root";
String password = "haha";
Connection conn = DriverManager.getConnection(url, user, password);

  3.创建Statement对象

  • createStatement()方法——用于创建一个基本的Statement对象;
  • prepareStatement(String sql)方法——根据参数化的SQL语句创建一个预编译的PreparedStatement对象;
  • prepareCall(String sql)方法——根据SQL语句来创建一个CallableStatement对象,用于调用数据库的存储过程.
Statement stmt = conn.createStatement();

  4.执行SQL语句并访问结果集

String sql = "SELECT id,username FROM Userdetails";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
System.out.println(rs.getString(1) + " " + rs.getString("username"));
}

当使用getXXX()方法访问结果集中的数据时,可通过列索引或列名来获取游标所指行中的列数据

如: getXXX(列索引)  / 如getString(...)等

getXXX("列名")

完整实例代码如下:

import java.sql.*;

public class ExecuteDemo
{
final static String url = "jdbc:mysql://localhost:3306/CS?useSSL=false";
final static String user = "root";
final static String password = "haha";
public static void main(String [] args)
{
try
{
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, user, password); System.out.println("连接数据库成功!");
Statement stmt = conn.createStatement();
String sql = "SELECT id,username FROM Userdetails";
ResultSet rs = stmt.executeQuery(sql);
System.out.println("查询成功!"); while(rs.next())
{
System.out.println(rs.getString(1) + " " + rs.getString("username"));
}
rs.close();
stmt.close();
conn.close();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
} } }

执行结果:

四. 数据库访问优化

  编写了一部分数据库访问和执行代码后能够发现一个问题:在访问数据库时,执行步骤都是相同的,不同的是每次执行SQL语句。因此,为了简化数据库访问操作、减少代码冗余、提高效率,需要将访问数据库时通用的基础代码进行封装,即程序员自己编写一个数据库访问工具类DBUtil,用于提供访问数据库时所用到的连接、查询、更新和关闭等操作的基本方法,其他类通过调用DBUtil工具类来实现数据库的访问。

  1. 编写属性文件

  为了便于后期维护,在编写DBUtil工具类之前,通常将连接数据库的参数信息保存在属性文件中。

  • 在项目的根目录下创建一个config子目录,并添加一个属性文件mysql.properties。该文件时以“键-值”对形式来保存连接mysql数据库的配置信息,内容格式如下:
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/CS?useSSL=false
user = root
pwd = q9a6z3

  为了读取属性文件中的配置信息,需要编写一个Config配置类,在该类中通过java.util.Properties类的get()方法来获取指定“键”所对应的“值”

Config.java

package util;
import java.io.FileInputStream;
import java.util.Properties;
public class Config
{
private static Properties p = null;
static
{
try
{
p = new Properties();
p.load(new FileInputStream("config/mysql.properties"));
}
catch(Exception e)
{
e.printStackTrace();
}
} public static String getValue(String key)
{
return p.get(key).toString();
}
}

  

  2. 编写DBUtil工具类

DBUtil.java

package db;
import java.sql.*;
import util.Config; public class DBUtil
{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//得到数据库连接
public Connection getConnection() throws ClassNotFoundException,
SQLException,InstantiationException,IllegalAccessException
{
String driver = Config.getValue("driver");
String url = Config.getValue("url");
String user = Config.getValue("user");
String pwd = Config.getValue("pwd");
try
{
Class.forName(driver);  //指定驱动程序
conn = DriverManager.getConnection(url,user,pwd);
return conn;
}
catch(Exception e)
{
throw new SQLException("驱动错误或链接失败!");
}
}

  //释放资源
public void closeAll()
{
if(rs != null)
{
try
{
rs.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
} if(pstmt != null)
{
try
{
pstmt.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
} if(conn != null)
{
try
{
conn.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
//执行SQL语句,可以进行查询
public ResultSet executeQuery(String preparedSql,String[] param)
{
try
{
pstmt = conn.prepareStatement(preparedSql);
if(param != null)
{
for(int i = 0; i < param.length; i++)
pstmt.setString(i+1, param[i]);
} rs = pstmt.executeQuery();
}
catch(SQLException e)
{
e.printStackTrace();
}
return rs;
}
//执行SQL语句,可以进行增、删、改的操作,不能执行查询
public int executeUpdate(String prepareSql,String [] param)
{
int num = 0; try
{
pstmt = conn.prepareStatement(prepareSql);
if(param != null)
{
for(int i = 0; i < param.length; i++)
pstmt.setString(i+1, param[i]);
}
num = pstmt.executeUpdate();
}
catch(SQLException e)
{
e.printStackTrace();
} return num;
}
}

  3.使用DBUtil工具类

import java.sql.ResultSet;
import db.DBUtil;
public class DBDemo
{
public static void main(String [] args)
{
String selectSql = "SELECT id,username,password,sex FROM Userdetails";
String insertSql = "INSERT INTO Userdetails(id,username,password,sex) VALUES(?,?,?,?)";
String updateSql = "UPDATE Userdetails SET password = ? WHERE username = ?";
String deleteSql = "DELETE FROM Userdetails WHERE username = ?";
//创建DBUtil对象
DBUtil db = new DBUtil(); try
{
db.getConnection(); //连接数据库
//查询并显示原来的数据
ResultSet rs = db.executeQuery(selectSql, null);
System.out.println("-----------------原来的数据----------------");
while(rs.next())
{
System.out.println("行 " + rs.getRow() + ":"
+ rs.getInt(1) + "\t"
+ rs.getString(2) + '\t'
+ rs.getString(3) + '\t'
+ (rs.getInt(4) == 1 ? "男" : "女"));
}
System.out.println("----------------------------------------"); //执行添加
int count = db.executeUpdate(insertSql, new String[] {"9","Rose","123456","0"});
System.out.println("添加" + count + "行"); //执行修改
count = db.executeUpdate(updateSql, new String[] {"zs321","zhangsan"});
System.out.println("修改" + count + "行"); //执行删除
count = db.executeUpdate(deleteSql, new String[] {"Rose"});
System.out.println("删除" + count + "行"); //查询并显示更新后的数据
rs = db.executeQuery(selectSql, null);
System.out.println("----------------更新后的数据------------------");
while(rs.next())
{
System.out.println("行 " + rs.getRow() + ":"
+ rs.getInt(1) + "\t"
+ rs.getString(2) + '\t'
+ rs.getString(3) + '\t'
+ (rs.getInt(4) == 1 ? "男" : "女"));
}
System.out.println("----------------------------------------");
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
db.closeAll();
} }
}

执行结果:

作者:SeanLiao

写于2018-1-26

【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类的更多相关文章

  1. java连接mysql的过程

    今天突然心血来潮,想要用java连接mysql,记得以前是在vs2010的环境下用C#连接sql sever,其实他们的方法都差不多. 现在就可以简单的介绍下java如何连接mysql 第一步,设计m ...

  2. JDBC Java 连接 MySQL 数据库

    MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 用于测试的 MySQL 数据库:game 查看数据库中的表 mysql ...

  3. jdbc——java连接sql server 过程

    首先要去下一个关于sql的驱动jar包,叫做sqljdbc4.jar 然后更新项目的build path,加入这个jar包 前几步有问题的看该博客 https://blog.csdn.net/qq24 ...

  4. Ubuntu jsp平台使用JDBC来连接MySQL数据库

    Ubuntu 7.04 搭建Ubuntu jsp平台开发环境MySQL+tomcat+apache+j2sdk1.6在所有安装开始前先在Terminal中输入 rpm -q -a查看是否安装过rpm ...

  5. Java连接MySQL数据库及简单操作代码

    1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...

  6. 转载:Java连接MySQL 数据库的正确操作流程

    转载网址:http://www.bitscn.com/pdb/mysql/201005/186551.html       以下的文章主要介绍的是Java连接MySQL 数据库(以MySQL数据库为例 ...

  7. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  8. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  9. java连接mysql

    Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件 ...

随机推荐

  1. 找回Git中丢失的Commit

    在使用Git的过程中,有时候会因为一些误操作,比如reset.rebase.merge等.特别是在Commit之后又执行了git reset --hard HEAD强制回滚本地记录以及文件到服务器版本 ...

  2. Intellij idea破解办法

    最开始的时候intellij用得是社区版,专业版是要钱的.但是社区版的功能确实弱了很多:比如Diagrams功能就没有,比如社区版不支持web项目,想起个tomcat跑个web项目都没法搞.于是,重新 ...

  3. ASP.NET Core学习之二 菜鸟踩坑

    对于像我这样没接触过core的人,坑还是比较多的,一些基础配置和以前差别很大,这里做下记录 一.Startup 1.注册服务 // This method gets called by the run ...

  4. Head First设计模式之迭代器模式

    一.定义 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示: 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代 ...

  5. git上传文件到github

     一.git之上传代码到github. 安装git,这个就不说了,很多帖子都有详细说明.  二.新建仓库,GitHub上的,首先申请账号.  三.本地选择地方新建本地仓库. 建完本地仓库文件夹,在本地 ...

  6. Java异常的正确使用姿势

    最近在项目代码中,遇见异常滥用的情形,会带来什么样的后果呢? 1. 代码可读性变差,业务逻辑难以理解 异常流与业务状态流混在一起,无法从接口协议层面理解业务代码,只能深入到方法(Method)内部才能 ...

  7. iOS学习——属性引用self.xx与_xx的区别

    在iOS开发过程中,我们用@proprety声明一个属性后,在代码中我们可以用self.xx与_xx来获取到这个属性.但是一直有一个疑惑,那就是这两个之间有什么区别呢?最初我一直觉得这两个之间没什么区 ...

  8. js 闭包的用法详解

    一.闭包 实现可重用的局部变量,且保护其不受污染的机制. 外层函数包裹受保护的变量和内层函数. 内层函数专门负责操作外层函数的局部变量. 将内层函数返回到外层函数外部,反复调用. 二.作用域 子函数会 ...

  9. Java学习笔记12(面向对象五:构造方法、this再探)

    在开发中,经常需要在创建对象的同时明确对象对的属性值, 比如一个Person对象创建时候就应该有age和name等属性 那么如何做到在创建对象的同时给对象的属性初始化值呢? 这里介绍构造方法: 1.构 ...

  10. Twisted使用和scrapy源码剖析

    1.Twisted是用Python实现的基于事件驱动的网络引擎框架. 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的 ...