数据库之JDBC

JDBC笔记

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

JDBC为开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够使用java API编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。

JDBC为我们提供了java连接数据库的驱动。而这个驱动也是由Java开发出来的,我们只需要将这个驱动放进项目中,通过这个驱动,我们就可以用Java连接数据库,进行数据库的管理操作。

了解:JDBC与ODBC的区别

二者皆可以实现对数据库的操作(连接、增删改查、建库建表)。

l  JDBC是SUN开发的java连接数据库的标准

l  ODBC是微软开发的,C语言的

1、准备工作

1.0 数据操作步骤

l  注册驱动(只做一次)

l  建立数据库连接

l  创建执行SQL的语句(Statement)

l  执行SQL语句

----如果是查询,需要处理执行的结果(如:接收查询数据)

l  释放资源(千万不要漏了)

1.1 创建java工程

项目名的命名规范:项目名全部小写。创建一个java工程:jdbcproject。

1.2 导入jar包

使用JDBC操作数据库,需要导入JDBC的驱动包:mysql-connector-java-5.1.39.jar。

在项目下面创建一个文件夹:lib,将驱动包复制到lib下面,并将jar包加载到项目中,如下图所示:

l  新建lib文件夹:

l  将jar包复制到lib文件夹下面:

l  选中jar包,单击右键,在弹出的窗口中选择“Add to Build Path” ,将jar包加载到项目中:

这时,我们可以在项目的引用包中看到我们引用的jar包:

 

2、JDBC连接数据库

经过上面的准备工作,我们就可以开始使用Java连接数据库了。

2.1 加载JDBC驱动

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现。

     try {

       // 加载MySql的驱动类

  Class.forName("com.mysql.jdbc.Driver");

     } catch (ClassNotFoundExceptione) {

       System.out.println("找不到驱动程序类,加载驱动失败!");

       e.printStackTrace();

     }

成功加载后,会将Driver类的实例注册到DriverManager类中。

加载驱动时,如果我们项目中没有导入驱动包或者驱动的名字不对,会出现驱动加载失败的异常。异常信息:

 

 

 

2.2 提供JDBC连接的参数

连接数据库时,需要下面几个参数:

url=jdbc:mysql://localhost:3306/database_name

username=root

password=1111

 

//这个可以解决中文乱码,在最后面可以设置编码,这里设的是utf-8

url = "jdbc:mysql://localhost:3306/yunlian??autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=utf-8";

其中,username和password是连接数据库的用户名和密码,一般默认的用户名是root,密码是安装MySQL时的密码。url是连接数据库的地址。

当我们访问的是本机的数据库的时候,url的值也可以为“jdbc:mysql:///database_name”

2.3 创建数据库的连接

通过DriverManager类创建数据库连接对象Connection。DriverManager类作用于Java程序和JDBC驱动程序之间,用于检查所加载的驱动程序是否可以建立连接,然后通过它的getConnection方法,根据数据库的URL、用户名和密码,创建一个JDBC Connection 对象。

     try {

//试图建立到给定数据库 URL 的连接

       Connection con = DriverManager.getConnection(url,username, password);

     } catch (SQLExceptione) {

       System.out.println("数据库连接失败!");

       e.printStackTrace();

     }

上面需要导入的包都是java.sql的包,如下所示:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

在连接数据库时,如果数据库不存在,或者用户名、密码错误,会出现连接数据库失败的异常

用户名或者密码错误:

当我们的url中的数据库不存在的时候:

当URL中的IP或者主机连不上的时候,就会出现连接超时的异常:

当数据库端口号写错的时候,会出现连接被拒绝:

3、数据库操作

数据库操作分为更新和查询两种操作。

我们想要执行SQL语句,就必须要创建一个java.sql.Statement对象,Statement对象可以将SQL语句发送到数据库,并返回一个执行结果(如:添加数据时会返回数据库的影响行数)。

Statement实例分为以下3种类型:

l  执行静态SQL语句。通常通过Statement实例实现

l  执行动态SQL语句。通常通过PreparedStatement实例实现

l  执行数据库存储过程。通常通过CallableStatement实例实现(Oracle会讲)

3.0 Statement与PreparedStatement

Statement与PreparedStatement两者都可以把SQL语句从Java程序发送到指定数据库,并执行SQL语句,但是他们也具有如下区别:

l  Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出;

l  PreparedStatement会形成预编译的过程,对于多次重复执行的语句,PreparedStatement的效率要高一些,而且适合批处理数据(批量添加);

l  最重要的是,PreparedStatement能有效防止危险自负的注入,即SQL注入问题。

根据比较结果可知,我们需要选用PreparedStatement更好、更快速、更安全。因此,在以后的JDBC操作中,建议使用PreparedStatement

Statement接口提供了两种常用的执行SQL语句的方法:executeQuery 、executeUpdate。executeUpdate一般用于添加、删除、修改数据;executeQuery一般用于查询数据。

PreparedStatement接口继承自Statement。PreparedStatement在sql语句中通过使用占位符?来代替常量字段值,setXXX方法来填充字段值,取代掉占位符,形成完整的可执行的sql语句。

3.1 添加数据

l  静态SQL添加

          // connection.createStatement():

            // 创建一个 Statement对象来将 SQL 语句发送到数据库。

            statement = connection.createStatement();

            // executeUpdate(String sql):执行给定 SQL语句,该语句可能为 INSERT、UPDATE或

            // DELETE 语句,或者不返回任何内容的 SQL语句(如 SQL DDL语句)。

            // 添加数据

             String sql = "insert into test(id,username,birthday)

             values('15','张三','1999-09-09')";

             int rows = statement.executeUpdate(sql);//返回的结果是受影响的行数

             System.out.println(rows+"行");

 

 

l  动态SQL添加

          String sql = "insert into user(username,password) values(?,?)";

            ps = connection.prepareStatement(sql);

//          //给占位符赋值

//          //setNString(int parameterIndex, String value)

//            //将指定参数设置为给定 String对象。

//          //位置编号从 1开始,不是从零开始

            ps.setString(1, "王五");//setString表示的是该位置的参数需要字符串,对应数据库字段类型

            ps.setString(2, "我是密码");

//          //执行SQL

            int rows = ps.executeUpdate();

            System.out.println(rows+"行");

 

3.2 修改数据

语法规则与添加类似

3.3 删除数据

语法规则与添加类似

3.4 批量处理数据

一次性执行多条SQL语句(比如:一次下单购买多个商品)。

执行批量添加数据时,务必要将提交方式设置为手动提交。

con.setAutoCommit(false);//将提交方式设置为手动提交

在获取到连接后,获取PreparedStatement对象之前,需要将提交方式设置为手动提交。

在循环中,可以使用ps.addBatch();//将给定的 SQL命令添加到此Statement对象的当前命令列表中。

循环结束后,使用ps.executeBatch(),可以将一批SQL命令提交给数据库,但是该方法之后必须要使用con.commit(),该命令是命令数据库新更改的数据成为持久化的数据。

@Test

    public void  testAddBatch(){

        Connection con = BaseDao.getConn();

        //批量添加数据

        PreparedStatement ps = null;

        try {

            con.setAutoCommit(false);//将提交方式设置为手动提交

            String sql = "insert into test(id,name,password) values(?,?,?)";

            ps = con.prepareStatement(sql);

            long start = System.currentTimeMillis();//获取当前系统时间的毫秒数

            for (inti = 0; i < 3000;i++) {

                ps.setInt(1, (i+1));

                ps.setString(2, "用户"+i);

                ps.setString(3, MD5Util.GetMD5Code("密码"+i));

                ps.addBatch();//将给定的 SQL命令添加到此 Statement对象的当前命令列表中。

            }

            System.out.println("数据循环耗时:"+(System.currentTimeMillis()-start)+"ms");

            start = System.currentTimeMillis();//获取当前系统时间的毫秒数

            //将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组

            ps.executeBatch();

            con.commit();//提交

            System.out.println("数据执行SQL耗时:"+(System.currentTimeMillis()-start)+"ms");

//          System.out.println(rows);

        } catch (Exceptione) {

            e.printStackTrace();

        }finally {

            BaseDao.close(con, ps, null);

        }

    }

采用批量处理数据的优点:

减少访问数据库的次数,大大提高了批量SQL执行的效率。

3.5 动态SQL中LIKE的使用

在使用动态SQL为like赋值的时候,like 直接使用?即可。PreparedStatement对象为占位符赋值的时候,我们需要把百分号 % 拼接进去即可。

案例:

String sql = “select* from user where username like ?”;

ps.setString(1,”%”+参数值+”%”);

4、释放资源

据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

5、小结

l  连接数据库时用到的三个类

l  静态SQL与动态SQL的区别

l  熟练使用动态SQL实现添加、修改、删除数据的功能

l  熟练使用批量处理数据

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值