JDBC连接数据库

10 篇文章 1 订阅

目录

一、JDBC 核心API简介

二、JDBC连接数据库

1、加载驱动

2、获取Connection对象

3、创建Statement对象,执行SQL语句

4、返回Resultset对象,查询结果

 5、释放资源

6、SQL注入

7、PreparedStatement接口

8、配置MYSQL执行日志



JDBC Java DataBase Connectivity)是Java数据库连接技术的简称,提供连接各种常用数据库的能力。

作用:Java访问数据库的标准规范。提供给程序员调用的接口与类,集成在java.sqljavax.sql包中。

DriverManager(驱动管理者)

作用:管理各种不同的JDBC驱动,并获取数据库连接。

JDBC驱动

作用: JDBC是接口,而JDBC驱动才是接口的实现。每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。

一、JDBC 核心API简介

JDBC API的主要功能:与数据库建立连接、执行SQL 语句、处理结果和释放资源

API名称API作用

DriverManager

注册驱动,获取Connection连接对象。

Connection

负责连接数据库并担任传送数据的任务,最为重要的就是用来产生Statement对象。

Statement

负责向数据库发送SQL语句,这样数据库就会执行发送过来的SQL语句。

ResultSet

ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格。

二、JDBC连接数据库

1、先建一个数据库,并存入数据

CREATE DATABASE /*!32312 IF NOT EXISTS*/`myschool` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `myschool`;

/*Table structure for table `grade` */

DROP TABLE IF EXISTS `grade`;

CREATE TABLE `grade` (
  `gradeid` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '年级编号',
  `gradename` varchar(50) NOT NULL COMMENT '年级名称',
  PRIMARY KEY (`gradeid`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='年级表';

/*Data for the table `grade` */

insert  into `grade`(`gradeid`,`gradename`) values 
(1,'第一阶段'),
(2,'第二阶段'),
(3,'第三阶段'),
(4,'第四阶段'),
(5,'第五阶段');

2、操作一下步骤

首先要导入驱动jia包。

JDBC连接数据库核心步骤:

1、加载驱动 DriverManager

2、链接数据库 Connection,并定义SQL语句

3、发送SQL语句,并执行 Statement

4、返回结果 ResultSet

5、释放资源 close()

JDBC编程模板

Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
      Class.forName(“JDBC驱动类”); //1.加载驱动

      con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象
  
      stmt = con.createStatement();//3.创建Statement对象,
      String sql = "SQL语句"      //执行SQL语句

      rs = stmt.executeQuery(“SELECT a, b, c FROM table1;”);//4.返回ResultSet并查询结果
      while (rs.next()) {
             //每次读取一行,并打印读取结果
      }
}catch(Exception e){ 
      e.printStackTrace();
}finally{
          //5.释放资源
    try {if(rs != null) rs.close();
    if(stmt != null) stmt.close();
    if(con != null) con.close();
    } catch(SQLException e) {}
}

1、加载驱动

DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:

1、DriverManager.registerDriver(new Driver())

2、DriverManager.getConnection(url, user, password)

注意:在实际开发中并不推荐采用registerDriver方法注册驱动。

1、查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。

2、程序依赖mysqlapi,脱离mysqljar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。

建议使用固定方式加载驱动:

语法:

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

提示:MSQL5之后的驱动包,可以省略注册驱动的步骤

2、获取Connection对象

语法

DriverManager.getConnection(String url,String username,String password)

其中usernamepassword是登录数据库的用户名密码

url用来找到要连接数据库的“网址”。

例如:mysqlurljdbc:mysql://localhost:3306/myschool

JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。

第一部分是jdbc,这是固定的;

第二部分是数据库厂商名称;

第三部分是数据库服务器的IP地址(localhost)、端口号(3306),以及数据库名称(myschool)组成

提示:如果连接的是本机mysql服务器,且默认端口号是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对

配置useSSL=false参数,禁用安全连接方式,解决警告提示

Connection接口的常用方法

方法名方法作用

createStatement()

创建向数据库发送sqlstatement对象。

prepareStatement(sql)

创建向数据库发送预编译sqlPrepareSatement对象

prepareCall(sql)

创建执行存储过程的callableStatement对象。

setAutoCommit(boolean autoCommit)

设置事务是否自动提交。

commit()

在此连接上提交事务。

rollback()

在此连接上回滚事务。

close()

关闭数据库连接。

JDBC事务管理Connection接口定义了3个相对应的方法

开启事务:setAutoCommit(boolean autoCommit)设置事务是否自动提交,true为自动提交事务,false为手动提交事务

提交事务:commit()

回滚事务:rollback()

Connection获取执行SQL对象:

1、普通执行SQL对象

Statement createStatement()

2、预编译SQL的执行SQL对象,防止SQL注入

PreparedStatement prepareStatement(sql)

3、执行存储过程的对象

CallableStatement prepareCall(sql)

手动提交事务代码如下

try{
    //开启事务
    connection.setAutoCommit(false);
    //执行sql
    int count = statement.executeUpdate(sql);
    //处理结果
    sout(count);
    //提交事务
    connection.commit();
}catch(Exception e){
    //回滚事务
    connection.rollback();
    e.printStackTrace();
}

3、创建Statement对象,执行SQL语句

Statement对象是通过Connection对象的方法创建的。

语法:

Statement stmt = con.createStatement();//创建Statement对象

Statement对象用来向数据库发送要执行的SQL语句。

String sql = “select username from users”;//发送给服务器的SQL语句
ResultSet rs = stmt.executeQuery(sql);//执行SQL语句,并返回结果集

Statement接口的常用方法

方法名方法作用

ResultSet executeQuery(String sql)

用于向数据发送查询语句(select)。执行DQL语句,返回值:ResultSet结果集对象

int executeUpdate(String sql)

用于向数据库发送insertupdatedelete语句。执行DML,DDL语句

返回值:DML返回的为影响的行数,DDL语句执行成功其返回值可能为0

boolean execute(String sql)

用于向数据库发送任意sql语句。

void addBatch(String sql)

把多条sql语句放到一个批处理中。

int[] executeBatch()

向数据库发送一批sql语句执行。

void close()

释放资源。

4、返回Resultset对象,查询结果

语法:

String sql = “select username from users”;
ResultSet rs = stmt.executeQuery(sql);//执行SQL语句,并返回结果集
//读取结果
while(rs.next()){
          String userName=rs.getString(“username”);
          System.out.println(userName);
}

ResultSet接口的常用方法

方法名方法的作用

Object getObject(int index)

根据列的索引获取任意的数据类型

Object getObject(string columnName)

根据列的名称获取任意的数据类型

String getString(int index)

根据列的索引获取字符串

String getString(String columnName)

根据列的名称获取字符串

int  getInt(int index)

根据列的索引获取整数

int getInt(String columnName)

根据列的名称获取整数

boolean next()

将游标从当前位置向下移动一行

判断当前行是否为有效行

true:有效;false:无效

close()

释放资源。

 5、释放资源

Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, StatementConnection对象,特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中

finally {
            try {
                //释放资源
                if (resultSet != null){
                    resultSet.close();
                }
                if (statement != null){
                    statement.close();
                }
                if (connection != null){
                    connection.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

 JDBC连接数据库并对表内容进行查询

/**
 * @authorDesc
 * @author
 * @date
 * @version 1.0.0
 * @description 使用JDBC查询grade表的信息
 */

public class JDBCGrade {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/myschool";
    //数据库用户名
    private static final String USER = "root";
    //数据库用户名密码
    private static final String PASSWORD = "root";
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库
            connection = (Connection) DriverManager.getConnection(URL,USER,PASSWORD);
            String sql = "SELECT * FROM GRADE";
            //发送SQL语句并执行
            statement = connection.createStatement();
            //返回结果
            resultSet = statement.executeQuery(sql);

            Grade grade = null;
            //创建集合
            List<Grade> gradeList = new ArrayList<>();

            while (resultSet.next()){
                //创建对象
                grade = new Grade();
                //获取数据库信息
                int gradeId = resultSet.getInt("gradeid");
                String gradeName = resultSet.getString("gradename");

                //把数据库信息赋值给对象
                grade.setGradeId(gradeId);
                grade.setGradeName(gradeName);
                //把对象添加到集合中
                gradeList.add(grade);
            }
            System.out.println("年级编号\t年级名称");
            System.out.println("----------------------------------");
            gradeList.forEach(grade1 -> {
                System.out.println(grade1.getGradeId() + "\t\t" + grade1.getGradeName());
            });
            System.out.println("----------------------------------");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                //释放资源
                if (resultSet != null){
                    resultSet.close();
                }
                if (statement != null){
                    statement.close();
                }
                if (connection != null){
                    connection.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

 在连接数据库时可能会出现的异常:

1、Table 'myschool.user' doesn't exist      表不存在
2、Column 'COUNT(1)' not found.             找不到字段
3、No suitable driver found for                 没有导入jar包

6、SQL注入

注入原理:利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

防止SQL注入的方法:

        1、过滤用户输入的数据中是否包含非法字符;

        2、分步校验!先使用用户名来查询用户,如果查找到了,再比较密码;

        3、使用PreparedStatement接口

使用JDBC的五个步骤。
1、加载驱动        DriverManager
2、链接数据库      Connection
3、预执行 3.5问号传参 
4、执行,返回结果        ResultSet
5、释放资源        close()
快速记法:贾琏欲执事

7、PreparedStatement接口

PreparedStatement接口是Statement的子接口,你可以使用该接口来替换Statement接口。

PreparedStatement接口 (预编译的 SQL 语句)优点:

提高了代码的可读性和可维护性;提高了SQL语句执行的性能;提高了安全性

PreparedStatement的使用

使用Connection对象的prepareStatement(String sql):即创建它时就让它与一条SQL语句绑定;

编写SQL语句时,如果存在参数,使用“?”作为数据占位符;

调用PreparedStatementsetXXX()系列方法为占位符设置值,索引从1开始;

调用executeUpdate()executeQuery()方法,但要注意,调用没有参数的方法

PreparedStatement编程模板

Connection con = null;
PreparedStatement  stmt = null;
ResultSet rs = null;
try {
      Class.forName(“JDBC驱动类”); //1.加载驱动
      con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象

      String sql = "SELECT username,userpass,nickname FROM users where username=? and userpass=?";
      stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象,执行SQL语句

      smt.setString(1, “zhangsan”);  //4.给参数赋值
      smt.setString(2, "0");
      rs = stmt.executeQuery();//5.返回ResultSet并查询结果
      ……
}catch(Exception e){ 
      e.printStackTrace();
}finally{
          //6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}

使用JDBC完成数据添加的操作模板

Connection con = null;
PreparedStatement  stmt = null;
ResultSet rs = null;
try {
      Class.forName(“JDBC驱动类”); //1.加载驱动
      con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象

      String sql = " INSERT INTO student(字段列表) VALUES(值列表) ";
      stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象

      smt.setString(1, “zhangsan”);  //4.给参数赋值
      smt.setInt(2, 0);
      int row = stmt. executeUpdate();//5.执行SQL语句,返回受影响的行数
      ……
}catch(Exception e){ 
      e.printStackTrace();
}finally{
          //6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}

使用JDBC完成数据修改的操作模板

Connection con = null;
PreparedStatement  stmt = null;
ResultSet rs = null;
try {
      Class.forName(“JDBC驱动类”); //1.加载驱动
      con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象

      String sql = " UPDATE student SET loginpwd=? WHERE studentno=? AND loginpwd=? ";
      stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象

      smt.setString(1, “zhangsan”);  //4.给参数赋值
      smt.setInt(2, 0);
      int row = stmt. executeUpdate();//5.执行SQL语句,返回受影响的行数
      ……
}catch(Exception e){ 
      e.printStackTrace();
}finally{
          //6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}

使用JDBC完成数据删除的操作模板

Connection con = null;
PreparedStatement  stmt = null;
ResultSet rs = null;
try {
      Class.forName(“JDBC驱动类”); //1.加载驱动
      con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象

      String sql = " DELETE FROM student WHERE studentno=? ";
      stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象

      smt.setString(1, “zhangsan”);  //4.给参数赋值
      smt.setInt(2, 0);
      int row = stmt. executeUpdate();//5.执行SQL语句,返回受影响的行数
      ……
}catch(Exception e){ 
      e.printStackTrace();
}finally{
          //6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}

8、配置MYSQL执行日志

在MySQL文件夹下的my.ini中添加:

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2

MYSQL预编译功能的开启:

代码:

useServerPrepStmts=true

放在获取连接的位置

String url= "jdbc:mysql://127.0.0.1:3306/myschool?&useServerPrepStmts=true";

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值