Java数据库编程

1.JDBC(Java数据库连接)

JDBC是一种用于执行SQL语句的JavaAPI,相较于ODBC(开放式数据库连接,使用c语言接口),可以认为JDBC是面向对象接口的ODBC

2.建立数据库连接

需要两个步骤:装载驱动程序、建立连接
(1)装载驱动程序:

class.forName("驱动程序名称");

使用JDBC-ODBC桥接驱动程序,使用如下代码装载:

class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

(2)建立连接:
用适当的驱动程序类与DBMS建立连接,代码如下:

Connection con=DriverManager.getConnection(url,"myLogin","mypassword");

参数url是一个表示数据库统一资源定位的字符串,常规语法为jdbc:suprotocol:subname。子协议suprotocol用于连接数据库指定的驱动程序。

如果使用的是JDBC-ODBC桥,JDBC URL将以jdbc:odbc开始:余下的url通常是数据源的名称或数据库系统。因此,假设正在使用ODBC存取一个名为Fred的ODBC数据源,JDBC URL是jdbc:odbc:Fred。把myLogin与mypassword替换成登录DBMS的用户名和密码,例如:

String url="jdbc:odbc:Fred";
Connection con=DriverManager.getConnection(url,"Fernande","J8");

可以以两种方式进行数据库访问:(1)JDBC/ODBC桥接驱动程序,(2)JDBC驱动程序直接与数据库连接

2.1 使用JDBC/ODBC桥接驱动程序

1.安装并配置好MySQL后,安装SQLyog(可视化的SQL软件)
2.建立一个新的数据库book,如下图:

在这里插入图片描述
3.建立一个表bookinfo,如下图:
在这里插入图片描述
4.为表填入测试数据,如下图:
在这里插入图片描述
样例:演示如何使用JDBC-ODBC驱动程序连接数据库:

package DataBass;

import java.sql.*;
public class JdbcOdbcTest {
    public static void main(String[] args){
        try{
            //加载驱动程序
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //建立连接,给其协议、用户名、密码,这里得到的con是一个数据库对象
            String url="jdbc:odbc:book";
            Connection con= DriverManager.getConnection(url,"root","2572463072ccgW");
            //生成SQL语句,Statement用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句
            Statement stmt = con.createStatement();
            //执行查询操作,其他操作对应其他的函数(参数是sql命令),这里得到的rs是一个数据集
            ResultSet rs = stmt.executeQuery("select * from bookinfo");

            System.out.println("书名 \t\t价格\t\t出版社");
            System.out.println("---------------------------------------");
            //循环输出语句
            while(rs.next()){
                System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
            }
            rs.close();//关闭资源
            stmt.close();

        }catch(Exception e){
            e.printStackTrace();//用于输出异常信息
        }
    }
}

出现异常不能正常输出:
出现这个异常的原因在于从JDK1.8开始,Oracle删除了jdbc-odbc桥,如果你要使用jdbc-odbc桥,那么请下载jdk1.7或者更低版本

2.2 使用JDBC驱动程序

使用JDBC直接与MySQL数据库连接

与JDBC-ODBC桥接方式类似,具体如下:

package DataBass;

import java.sql.*;
public class Jdbctest {
    public static void main(String[] args){
        try{
            //加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");//固定写法
            //建立连接,给其协议、用户名、密码,这里得到的con是一个数据库对象
            //useUnicode=true&characterEncoding=utf8&useSSL=true,这三个参数是支持中文编码,编码格式,安全性
            String url="jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf8&useSSL=true";
            Connection con= DriverManager.getConnection(url,"root","2572463072ccgW");
            //生成SQL语句
            Statement stmt = con.createStatement();
            //执行查询操作,其他操作对应其他的函数(参数是sql命令),这里得到的rs是一个数据集
            ResultSet rs = stmt.executeQuery("select * from bookinfo");

            System.out.println("书名 \t\t价格\t\t出版社");
            System.out.println("---------------------------------------");
            //循环输出语句
            while(rs.next()){
                System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
            }
            rs.close();//关闭资源
            stmt.close();

        }catch(Exception e){
            e.printStackTrace();//用于输出异常信息
        }
    }
}

运行结果:
在这里插入图片描述

3. 执行SQL语句

和数据库建立连接的目的是让应用程序可以与数据库进行交互,Statement是java执行数据库操作的重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL命令。Statement对象用于执行不带参数的简单SQL语句。

Statement对象用Connection的方法createStatement()创建:

Connection con= DriverManager.getConnection(url,"root","");
Statement stmt = con.createStatement();

执行Statement对象,被发送到数据库的SQL语句 被作为参数提供给Statement的方法:

ResultSet rs = stmt.executeQuery("select a,b,c from table2");

Statement接口提供了4中执行SQL语句的方法:

executeUpdate(SQL)//执行修改数据库内容的SQL语句
executeQuery(SQL)//查询
execute(SQL)//可执行任意类型的SQL语句
executeBatch(SQL)//批量执行SQL语句
3.1 executeUpdate

可执行INSERT、UPDATE、DELETE语句以及SQLDDL(数据定义语言)返回值为一个整数,表示的是影响的行数,对于CREATE TABLE或DROP TABLE 等不操作行的语句,其返回值为0
样例,向数据库book的bookInfo中添加一条记录:

stmt.executeUpdate("insert into bookInfo values('C语言',10,'北京大学出版社')");
3.2 executeQuery

对数据库进行查询,返回的是一个ResultSet数据集对象

ResultSet rs=stmt.executeQuery("select * from bookInfo");

该对象的next()方法可将光标移到下一行,因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果:

while(rs.next()){
......
}

ResultSet接口提供用于从当前行获取列值的获取方式getXXX()。依据字段的SQL类型不同,getXXX()采用不同的方式,如getBoolean()、getString()等,可以使用列的索引编号或名称获取值,如:

String bookName = rs.getString(1);
//或
String bookName = rs.getString("bookName");
3.3 executeBatch

该方法用来批量执行SQL语句,这些要批量执行的SQL语句是更新类型(如INSERT,UPDATE,DELETE,CREATE等)这些可以对数据库进行修改操作的SQL语句,并且其中不能包含查询类型(SELECT)的SQL语句,演示语句如下:

Statement stmt=con.creatStatement();
stmt.addBatch(updatesql_1);
stmt.addBatch(updatesql_2);
stmt.addBatch(updatesql_3);
int[] result =stmt.executeBatch();

这里用addBatch()向stmt对象添加了3条更新类型的SQL语句,调用executeBatch()后这3条语句会批量执行,该方法返回一个整形数组,其中一次存放了每条SQL语句对数据库产生影响的行数,与executeUpdate()方法返回方式类似

4. 使用PreparedStatement

之前是使用数据库连接对象创建Statement对象,通过Statement对象向DBMS发送SQL语句,同样也可以创建PreparedStatement对象来完成

PreparedStatement继承了Statement的全部功能,在PreparedStatement对象中的SQL语句可具有一个或多个IN参数,其在SQL语句创建时未被指定,相反,语句为每一个IN参数提供一个 ‘?’ 作为占位符,每个?的值必须在SQL语句执行前,通过适当的setXXX()方法来提供,用于设置?的值。并且executeUpdate,executeQuery,execute方法不再需要参数,如下:

String sql = "select * from stuInfo where math > ? and chinese > ?";
PreparedStatement pstmt = con.PreparedStatement(sql);
pstmt.setFloat(1,60.0);
pstmt.setFloat(2,83.0);
Resultset rs=pstmt.executeQuery();

这里由于math和chinese参数都是float类型的数据,所以这里使用setFloat方法来设置值

setFloat()第一个参数表示对?位置的索引,第二个参数是值

样例:向stuInfo中插入一条新的记录:

Connection con=DriverManager.getConnection(url,"admin","");
//SQL语句不采用拼接方式,使用站位符?写SQL语句
String sql ="insert into stuInfo values(?,?,?)";
//创建PreparedStatement对象
PreparedStatement pstmt=con.prepareStatement(sql);
//对占位符进行设置
pstmt.setString(1,"200704");
pstmt.setString(2,"ccg");
pstmt.setFloat(3,60.0);
//数据库更新操作
pstmt.executeUpdate();

当数据数量多时,一个一个写则会很麻烦,使用setObject
()方法:

Object[] datas={"200704","ccg",60.0};
//利用循环逐个赋值
for (int i=1;i<= datas.length;i++){
    pstmt.setObject(i,datas[i-1]);
}

5. 事务处理

数据库操作中,一项事务是指一条或多条对数据库更新的SQL语句组成的一个不可分割的单元。只有当其中的所有操作都正常完成后,整个事务才会提交到数据库,只要有一项没有完成,就必须撤销整个事务。

Connection类中提供了3个控制事务的方法:
(1)setAutoCommit(Boolean autoCommit):设置是否自动提交事务
(2)commit():提交事务
(3)rollback():撤销事务
在JDBC API中默认是自动提交事务,也就是说每一条对数据库的更新操作都是一个单独的事务

调用setAutoCommit(false)方法禁止自动提交,然后就可以吧多条更新操作作为一个事务进行整体提交,在操作完成后调用commit方法整体提交,只要其中有一条SQL操作失败则不会执行commit方法,而是产生对应的SQL异常,此时在捕获异常的代码块中调用rollback()方法撤销事务

样例:

String sql_1="zhang-100";
            String sql_2="wang+100";
            con.setAutoCommit(false);//设置关闭自动提交
            PreparedStatement stmt_1=con.prepareStatement(sql_1);
            PreparedStatement stmt_2=con.prepareStatement(sql_2);
            stmt_1.executeUpdate();
            stmt_2.executeUpdate();
            con.commit();
            con.setAutoCommit(true);//恢复自动提交
            stmt_1.close();
            stmt_2.close();

事务撤销:


            try{
                String sql_1="zhang-100";
                String sql_2="wang+100";
                con.setAutoCommit(false);//设置关闭自动提交
                PreparedStatement stmt_1=con.prepareStatement(sql_1);
                PreparedStatement stmt_2=con.prepareStatement(sql_2);
                stmt_1.executeUpdate();
                stmt_2.executeUpdate();
                con.commit();
                con.setAutoCommit(true);
                stmt_1.close();
                stmt_2.close();
            }catch(SQLException e){
                e.printStackTrace();
                if(con!=null){
                    try{
                        con.rollback();//撤销事务
                        con.setAutoCommit(true);//自动提交事务
                    }catch(SQLException ex){
                        ex.printStackTrace();
                    }
                }
            }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值