初识jdbc


JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

简单地说,JDBC 做三件事:与数据库建立连接、发送 操作数据库的指令并处理结果。

连接JDBC的步骤

  • 加载驱动程序
  • 创建连接
  • 执行SQL语句
  • 关闭连接

准备

安装完成mysql后可以cmdmysql -u root -p指定root账户登录mysql数据库。

mysql的官网下载mysqlJDBC驱动程序。下载完成后得到一个压缩包,将压缩包解压,得到一个下面的目录。其中,我们所需的就是mysql-connection-java-8.0.18.jar包。下载完在src目录下创建一个lib包。将这个包放进lib包中。(下载位置随意

jdbc

如图,我有个数据库dbname,库里有个表stu,表如图:

在idea打开的项目中左上角选择File->Project Structure->Project Settings->Modules, 然后选择其中的Dependencies选项卡,然后点击右上角绿色的”+”号,选择JARs or directories, 选中你刚刚放到lib目录中的mysql-connector-java-8.0.18.jar,然后点击”OK”。首先将前面解压的mysql-connection-java-8.0.18.jar包复制,然后

如图:点击右边的+,选择JARs or directories,会弹出一个框,选择你上面解压后的mysql-connection-java-8.0.18.jar包,

上一步执行过后,可以在你的项目下面External Libraries里面看到mysql-connection-java-8.0.18.jar,此时所需jar包已经准备好了。

操作数据库。无非就是增删改查(CURD),下面具体看看怎么操作:

先写一个工具类,这个工具类有两个方法,(一个用来获取数据库的连接,也就是connection,另一个自然是关闭这个连接)

不妨叫这个工具类MyDBUtils.java

package JDBC;

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

public class MyDBUtils
{
    //设置连接地址
    private static String url = "jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=utf-8";
    //mysql用户名
    private static String user = "root";
    //mysql密码
    private static String passwd = "123456";
    //返回一个connection对象
    public static Connection getCon() throws Exception
    {
        //加载mysql驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
         //获取连接
        Connection connection = DriverManager.getConnection(url,user,passwd);
        //返回连接对象
        return connection;
    }
    public static void close(Connection connection) throws SQLException
    {
        //关闭连接
        connection.close();
    }
}

上面的MyDBUtils里面的属性和方法都写成了静态,方便我们下面调用。

好了,工具类写好了,看下具体怎么增删改查吧。

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

public class CURD
{
    public void insert(String[] args) throws Exception
    {
        //获取连接对象
        Connection connection = DriverManager.getCon();
        //要执行的sql语句
        String sql = "update stu set name  = '小红'  where name = '小明' ";
        PreparedStatement pt = connection.prepareStatement(sql);
        //返回值a表示受影响的行数,如果a > 0,表示插入成功
        int a = st.executeUpdate(sql);
        System.out.println(a);
        pt.close();
        connection.close();
    }
    public void query() throws SQLException
    {
        //这里为了简化,查询user表里所有的内容
        String sql = "select * from user;";
        PreparedStatement pt = connection.prepareStatement(sql);
        ResultSet rs = pt.executeQuery(sql);
        //如果ResultSet中有数据
        if(rs.next()==true)
        {
            System.out.printf("查询成功\n");
            //此表有三个字段
            System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
            while (rs.next())
            {
            System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
            }
        }
        else
            System.out.printf("查询失败\n");
        rs.close();
        pt.close();
        connection.close();
    }
    public static void delete(int id) throws SQLException, ClassNotFoundException
    {
        Connection connection = DriverManager.getCon();
        String sql = "delete  from user where id=?";
        PreparedStatement pt = connection.prepareStatement(sql);
        pt.setInt(1,id);
        //如果删除成功,受影响行数为1
        int success = pt.executeUpdate();
        if(success > 0)
            System.out.printf("删除成功\n\n");
        else
            System.out.printf("删除失败\n\n");
        pt.close();
        connection.close();
    }
    public static void insert(int id, String username,String passwd) throws SQLException, ClassNotFoundException
    {
        Connection connection = DriverManager.getCon();
        String sql = "insert into user values (?,?,?)";
        PreparedStatement pt = connection.prepareStatement(sql);
        pt.setString(1, id);
        pt.setString(2, name);
        pt.setString(3, pass);
        int  success = pt.executeUpdate();
        if(success > 0)
            System.out.printf("插入成功\n\n");
        else
            System.out.printf("插入失败\n\n");
        pt.close();
        connection.close();
    }
}

注意:mysql8.0版本不加serverTimezone=UTC&characterEncoding=utf-8这一段会抛出异常,报错说是因为时区原因。还有com.mysql.jdbc.Driver要写成com.mysql.cj.jdbc.Driver

在查询方法中,先关闭ResultSet,再关闭PreparedStatement,最后再关闭Connection,遵循先打开后关闭的原则。

在上面的SQL语句中,有些语句带了“?”,这个“?”是占位符,可以后面再设定这个问号的具是什么,可以不用写死SQL语句,更灵活。

jdbc中,我们用PreparedStatement,而不用Statement,相比之下,PreparedStatementStatement更优秀,现在没人用Statement,有以下几个原因:

  1. 一.代码的可读性和可维护性

    Statement,sql语句中没有占位符,带来的不便就是字符串的拼接,稍不留神就容易出错,而且代码可读性很低。

  2. PreparedStatement尽最大可能提高性能

    PreparedStatement是预编译的,对于批量处理可以大大提高效率,

  3. 最重要的一点是极大地提高了安全性

    体现就是防SQL注入,Statement是做不到这一点的。

Apache DBUtils

commons-dbutilsApache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

  commons-dbutilsAPI介绍:

  • org.apache.commons.dbutils.QueryRunner

  • org.apache.commons.dbutils.ResultSetHandler

  • org.apache.commons.dbutils.DbUtils

Apache DBCP

C3P0

c3p0是一个数据库连接池,为什么需要数据库连接池?数据库连接的创建和关闭需要消耗很多的资源,如此往复,很不划算,所以我们需要一个连接池来管理我们的连接对象。

待更….


文章作者: 空指针异常
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 空指针异常 !
评论