首页 / JAVA / 【Java】数据库编程
【Java】数据库编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Java】数据库编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8327字,纯文字阅读大概需要12分钟。
内容图文
Java中数据库编程是通过JDBC实现的。使用JDBC技术涉及三种不同的角色:Java官方,开发人员和数据库厂商。如下图所示:
Java官方提供JDBC接口,如:Connection,Statement和ResultSet等。
数据库厂商为了支持Java语言使用自己的数据库,他们根据这些接口提供了具体的实现类,这些具体的实现类称为JDBC Driver(JDBC驱动程序),例如Connection是数据库连接接口,如何能够高效地连接数据库或许只有数据库厂商自己清楚,因此它们提供的JDBC驱动程序是最高效的,当然针对某种数据库也可能有其他第三方JDBC驱动程序。
对于开发人员而言,JDBC提供了一致的API,开发人员不用关心实现接口的细节。
1.加载驱动程序,建立数据连接
在编程实现数据库连接时,JVM必须加载特定厂商提供的数据库驱动程序。使用Class.forName()方法实现驱动程序加载过程。
注意:需要先将驱动程序的.jar文件添加到项目中。
驱动程序加载成功就可以进行数据库连接了。建立数据库连接可以通过调用DriverManager类的getConnection()方法实现。该方法有几个如下的重载版本:
-
-
static Connection
getConnection(String?url)
尝试通过一个URL建立数据库连接。
static Connection
getConnection(String?url, Properties?info)
尝试通过一个URL建立数据库连接。一些连接参数(如user和password)可以按照键值对的形式放置到info中。
Properties是Hashtable的子类,它是一种Map结构。
static Connection
getConnection(String?url, String?user, String?password)
尝试通过一个URL建立数据库连接。指定数据库用户名和密码。
-
对于不同的数据库,厂商提供的驱动程序和连接的URL都不同,见下表。
建立MySQL数据库连接示例如下:
package databaseCode;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HelloWorld {
public static void main(String[] args) {
try {
//加载mysql驱动程序
Class.forName("com.mysql.jdbc.Driver");
System.out.println("驱动程序加载成功...");
} catch (ClassNotFoundException e) {
System.out.println("驱动程序加载失败...");
//退出
return;
}
//3306是数据库端口号,dbtest003是MySQL服务器中的数据库
String url="jdbc:mysql://localhost:3306/dbtest003";
String user="root";
String password="123456";
try(
Connection conn=DriverManager.getConnection(url,user,password)
){
System.out.println("数据库连接成功:"+conn);
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
Connection对象代表的数据库连接不能被JVM的垃圾收集器回收,在使用完连接后必须关闭(调用close()方法),否则连接会保持一段比较长的时间,直到超时。上面代码通过自动资源管理技术释放资源。
上述代码虽然可以成功建立连接,但控制台可能会出现警告:Establishing SSL connection without......这是由于现在的网络通信为了提高网络安全,都要求使用SSL(secure sockets layer,安全套接层)安全协议。但是由于各种原因,很多服务器并未使用SSL安全协议,特别是在学习和测试阶段可以不使用SSL安全协议。为此,需要修改url连接字符串:
"jdbc:mysql://localhost:3306/dbtest003?verifyServerCertificate=false&useSSL=false"
verifyServerCertificate设置为false表示不进行安全认证,useSSL设置为false表示不使用SSL进行网络通信。
有时候url字符串过长,会导致维护不方便,可以把这些参数对放置到Properties对象中。示例如下:
String url="jdbc:mysql://localhost:3306/dbtest003";
//创建Properties对象
Properties info=new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
info.setProperty("verifyServerCertificate","false");
info.setProperty("useSSL","false");
Connection conn=DriverManager.getConnection(url,info);
2.三个重要接口Connection,Statement,ResultSet
Connection接口:java.sql.Connection接口的实现对象代表与数据库的连接,也就是在Java程序和数据库之间建立连接。Connection接口中常用的方法:
-
-
Statement
createStatement()
创建一个
Statement
对象,用于将SQL语句发送到数据库。 -
PreparedStatement
prepareStatement(String?sql)
创建一个
PreparedStatement
对象(预编译的语句对象),用于将参数化的SQL语句发送到数据库。参数包含一个或多个问号"?"占位符。
-
CallableStatement
prepareCall(String?sql)
创建一个调用数据库存储过程的
CallableStatement
对象。void
close()
关闭到数据库的连接,在使用完连接后必须关闭,否则连接会保持一段比较长的时间,直到超时。
-
Statement接口:java.sql.Statement称为语句对象,它提供用于向数据库发出的SQL语句,并且给出访问结果。Connection接口提供了生成Statement的方法,一般情况下通过connection.createStatement()方法就可以得到Statement对象。有三种Statement接口:java.sql.Statement,java.sql.PreparedStatement和java.sql.CallableStatement。其中PreparedStatement继承Statement接口,CallableStatement继承PreparedStatement接口。Statement实现对象用于执行基本的SQL语句,PreparedStatement实现对象用于执行预编译的SQL语句,CallableStatement实现对象用于调用数据库中的存储过程。
注意:预编译SQL语句是在程序编译时一起进行编译,这样的语句在数据库中执行时不需要编译过程,直接执行SQL语句,所以速度很快。在预编译SQL语句时会有一些程序执行时才能确定的参数,这些参数采用"?"占位符,直到运行时再用实际参数替换。
Statement常用方法如下:
-
-
ResultSet
executeQuery(String?sql)
执行给定的SQL语句,该语句返回单个
ResultSet
对象。int
executeUpdate(String?sql)
执行给定的SQL语句,这可能是
INSERT
,UPDATE
,或DELETE
语句,或者不返回任何内容,如SQL DDL语句的SQL语句。
-
ResultSet接口:在Statement执行SQL语句时,如果是SELECT语句,则会返回结果集,结果集通过接口java.sql.ResultSet描述,它提供了逐行访问结果集的方法,通过该方法能够访问结果集中不同字段的内容。
3.案例:数据CRUD操作
对数据库表中数据可以进行4类操作:数据插入(Create),数据查询(Read),数据更新(Update)和数据删除(Delete),也即“增删查改”。
示例代码如下:
package databaseCode;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class CRUDSample {
//连接数据库url
static String url="jdbc:mysql://localhost:3306/dbtest003";
static String user="root";
static String password="123456";
//1.驱动程序加载
static {
try {
//加载mysql驱动程序
Class.forName("com.mysql.jdbc.Driver");
System.out.println("驱动程序加载成功...");
} catch (ClassNotFoundException e) {
System.out.println("驱动程序加载失败...");
//退出
}
}
public static void main(String[] args) {
//查询数据
read();
}
//数据查询操作 (有条件查询)
private static void read() {
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
//2.创建数据库连接
conn=DriverManager.getConnection(url,user,password);
//3.创建语句对象
pstmt=conn.prepareStatement("select name,userid from user where userid>? order by userid");
//4.绑定参数
pstmt.setInt(1, 0);
//5.执行查询
rs=pstmt.executeQuery();
//6.遍历结果集
while(rs.next())
{
System.out.printf("id:%d name:%s\n",rs.getInt(2),rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
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();
}
}
}
}
//查询最大的用户Id
private static int readMaxUserId() {
int maxId=0;
try (
//2.创建数据库连接
Connection conn=DriverManager.getConnection(url,user,password);
//3.创建语句对象
PreparedStatement pstmt=conn.prepareStatement("select max(userid) from user")
){
//4.绑定参数
pstmt.setInt(1, 0);
//5.执行查询
ResultSet rs=pstmt.executeQuery();
//6.遍历结果集
if(rs.next())
{
maxId=rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return maxId;
}
private static void create() {
try (
//2.创建数据库连接
Connection conn=DriverManager.getConnection(url,user,password);
//3.创建语句对象
PreparedStatement pstmt=conn.prepareStatement("insert into user(userid,name) values(?,?)")
){
//查询最大值
int maxId=readMaxUserId();
//4.绑定参数
pstmt.setInt(1, ++maxId);
pstmt.setString(2, "Tony"+maxId);
//5.执行修改(C,U,D)
int affectedRows=pstmt.executeUpdate();
System.out.printf("成功插入%d条数据。\n", affectedRows);
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void update() {
try (
//2.创建数据库连接
Connection conn=DriverManager.getConnection(url,user,password);
//3.创建语句对象
PreparedStatement pstmt=conn.prepareStatement("update user set name=? where userid>?")
){
//4.绑定参数
pstmt.setString(1, "Tom");
pstmt.setInt(2, 30);
//5.执行修改(C,U,D)
int affectedRows=pstmt.executeUpdate();
System.out.printf("成功更新%d条数据。\n", affectedRows);
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void delete() {
try (
//2.创建数据库连接
Connection conn=DriverManager.getConnection(url,user,password);
//3.创建语句对象
PreparedStatement pstmt=conn.prepareStatement("delete from user where userid=?")
){
//查询最大值
int maxId=readMaxUserId();
//4.绑定参数
pstmt.setInt(1, maxId);
//5.执行修改(C,U,D)
int affectedRows=pstmt.executeUpdate();
System.out.printf("成功删除%d条数据。\n", affectedRows);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
内容总结
以上是互联网集市为您收集整理的【Java】数据库编程全部内容,希望文章能够帮你解决【Java】数据库编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。