一篇解决JDBC编程(idea版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

自学习完Mysql后,接下来我们学习JDBC,即使用java代码连接数据库,并对其进行简单的增删改查!!


一、JDBC是什么?

示例:JDBC(Java DataBase Connectivity)它由一组用Java语言编写的类和接口组成,是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。

二、使用步骤

1.1.注册驱动

首先我们将下载好的JDBC驱动导入IDEA
在这里插入图片描述
在这里插入图片描述
下载完成后,解压,
在这里插入图片描述
注意:笔者这里下载了5版本和8版本的驱动,您可以根据自己的Mysql版本下载一个即可!!

select version();//登入Mysql后输入可以查看自己的Mysql版本号

打开IDEA,按Ctrl+Alt+Shift+S
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
准备工作之后
我们便可以开始写JAVA代码了!!

注册驱动共有两种方法

方式一:
	Driver driver = new com.mysql.jdbc.Driver();//注意是jdbc驱动包的Driver()方法
	DriverManager.registerDriver(driver);

方式二:通过映射的类加载原理


try {
        Class.forName("com.mysql.jdbc.Driver");		
        } catch (ClassNotFoundException e) { 				
            e.printStackTrace();
        }

注意:Class.forName需要捕获ClassNotFoundException异常.

2.获取链接对象

首先我们需要准备url,user,password,(注意都是字符串类型),然后使用DriverManager.getConnection(url, user, password)方法
url格式:jdbc:mysql://IP地址:数据库的端口号/数据库名称
user :填写mysql的用户名
password:对应的密码

代码如下(示例):

//getConnection方法也需要捕获SQLException异常。
try{
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gzpowernode", "root", "123456");}
catch (SQLException e) {							
	            e.printStackTrace();

此时可能会有一个错误但时不影响程序的运行:
在这里插入图片描述
在这里插入图片描述
解决方案:在URL最后面添加:?&useSSL=false这行代码

try{
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/gzpowernode?&useSSL=false", "root", "123456");}
catch (SQLException e) {							
	            e.printStackTrace();

之后运行便不会报此错误

3.获取数据库操作对象

方式一:使用Statement接口

3.1,创建Statement对象(可以进行SQL注入)

 Statement stmt = conn.createStatement();

3.2,执行SQL语句

3.2.1,查询语句

注意executeQuery()方法返回类型为ResultSet我们后面会在处理查询结果集讲到

String sql = "select * from 表名";
ResultSet rs = stmt.executeQuery(sql);
3.2.2 ,delete update insert 语句

注意:executeUpdate()方法的返回值类型为int,是专门用来执行delete update insert ,这三条DQL语句的。

String sql1 = "delete from 表名 where 条件 ";
String sql2 = "update 表名 set 字段1 = 值,...where 条件";
String sql3 = "insert into 表名(字段1,字段2,...) values(对应的值1,值2,...),((对应的值1,值2,...),...)";
int count = stmt.executeUpdate(sql);//count为该SQL语句影响的记录条数

方式二:使用PreparedStatement接口,PreparedStatement是SQL语句的预处理接口(解决SQL注入的重要方式)
注意PreparedStatement接口继承Statement接口

3.3,创建PreparedStatement对象,并预处理SQL语句

3.3.1,查询语句

1.创建需要预处理的SQL语句:

String sql = "select 字段,字段 from 表名 where name=? and password =?";

注意?为占位符,
2.创建 PreparedStatement 对象并预处理SQL语句:
注意:prepareStatement()方法抛出SQLException异常

try{
 PreparedStatement ps = conn.prepareStatement(sql);}
catch (SQLException e) {							
	            e.printStackTrace();

3.执行SQL语句:
准备工作:
赋值,常用方法:
setInt(int 问号的位置,int 设置的值)
setString(int 问号的位置,String 设置的值)
setDouble(int 问号的位置,Double设置的值)
注意:JDBC中问号的位置从1开始!!!
例子:

			ps.setString(1, "小李");
            ps.setInt(2, 123456);

执行SQL语句:executeQuery()方法抛出SQLException异常

			try{
			rs = ps.executeQuery();//注意此处不用再填sql}
			catch (SQLException e) {							
	            e.printStackTrace();

完整写法:

try{
	String sql = "select 字段,字段 from 表名 where name=? and password =?"
 	PreparedStatement ps = conn.prepareStatement(sql);
 	            ps.setString(1, "小李");
           	 	ps.setInt(2, 123456);
      ResultSet rs = ps.executeQuery();
           	 	}
catch (SQLException e) {							
	            e.printStackTrace();

3.3.2 delete update insert 语句

与上面步骤类似,只需将executeQuery()方法改成executeUpdate(),适当的写?即可
1.创建需要预处理的SQL语句:

String sql1 = "delete from 表名 where 字段 = ? ";
String sql2 = "update 表名 set 字段 = ?,...where 字段 = ?";
String sql3 = "insert into 表名(?,?,...) values(对应的?,?,...),((?,?,...),...)";

2.创建 PreparedStatement 对象并预处理SQL语句:

try{
 PreparedStatement ps = conn.prepareStatement(sql);}
catch (SQLException e) {							
	            e.printStackTrace();

3.执行SQL语句:
准备工作:
赋值
例子:

			ps.setString(1, "小李");
            ps.setInt(2, 123456);

执行SQL语句:executeUpdate()方法抛出SQLException异常

			try{
			rs = ps.executeUpdate();//注意此处不用再填sql}
			catch (SQLException e) {							
	            e.printStackTrace();

4.处理查询结果集

执行查询语句,并把结果集返回给集合ResultSet

4.1创建ResultSet对象接收查询结果集合(executeQuery()方法的返回值)

ResultSet rs = stmt.executeQuery(sql);或者
ResultSet rs = ps.executeQuery();

4.2,遍历输出查询结果集合

相关常用方法:
getString(数字或者字段名字)
getInt(数字或者字段名字)
getDouble(数字或者字段名字)
boolean next(),使用该方法让指针指向记录的下一行,(最开始指向字段的名字),下一行有数据返回true,没有返回false.
例如查询:select ename,empno,sal from emp

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
try{
		Class.forName(driver);
        	conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
	String sql ="select ename,empno,sal from emp";
	 rs = stmt.executeQuery(sql);
	while (rs.next()) {
                String ename = rs.getString("ename");//注意括号内填写查询后返回的表的字段的名字,即:使用别名写别名
                int empno = rs.getInt("empno");//括号内也可以填写数字,数字顺序对应查询结果中的字段顺序(数字从1开始),但是不建议这样写
                Double sal = rs.getDouble("sal");
                System.out.println(ename + "," + empno + "," + sal);

  					 }
   }catch(Exception e){//直接抛出最大异常
   		e.printStackTrace();
   }

查询结果:
在这里插入图片描述

5,关闭资源

为了确保资源一定被关闭,关闭资源的代码填写到finally代码块中

5.1,关闭顺序

1.先关闭查询结果集对象(ResultSet rs)
2.关闭数据库操作对象(Statement stmt) or (PreparedStatement ps)
3.关闭连接对象(Connetion conn)

5.2

例子:

finally {
            //6.释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("查询结果集对象未关闭");
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("数据库操作对象未关闭");
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("连接对象未关闭");
                }
            }
        }

6.事务

JDBC默认为自动提交
我们想要JDBC程序实现事务(同时成功或者同时失败)就必须关闭自动提交
步骤:
Connection conn =…;
1.在获取连接对象之后执行conn.setAutoCommit(Boolean autoCommit)方法,autoCommit = true为自动提交(默认值为true),autoCommit = false 为关闭自动提交
2.在执行完操作后执行conn.commit()方法提交,结束事务
3.防止事务失败造成数据库损坏,在catch代码块中执行conn.rollback()

try{
	Connection conn = ....
	conn.setAutoCommit(false);//关闭自动提交,开启事务
	conn.commit();//提交事务
	}catch (Exception e) {
            if (conn != null) {
                try {//事务出错将回滚
                    conn.rollback();
                } catch (SQLException a) {
                    a.printStackTrace();
                }
            }

福利
为感谢读者的支持,在此送上笔者自己手写的JDBC工具包和使用工具包的案例
工具包:

package JDBC_TB;

import java.sql.*;
import java.util.ResourceBundle;

//JDBC连接Mysql的工具类
public class Jdbc_Tb {
    private Jdbc_Tb() {
    }
//静态代码块注册驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
/*

获取连接对象
*/
    public static Connection getConnection(String database, boolean autoCommit) throws SQLException {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbcToll");//资源绑定
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");
        Connection conn = DriverManager.getConnection(url + database + "?&useSSL=false", user, password);
        conn.setAutoCommit(autoCommit);

        return conn;
    }
//关闭资源,使用多态
    public static void closeSource(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("查询结果集对象未关闭");
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("数据库操作对象未关闭");
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("连接对象未关闭");
            }
        }


    }
}

配置文件:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/
user=账号
password=密码

使用案例

package jdbc.mysql.gzpowernode;

import JDBC_TB.*;

import java.sql.*;

/*
 * mysql事务
 *
 * */
public class test06 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1.注册驱动
            //2.获取连接对象
            conn = Jdbc_Tb.getConnection("此处填自己的数据库名", false);//关闭自动提交
            //3.获取数据库预处理操作对象
            String sql = "select ename,sal from emp where sal = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, 5000);
            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("ename") + "," + rs.getDouble("sal"));
            }
            conn.commit();
        } catch (Exception e) {
            if (conn != null) {
                try {//事务出错将回滚
                    conn.rollback();
                } catch (SQLException a) {
                    a.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            Jdbc_Tb.closeSource(conn, ps, rs);
        }
    }
}

笔者的学习包项目,包括工具包,在这

总结

JDBC编程六步
1.注册驱动
2.获取连接对象
3.获取数据库操作对象
4.执行SQL语句
5.处理查询结果集(SQL语句为查询语句时有这一步)
6.释放资源
创作不易喜欢的小伙伴可以一键二连哦,谢谢支持
<贵大20通信李小江>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值