java-jdbc访问数据库,原生操作数据库-mysql sqlserver

本文详细介绍了Java程序通过JDBC访问数据库的方法,包括其概念、优势及具体实现步骤。提供了MySQL示例代码,并展示了如何使用PreparedStatement防止SQL注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:JDBC【什么是JDBC?为什么使用JDBC?怎么使用JDBC?】what +why + how 

 

【what】SUN公司为使Java程序灵活的访问各种不同的关系型数据库提供的规则。【why】也就是说,不需要java应用程序去直接操作数据库,而是通过sum公司提供的方法统一去操作数据库,那么我们就不需要针对不同的数据库写不同的代码。只需要在配置文件里面配置一下即可,写代码更加方便。使Java程序灵活移植【how】下面讲【下面的案例全部以mysql为例】 

 

二:开发步骤 
1)导入mysql包,这一步是必须的,无论使用什么技术操作数据库,都需要导入mysql包 

2) JDBC的六个固定步骤 
1,注册数据库驱动[利用反射] 
2,取得数据库连接对象Connection 
3,创建SQL对象 
4,执行SQL命令,并返回结果集 
5,处理结果集 
6,依次关闭结果集

 

//1,注册数据库驱动有两种方式
    第一种是:直接注册数据库驱动
        DriverManager.registerDriver(new Driver());
    第二种是:利用反射机制间接加载数据库驱劝,推荐用第二种
        Class.forName("com.mysql.jdbc.Driver");
//2. 取得数据库连接对象Connection
        //取得与MySQL数据库连接的桥梁,参数分别是:连接数据库  用户名 密码Connection conn = DriverManager.getConnection(                "jdbc:mysql:///zz2017","root","xiaozheng");
//前两步骤需要记住以下。下面的

//4:执行sql语句
insert/update/delete----PreparedStatement .executeUpdate(sql):返回值表示影响记录的行数
select------------------PreparedStatement .exeucteQuery():返回值表示符合条件的记录  

 

【注意】创建sql对象的时候,有人会用Statement,我案例中使用的是 PreparedStatement。使用这个的好处是变量可以用占位符的方式去表示,而且它可以防止sql注入,所以我就采用这种方式,不用Statement

 

//案例源码
String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/mydb2";
        String user = "root";
        String password = "root";
        String sql = "insert into user(name,gender,salary) values(?,?,?)";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            //注册数据库驱动
            Class.forName(driver);
            //取得数据库连接
            conn = DriverManager.getConnection(url, user, password);
            //进行预编译,这里进行参数设置
            pstmt = conn.prepareStatement(sql);

            pstmt.setString(1,"xiaozheng");
            pstmt.setString(2,"男");
            pstmt.setFloat(3,8000);
            //进行编译
            rs = pstmt.executeQuery();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                float salary = rs.getFloat("salary");
                System.out.println(id + ":" + name + ":" + gender + ":"+ salary);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(rs!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
                try {
                    rs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(stmt!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
                try {
                    stmt.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){//重量级,创建和销毁rs所需要的时间和资源较小
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

 

 // statement用来执行SQL语句
     Statement statement = conn.createStatement();

            // 要执行的SQL语句
    String sql = "select * from student";

            // 结果集
            ResultSet rs = statement.executeQuery(sql);
            while(rs.next()) {
    
             // 选择sname这列数据
             name = rs.getString("sname");
//案例源码
String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/mydb2";
        String user = "root";
        String password = "root";
        String sql = "insert into user(name,gender,salary) values(?,?,?)";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            //注册数据库驱动
            Class.forName(driver);
            //取得数据库连接
            conn = DriverManager.getConnection(url, user, password);
            //进行预编译,这里进行参数设置
            pstmt = conn.prepareStatement(sql);

            pstmt.setString(1,"xiaozheng");
            pstmt.setString(2,"男");
            pstmt.setFloat(3,8000);
            //进行编译
            rs = pstmt.executeQuery();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                float salary = rs.getFloat("salary");
                System.out.println(id + ":" + name + ":" + gender + ":"+ salary);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(rs!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
                try {
                    rs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(stmt!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
                try {
                    stmt.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){//重量级,创建和销毁rs所需要的时间和资源较小
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


 // statement用来执行SQL语句
     Statement statement = conn.createStatement();

            // 要执行的SQL语句
    String sql = "select * from student";

            // 结果集
            ResultSet rs = statement.executeQuery(sql);
            while(rs.next()) {
    
             // 选择sname这列数据
             name = rs.getString("sname");
}

上述代码中发现有很多相同的地方,太长了。那么可以把相同部分提取成一个工具类

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {

    static String user = "root";
    static String password = "root";
    static String url = "jdbc:mysql://localhost【数据库地址】:3306【端口】/【数据库名称】?serverTimezone=UTC";

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

    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void closeJDBC(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

 

 

//查找table表重的 id和name
String sql = "select id,name from table";
Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = null;
try {
      conn.setAutoCommit(false);
      pstmt = conn.prepareStatement(sql);
       ResultSet rs = pstmt.executeQuery();
       json = ResultSetToJson.ResultSetToJsonArray(rs);
     }catch (SQLException e){
     try {
           conn.rollback();
     }catch (SQLException e1){
           e1.printStackTrace();
     }
}finally {
    DBUtil.closeJDBC(null, pstmt, conn);
}
     return json;

 

 

 

 

int basicinfoID = 0;
String sql = "INSERT INTO tb_resume_basicinfo("
    + "basicinfo_id, realname, gender, birthday, current_loc, "
    + "resident_loc, telephone, email, job_intension, job_experience, head_shot,applicant_id) "
    +"VALUES(SEQ_ITOFFER_RESUMEBASICINFO.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?)";
Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = null;
        try {
            // 关闭自动提交
            conn.setAutoCommit(false);
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, basicinfo.getRealName());
            pstmt.setString(2, basicinfo.getGender());
            pstmt.setTimestamp(3, basicinfo.getBirthday() == null ? null
                    : new Timestamp(basicinfo.getBirthday().getTime()));
            pstmt.setString(4, basicinfo.getCurrentLoc());
            pstmt.setString(5, basicinfo.getResidentLoc());
            pstmt.setString(6, basicinfo.getTelephone());
            pstmt.setString(7, basicinfo.getEmail());
            pstmt.setString(8, basicinfo.getJobIntension());
            pstmt.setString(9, basicinfo.getJobExperience());
            pstmt.setString(10, basicinfo.getHeadShot());
            pstmt.setInt(11, applicantID);
            pstmt.executeUpdate();
} catch (SQLException e) {
            try {
                // 事务回滚
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            DBUtil.closeJDBC(null, pstmt, conn);
        }

sqlserver:

https://docs.microsoft.com/zh-cn/sql/connect/jdbc/building-the-connection-url?view=sql-server-ver15

连接 URL 的一般形式为:

jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

 

其中:

  • jdbc:sqlserver://(必需)称为子协议,且为常数 。

  • serverName(可选)是要连接到的服务器的地址 。 它可以是 DNS 或 IP 地址,也可以是本地计算机地址 localhost 或 127.0.0.1。 如果未在连接 URL 中指定服务器名称,则必须在属性集中指定。

  • instanceName(可选)是 serverName 上要连接到的实例 。 如果未指定,则会连接到默认实例。

  • portNumber(可选)是 serverName 上要连接到的端口 。 默认值为 1433。 如果使用默认端口,则无需在 URL 中指定端口及其前面的“:”

命名的多个 SQL Server 实例

SQL Server 允许在每台服务器上安装多个数据库实例。 每个实例都由一个专用名称所标识。 若要连接到指定的 SQL Server 实例,可以使用指定实例的端口号(首选),也可将实例名指定为 JDBC URL 属性或 datasource 属性 。 如果未指定实例名属性或端口号属性,则会创建与默认实例的连接。 请参阅以下示例:

若要使用端口号,请执行下列操作:

jdbc:sqlserver://localhost:1433;integratedSecurity=true;<more properties as required>;

若要使用 JDBC URL 属性,请执行下列操作:

jdbc:sqlserver://localhost;instanceName=instance1;integratedSecurity=true;<more properties as required>;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值