JDBC - 基础篇

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBC - 基础篇

image.pngimage.pngimage.png

Ps:连接本地简写:jdbc:mysql:///jdbc。image.pngimage.pngimage.png

Ps:ResultSet光标最初位于结果集的第一行的前面,即空数据位置。image.pngimage.pngPs:.close(); 代表被释放掉了,但未必马上被垃圾回收掉,所以最后加个 conn=null; 确保尽可能早的被回收,做到真正意义上的释放。image.pngimage.pngimage.png

Ps:这种方式不推荐,因为当项目发布到Web服务器中时,并没有src目录。image.png

packagecom.imooc.jdbc.demo2;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.Statement;
importorg.junit.Test;
importcom.imooc.jdbc.utils.JDBCUtils;
/*** 演示JDBC的注入的漏洞* @author jt**/publicclassJDBCDemo4 {
@Test/*** 测试SQL注入漏洞的方法*/publicvoiddemo1(){
booleanflag=JDBCDemo4.login2("aaa' or '1=1", "1fsdsdfsdf");
//      boolean flag = JDBCDemo4.login2("aaa' -- ", "1fsdsdfsdf"); // “--” 把后面的sql代码注释掉if(flag==true){
System.out.println("登录成功!");
        }else{
System.out.println("登录失败!");
        }
    }
/*** 避免SQL注入漏洞的方法*/publicstaticbooleanlogin2(Stringusername,Stringpassword){
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
booleanflag=false;
try{
// 获得连接:conn=JDBCUtils.getConnection();
// 编写SQL:Stringsql="select * from user where username = ? and password = ?";
// 预处理SQL:pstmt=conn.prepareStatement(sql);
// 设置参数:pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行SQL:rs=pstmt.executeQuery();
// 判断结果街if(rs.next()){
flag=true;
            }else{
flag=false;
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(rs, pstmt, conn);
        }
returnflag;
    }
/*** 产生SQL注入漏洞的方法* @param username* @param password* @return*/publicstaticbooleanlogin(Stringusername,Stringpassword){
Connectionconn=null;
Statementstmt=null;
ResultSetrs=null;
booleanflag=false;
try{
conn=JDBCUtils.getConnection();
// 创建执行SQL语句的对象:stmt=conn.createStatement();
// 编写SQL:Stringsql="select * from user where username = '"+username+"' and password = '"+password+"'";
// 执行SQL:rs=stmt.executeQuery(sql);
// 判断结果集中是否有数据。if(rs.next()){
flag=true;
            }else{
flag=false;
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(rs, stmt, conn);
        }
returnflag;
    }
}

image.pngimage.png

packagecom.imooc.jdbc.demo2;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importorg.junit.Test;
importcom.imooc.jdbc.utils.JDBCUtils;
/*** PreparedStatement的使用* @author jt**/publicclassJDBCDemo5 {
@Test/*** 查询一条记录*/publicvoiddemo5(){
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
// 获得连接:conn=JDBCUtils.getConnection();
// 编写SQL:Stringsql="select * from user where uid = ?";
// 预编译SQL:pstmt=conn.prepareStatement(sql);
// 设置参数:pstmt.setObject(1, 3);
// 执行SQL:rs=pstmt.executeQuery();
// 判断结果集:if(rs.next()){
System.out.println(rs.getInt("uid")+"  "+rs.getString("username")+"  "+rs.getString("password")+"  "+rs.getString("name"));
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(rs, pstmt, conn);
        }
    }
@Test/*** 查询所有数据*/publicvoiddemo4(){
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
// 获得连接:conn=JDBCUtils.getConnection();
// 编写SQL:Stringsql="select * from user";
// 预编译SQL:pstmt=conn.prepareStatement(sql);
// 设置参数// 执行SQL:rs=pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("uid")+"  "+rs.getString("username")+"  "+rs.getString("password")+"  "+rs.getString("name"));
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(rs, pstmt, conn);
        }
    }
@Test/*** 删除数据*/publicvoiddemo3(){
Connectionconn=null;
PreparedStatementpstmt=null;
try{
// 获得连接:conn=JDBCUtils.getConnection();
// 编写SQL:Stringsql="delete from user where uid = ?";
// 预编译SQL:pstmt=conn.prepareStatement(sql);
// 设置参数:pstmt.setInt(1, 6);
// 执行SQL:intnum=pstmt.executeUpdate();
if(num>0){
System.out.println("删除成功!");
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(pstmt, conn);
        }
    }
@Test/*** 修改数据*/publicvoiddemo2(){
Connectionconn=null;
PreparedStatementpstmt=null;
try{
// 获得连接:conn=JDBCUtils.getConnection();
// 编写SQL:Stringsql="update user set username = ?,password = ?,name = ? where uid = ?";
// 预编译SQL:pstmt=conn.prepareStatement(sql);
// 设置参数:pstmt.setString(1, "www");
pstmt.setString(2, "123456");
pstmt.setString(3, "张六");
pstmt.setInt(4, 6);
// 执行SQL:intnum=pstmt.executeUpdate();
if(num>0){
System.out.println("修改成功!");
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(pstmt, conn);
        }
    }
@Test/*** 保存数据*/publicvoiddemo1(){
Connectionconn=null;
PreparedStatementpstmt=null;
try{
// 获得连接:conn=JDBCUtils.getConnection();
// 编写SQL:Stringsql="insert into user values (null,?,?,?)";
// 预处理SQL:pstmt=conn.prepareStatement(sql);
// 设置参数的值:pstmt.setString(1, "qqq");
pstmt.setString(2, "123");
pstmt.setString(3, "张武");
// 执行SQL:intnum=pstmt.executeUpdate();
if(num>0){
System.out.println("保存成功!");
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
// 释放资源JDBCUtils.release(pstmt, conn);
        }
    }
}

image.pngimage.pngimage.pngimage.png

packagecom.imooc.jdbc.demo3;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importorg.junit.Test;
importcom.imooc.jdbc.utils.JDBCUtils;
importcom.imooc.jdbc.utils.JDBCUtils2;
importcom.mchange.v2.c3p0.ComboPooledDataSource;
/*** 连接池的测试类* @author jt**/publicclassDataSourceDemo1 {
@Test/*** 使用配置文件的方式*/publicvoiddemo2(){
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
// 获得连接:// ComboPooledDataSource dataSource = new ComboPooledDataSource();// 获得连接:// conn = dataSource.getConnection();conn=JDBCUtils2.getConnection();
// 编写Sql:Stringsql="select * from user";
// 预编译SQL:pstmt=conn.prepareStatement(sql);
// 设置参数// 执行SQL:rs=pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils2.release(rs, pstmt, conn);
        }
    }
@Test/*** 手动设置连接池*/publicvoiddemo1(){
// 获得连接:Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
// 创建连接池:ComboPooledDataSourcedataSource=newComboPooledDataSource();
// 设置连接池的参数:dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
dataSource.setUser("root");
dataSource.setPassword("abc");
dataSource.setMaxPoolSize(20);
dataSource.setInitialPoolSize(3);
// 获得连接:conn=dataSource.getConnection();
// 编写Sql:Stringsql="select * from user";
// 预编译SQL:pstmt=conn.prepareStatement(sql);
// 设置参数// 执行SQL:rs=pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
            }
        }catch(Exceptione){
e.printStackTrace();
        }finally{
JDBCUtils.release(rs, pstmt, conn);
        }
    }
}

公共代码块:

// 针对非连接池packagecom.imooc.jdbc.utils;
importjava.io.IOException;
importjava.io.InputStream;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.util.Properties;
/*** JDBC的工具类* @author jt**/publicclassJDBCUtils {
privatestaticfinalStringdriverClass;
privatestaticfinalStringurl;
privatestaticfinalStringusername;
privatestaticfinalStringpassword;
static{
// 加载属性文件并解析:Propertiesprops=newProperties();
// 如何获得属性文件的输入流?// 通常情况下使用类的加载器的方式进行获取:InputStreamis=JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
props.load(is);
        } catch (IOExceptione) {
e.printStackTrace();
        }
driverClass=props.getProperty("driverClass");
url=props.getProperty("url");
username=props.getProperty("username");
password=props.getProperty("password");
    }
/*** 注册驱动的方法* @throws ClassNotFoundException */publicstaticvoidloadDriver() throwsClassNotFoundException{
Class.forName(driverClass);
    }
/*** 获得连接的方法:* @throws SQLException */publicstaticConnectiongetConnection() throwsException{
loadDriver();
Connectionconn=DriverManager.getConnection(url, username, password);
returnconn;
    }
/*** 资源释放*/publicstaticvoidrelease(Statementstmt,Connectionconn){
if(stmt!=null){
try {
stmt.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
stmt=null;
        }
if(conn!=null){
try {
conn.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
conn=null;
        }
    }
publicstaticvoidrelease(ResultSetrs,Statementstmt,Connectionconn){
if(rs!=null){
try {
rs.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
rs=null;
        }
if(stmt!=null){
try {
stmt.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
stmt=null;
        }
if(conn!=null){
try {
conn.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
conn=null;
        }
    }
}
// 针对连接池packagecom.imooc.jdbc.utils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importcom.mchange.v2.c3p0.ComboPooledDataSource;
/*** JDBC的工具类* @author jt**/publicclassJDBCUtils2 {
privatestaticfinalComboPooledDataSourcedataSource=newComboPooledDataSource();
/*** 获得连接的方法:* @throws SQLException */publicstaticConnectiongetConnection() throwsException{
Connectionconn=dataSource.getConnection();
returnconn;
    }
/*** 资源释放*/publicstaticvoidrelease(Statementstmt,Connectionconn){
if(stmt!=null){
try {
stmt.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
stmt=null;
        }
if(conn!=null){
try {
conn.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
conn=null;
        }
    }
publicstaticvoidrelease(ResultSetrs,Statementstmt,Connectionconn){
if(rs!=null){
try {
rs.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
rs=null;
        }
if(stmt!=null){
try {
stmt.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
stmt=null;
        }
if(conn!=null){
try {
conn.close();
            } catch (SQLExceptione) {
e.printStackTrace();
            }
conn=null;
        }
    }
}
<?xmlversion="1.0"encoding="UTF-8"?><c3p0-config><default-config><propertyname="driverClass">com.mysql.jdbc.Driver</property><propertyname="jdbcUrl">jdbc:mysql:///jdbctest</property><propertyname="user">root</property><propertyname="password">abc</property><propertyname="initialPoolSize">5</property><propertyname="maxPoolSize">20</property></default-config></c3p0-config>
driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql:///jdbctestusername=rootpassword=abc
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL Java 关系型数据库
JDBC技术文章
JDBC技术文章
|
9月前
|
Java 数据库连接 数据库
JDBC知识【JDBC练习】第五章
JDBC知识【JDBC练习】第五章
|
11月前
|
存储 SQL Java
jdbc概述
jdbc概述
69 0
|
存储 SQL Java
JDBC概述
JDBC概述
67 0
|
SQL 网络协议 Oracle
【JDBC】JDBC快速入门
1.概述 JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。 使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。 例如,我们在Java代码中如果要访问MySQL,那么必须编写代码操作JDBC接口。注意到JDBC接口是Java标准库自带的,所以可以直接编译。而具体的JDBC驱动是由数据库厂商提供的,例如,MySQL的JDBC驱动由Oracle提供。因此,访问某个具体的数据库,我们只需要引入该厂商提供的JDBC驱动,就可以通过
153 0
【JDBC】JDBC快速入门
|
SQL Java 关系型数据库
JDBC框架
JDBC框架
95 0
JDBC框架
|
SQL 存储 安全
JDBC入门详解
JDBC入门详解
130 0
JDBC入门详解
|
SQL Java 数据库连接
JDBC(一) 如何使用JDBC进行编程?
JDBC常见操作总结(详略分明)
|
SQL Oracle druid
学习JDBC需要掌握些什么?
不知道大家在工作中还有没有写过JDBC,我在大三去过一家小公司实习,里边用的就是JDBC,只不过它封装了几个工具类。写代码的时候还是能感受到「这是真真实实的JDBC代码」
423 0
学习JDBC需要掌握些什么?
|
SQL Java 关系型数据库
JDBC入门
JDBC连接数据库
160 1