SpringMVC之JDBC编程

JDBC简介
JDBC是Java语言访问数据库的解决方案,也就是说,只要应用使用数据库存储数据,都会使用到JDBC编程。

JDBC包括两部分
第一部分是提供给程序员使用的API,与具体数据库无关,也就是编写程序时使用API
第二部分是数据库厂商根据规范实现的API,称为SPI,与具体数据库有关。也就是程序运行时,会调用到SPI。在SPI中,有一个关键的类,这个类能够帮助Java程序与数据库创建连接,称为驱动类(driver class)
在这里插入图片描述

API
JDBC的API在JavaSE中,安装JDK即可以使用
JDBC的API都存在于java.sql及javax.sql中,多数时候使用java.sql中的类和接口

SPI
下载数据库驱动包

API简介
DriverManager类能够自动在内存中找到符合需求的的驱动类,主要用来获得与数据库的链接对象
在这里插入图片描述

url每个数据库有不同的规范,DriverManager类根据url能够确定需要链接的数据库类型,找到合适的驱动类,获得链接。

Connection是与特定数据库的链接对象,通过DriverManager类取得。通常使用链接对象获得语句对象,常用的语句对象有两种,所以有两个方法获得。
方 法 原 型	说    明Statement createStatement()throws SQLException	成功创建返回Statement对象,否则抛出SQLException异常,必须捕捉PreparedStatementprepareStatement(String sql)throws SQLException	参数sql是要执行的SQL语句,根据指定的SQL语句创建PrepareStatement对象,有可能抛异常,必须捕捉

Statement对象可以用来执行SQL语句,使用executeQuery执行查询语句,返回结果集,使用executeUpdate执行增删改,返回操作的行数。
在这里插入图片描述

PreparedStatement如果要多次执行相似的SQL语句,可以使用PreparedStatement(预编译语句对象)对象来执行,进行了预编译,效率较高;可以执行带?的SQL语句,?使用setX方法赋值。
在这里插入图片描述

ResultSet对象用来封装查询得到的结果集,常用的方法有next以及getXXX方法。注意:必须使用next()方法,才能处理结果集。
在这里插入图片描述

Statement实现增删改

一:加载驱动类
在进行JDBC编程时,有一个很重要的类,叫驱动类。存在于数据库的驱动包中,首先要把驱动类加载到内存中。每个数据库的驱动类不同。

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

二:获得Connection连接对象
使用DriverManager获得链接对象。获得链接时,需要指定url连接串,每个数据库不同,以及用户名、密码。

  Connection conn = null;
try

    {
    
    
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8", "root", "root");
    } catch(
    ClassNotFoundException e)

    {
    
    
        e.printStackTrace();
    } catch(
    SQLException e)

    {
    
    
        e.printStackTrace();
    }

三:获得Statement语句对象
得到链接对象后,就可以获得语句对象。语句对象常用的有两种,我们先使用Statement。

  Connection conn = null;
    Statement stmt = null;
try

    {
    
    
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8", "root", "root");
        stmt = conn.createStatement();
    } catch(
    ClassNotFoundException e)

    {
    
    
        e.printStackTrace();
    } catch(
    SQLException e)

    {
    
    
        e.printStackTrace();
    }

四:执行SQL语句
要执行insert语句,因此使用Statement中的executUpdate方法

    Connection conn = null;
    Statement stmt = null;
try

    {
    
    
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8", "root", "root");
        stmt = conn.createStatement();
        String sql = "insert into user values('wangxh','1','1','29097443','2015-01-15 16:37:00')";
        stmt.executeUpdate(sql);
    } catch(
    ClassNotFoundException e)

    {
    
    
        e.printStackTrace();
    } catch(
    SQLException e)

    {
    
    
        e.printStackTrace();
    }
}

五:关闭资源
语句对象、链接对象都是占资源的对象,使用后要在finally语句块中关闭。

finally{
    
    
if(stmt!=null){
    
    
try {
    
    
stmt.close();
} catch (SQLException e) {
    
    
e.printStackTrace();
}
}
if(conn!=null){
    
    
try {
    
    
conn.close();
} catch (SQLException e) {
    
    
e.printStackTrace();
}
}

PreparedStatment实现增删改
步骤1-2与之前例子相同
步骤3:

获得PreparedStatment语句对象。创建PreparedStatement时,需要使用一个SQL语句字符串,SQL语句中需要使用到变量的参数之处,可以使用?占位。

String sql="insert into user values(?,?,?,?,?)";
pstmt=conn.prepareStatement(sql);

步骤4:

使用PreparedStatment的setX方法,为?赋值。并执行。
pstmt.setString(1,username);
pstmt.setString(2, pwd);
pstmt.setString(3,status);
pstmt.setString(4, qq);
pstmt.setString(5, time);
pstmt.executeUpdate();

步骤5:
关闭资源,与之前例子相同

小结
在做JDBC编程过程中,主要使用JDBC的API编程,其中只有驱动类名称、连接串写法,与具体数据库有关,其他都有数据库无关。
主要步骤:

  1. 加载驱动类
  2. 获得连接对象
  3. 获得语句对象
  4. 执行SQL语句
  5. 关闭资源

语句对象:常用的语句对象有两种,分别是Statement,PreparedStatement。其中PreparedStatement多次执行相同SQL语句时,效率会较高。往往在实际工作中,SQL语句中的参数是变量时,会使用PreparedStatement。

JDBC实现查询
查询与增删改的前三个步骤完全相同,即加载驱动类、获得连接对象、获得语句对象,完全相同。

查询也可以使用Statement和PreparedStatement两种,此处只演示Statement。

查询比增删改多一个重要步骤:
处理结果集。查询的主要目的就是要查看返回的结果,因此查询的必要步骤就是对结果集的处理。

String sql="select * from user where status="+status;
ResultSet rs=stmt.executeQuery(sql);

查询后返回ResultSet,先使用next()方法,然后使用getXXX方法获取每一个字段。

while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4)+" "+rs.getString(5));
}

用JDBC进行查询,比起增删改,主要的区别是必须处理结果集

处理结果集时,必须先调用next()方法,即使返回一条记录,也必须调用该方法

getXXX方法可以返回结果集中不同类型的字段值,可以通过索引返回,注意从1开始,也可以使用字段名返回。

JDBC编程注意事项
连接对象使用后一定要关闭。

数据库中的数据类型,在JDBC中都有对应的类型。例如varchar对应String,Datetime对应Timestamp等。不同的数据库系统数据类型有所区别,具体编程时可以进行查询。

PreparedStatement的setXXX方法,以及ResultSet的getXXX方法,索引都是从1开始。

引入类的时候,都引入java.sql包的,不要引入和数据库有关的包,例如com.mysql等

猜你喜欢

转载自blog.csdn.net/shuai_ge_feng/article/details/108775316