学习笔记三 -JDBC

黑马程序员最新版JavaWeb基础教程,Java web从入门到企业实战完整版_哔哩哔哩_bilibili

JDBC

概念:JDBC就是使用Java语言操作关系型数据库的一套API

全称:(java DataBase Connectivity)java数据库连接

JDBC本质:

官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口

各个数据库厂商去实现这套接口,提供数据库驱动jar包

我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处:

各数据库厂商使用相同的接口,java代码不需要针对不同数据库分别开发

可随时替换底层数据库,访问数据库的Java代码基本不变

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1注册驱动
       Class.forName("com.itheima.jdbc.JDBCDemo");

       //2获取连接
       String url = "jdbc:mysql://127.0.0.1:3306/db1";
       String username = "root";
       String password = "root";
       Connection conn = DriverManager.getConnection(url, username, password);
       //3
       String sql = "update account set money = 2000 where id = 1";
       //4
       Statement stat = conn.createStatement();
       //5
       int count = stat.executeUpdate(sql);
       //6
       System.out.println(count);
       //7
       stat.close();
       conn.close();
    }
}

 

JDBC API

DriverManager

DriverManager(驱动管理类)作用:

1:注册驱动

ps:MySQL 5之后的驱动包,可以省略注册驱动的步骤。自动加载jar包中META-INF\serivces\java.sql.Driver文件中的驱动类

2:获取数据库连接

static  Connection |  getConnection(String url,String user,String password)

参数

1:url:连接路径

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数值对1&参数值2.....

示例: jdbc:mysql://127.0.0.1:3306/db1

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

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

2:user 用户名

3: password 密码

package com.itheima.jdbc;

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


public class JDBCDemo2_DriverManger {
    public static void main(String[] args) throws Exception {
        //1注册驱动
    //  Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");

       //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
       String url = "jdbc:mysql:///db1?useSSL=false";
       String username = "root";
       String password = "root";
       Connection conn = DriverManager.getConnection(url, username, password);
       //3
       String sql = "update account set money = 2000 where id = 1";
       //4
       Statement stat = conn.createStatement();
       //5
       int count = stat.executeUpdate(sql);
       //6
       System.out.println(count);
       //7
       stat.close();
       conn.close();
    }
}

Connection

Connection(数据库连接对象)作用:

1获取执行SQL的对象

普通执行SQL对象

Statement   createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement  prepareStatement(sql)

执行存储过程的对象

CallableStatement  preparCall(sql)

2管理事物

MySQL事物管理

开启事务:BEGIN;/START TRANSACTION;

提交事务:COMMIT;

回滚事务:ROLLBACK;

MySQL默认自动提交事务

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

开启事务:setAutoCommit(boolean autoCommit):ture为自动提交事务;false为手动提交事务,即为开启事务

提交事务:commit()

回滚事务:rollback()

package com.itheima.jdbc;

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


public class JDBCDemo3_Connection {
    public static void main(String[] args) throws Exception {
        //1注册驱动
    //  Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");

       //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
       String url = "jdbc:mysql:///db1?useSSL=false";
       String username = "root";
       String password = "root";
       Connection conn = DriverManager.getConnection(url, username, password);
       //3定义sql
       String sql1= "update account set money = 3000 where id = 1";
       String sql2 = "update account set money = 3000 where id = 2";
       //4获取执行sql的对象 Statement
       Statement stat = conn.createStatement();



       try {
          //开启事务
          conn.setAutoCommit(false);
          //5执行sql
          int count1 = stat.executeUpdate(sql1);
          //6处理结果
          System.out.println(count1);

          //5执行sql
          int count2 = stat.executeUpdate(sql2);
          //6处理结果
          System.out.println(count2);
          //提交事务
          conn.commit();
       } catch (Exception e) {
          //回滚事务
          conn.rollback();
          e.printStackTrace();
       }

       


       //7释放资源
       stat.close();
       conn.close();
    }
}

 

Statement

Statement作用:

1,执行SQL语句

执行SQL语句

1:

int executeUpdate(sql):执行DML,DDL语句

返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0

2:

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet 结果集对象

package com.itheima.jdbc;


import org.junit.Test;

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

public class JDBCDemo4_Statement {
    /**
    * 执行DML语句
    * @throw Exception
    * */
@Test
    public void testDML() throws SQLException{
    //1注册驱动
    //  Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");

    //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "root";
    Connection conn = DriverManager.getConnection(url, username, password);
    //3
    String sql = "update account set money = 2000 where id = 5";
    //4
    Statement stat = conn.createStatement();
    //5
    int count = stat.executeUpdate(sql);//执行完DML语句,受影响的行数
    //6
    // System.out.println(count);
    if (count>0){
        System.out.println("修改成功~");
    }else {
        System.out.println("修改失败~");
    }
    //7
    stat.close();
    conn.close();
}

    /**
     * 执行DML语句
     * @throws Exception
     * */
    @Test
    public void testDDL() throws SQLException{
        //1注册驱动
        //  Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");

        //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3
       // String sql = "CREATE DATABASE db2";
        String sql = "DROP DATABASE db2";
        //4
        Statement stat = conn.createStatement();
        //5
        int count = stat.executeUpdate(sql);//执行完DML语句,受影响的行数
        //6
        // System.out.println(count);
//        if (count>0){
//            System.out.println("修改成功~");
//        }else {
//            System.out.println("修改失败~");
//        }
      System.out.println(count);
        //7
        stat.close();
        conn.close();
    }
}

 

ResultSet

ResultSet(结果集对象)作用:

1:封装了DQL查询语句的结果

ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象

获取查询结果

boolean next():(1)将光标从当前位置向前移动一行,(2)判断当前行是否为有效行

返回值:

ture:有效行,当前行有数据

false:无效行,当前行没有数据

xxx getXxx(参数):获取数据

xxx:数据类型;如:int getlnt(参数);String getSreing(参数)

参数:int:列的编号,从1开始

String;列的名称

package com.itheima.pojo;

public class Account {
    public int id;
    public String name;
    public  double money;

    public Account() {
    }

    public Account(int id ,String name,double money) {
        this.id = id;
        this.name=name;
        this.money=money;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

 

package com.itheima.jdbc;


import com.itheima.pojo.Account;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JDBCDemo5ResultSet_ {
    /**
    * 执行DQL语句
    * @throws Exception
    * */
@Test
    public void testResuitSet() throws SQLException{
    //1注册驱动
    //  Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");

    //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "root";
    Connection conn = DriverManager.getConnection(url, username, password);

    //3定义sql
    //String sql="select * feom accout";
    String sql="SELECT * FROM  ACCOUNT";

    //4获取statement对象
    Statement stmt = conn.createStatement();
    //5执行sql
    ResultSet rs=stmt.executeQuery(sql);
//    //6处理结果 遍历rs中的所有数据
//    //6.1光标向下移动一行,并且判断当前是否有数据
//    while (rs.next()){
//        //6.2获取数据
//        int id=rs.getInt(1);
//        String name=rs.getString(2);
//        double money=rs.getDouble(3);
//
//        System.out.println(id);
//        System.out.println(name);
//        System.out.println(money);
//        System.out.println("---------");
//    }
    //6处理结果 遍历rs中的所有数据
    //6.1光标向下移动一行,并且判断当前是否有数据
    while (rs.next()){
        //6.2获取数据
        int id=rs.getInt("id");
        String name=rs.getString("name");
        double money=rs.getDouble("money");

        System.out.println(id);
        System.out.println(name);
        System.out.println(money);
        System.out.println("---------");
    }
    rs.close();
    stmt.close();
      conn.close();
}

    /**
     * 查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
     * 1.定义实体类Account
     * 2.查询数据,封装到Account对象中
     * 3将Account对象存入ArrayList集合中
     * @throws Exception
     * */
    @Test
    public void testResuitSet2() throws SQLException{
        //1注册驱动
        //  Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");

        //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3定义sql
        //String sql="select * feom accout";
        String sql="SELECT * FROM  ACCOUNT";

        //4获取statement对象
        Statement stmt = conn.createStatement();
        //5执行sql
        ResultSet rs=stmt.executeQuery(sql);
        //创建集合
        List<Account> list=new ArrayList<>();

        //6处理结果 遍历rs中的所有数据
        //6.1光标向下移动一行,并且判断当前是否有数据
        while (rs.next()){
            Account account=new Account();

            //6.2获取数据
            int id=rs.getInt("id");
            String name=rs.getString("name");
            double money=rs.getDouble("money");

            account.setId(id);
            account.setName(name);
            account.setMoney(money);

            //存入集合
            list.add(account);
        }
        System.out.println(list);
        rs.close();
        stmt.close();
        conn.close();
    }
}

 

PreparedStatement

PreparedStatement作用:

1,预编译SQL语句并执行:预防SQL注入问题

1获取PreparedStatement对象

//SQL语句中的参数值,使用?占位符替代

String sql="select * from user where usemame =? and password = ?";

//通过Connection对象获取,并传入对应的sql语句

PreparedStatement pstmt =conn.prepareStatement(sql);

2设置参数值

PreparedStatement对象;setXxx(参数1,参数2):给?赋值

Xxx:数据类型;如setlnt(参数1,参数2)

参数:

参数1:?的位置编号,从1开始

参数2:?的值

3执行SQL

executeUpdate();\executeQuery(); :不需要再传递sql

SQL注入:

SQL注入是通过操作输入来事先定义好的SQL语句,用以达到执行对服务器进行攻击的方法

package com.itheima.jdbc;


import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JDBCDemo6_UserLongin {

@Test
    public void testLongin() throws SQLException{
    //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "root";
    Connection conn = DriverManager.getConnection(url, username, password);
    //接收用户输入 用户名和密码
    String name="zhangsan";
    String pwd="'or'1'='1";

    String sql="SELECT * FROM tb_user WHERE USERNAME='"+name+"'AND PASSWORD='"+pwd+"'";
    //获取stmt对象
    Statement stmt=  conn.createStatement();
    //执行sql
    ResultSet re=  stmt.executeQuery(sql);
    //判断登录是否成功
    if (re.next()){
        System.out.println("登录成功~");
    }else {
        System.out.println("登录失败~");
    }
    //7释放
    re.close();
    stmt.close();
      conn.close();
}
}

 

package com.itheima.jdbc;

import org.junit.Test;

import java.sql.*;

public class JDBCDemo7_PreparedStatement {

//@Test
//    public void testPreparedStatement() throws SQLException{
//    //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
//    String url = "jdbc:mysql:///db1?useSSL=false";
//    String username = "root";
//    String password = "root";
//    Connection conn = DriverManager.getConnection(url, username, password);
//
//    //接收用户输入 用户名和密码
//    String name="zhangsan";
//    String pwd="'or'1'='1";
//
//   //定义sql
//    String sql="SELECT * FROM tb_user WHERE USERNAME=? AND PASSWORD=?";
//
//    //获取pstmt对象
//   PreparedStatement pstmt=  conn.prepareStatement(sql);
//
//    //设置?的值
//    pstmt.setString(1,name);
//    pstmt.setString(2,pwd);
//
//    //执行sql
//   ResultSet rs= pstmt.executeQuery();
//
//    //判断登录是否成功
//    if (rs.next()){
//        System.out.println("登录成功~");
//    }else {
//        System.out.println("登录失败~");
//    }
//    //7释放
//    rs.close();
//    pstmt.close();
//      conn.close();

/**
 * PreparedStatement 原理
 * @throws Exception
 */



    @Test
    public void testPreparedStatement2() throws SQLException{
        //2获取连接:如果连接的是本机的mysql并且端口是默认的3306   可以简化
        String url = "jdbc:mysql:///db1?useSSL=false&useServerPrepPrepStmts=true";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //接收用户输入 用户名和密码
        String name="zhangsan";
        String pwd="'or'1'='1";

        //定义sql
        String sql="SELECT * FROM tb_user WHERE USERNAME=? AND PASSWORD=?";

        //获取pstmt对象
        PreparedStatement pstmt=  conn.prepareStatement(sql);

        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        //执行sql
        ResultSet rs= pstmt.executeQuery();

        //判断登录是否成功
        if (rs.next()){
            System.out.println("登录成功~");
        }else {
            System.out.println("登录失败~");
        }

        //7释放
        rs.close();
        pstmt.close();
        conn.close();

    }
}

 

数据库连接池

简介:

数据库连接池是一个容器,负责分配,管理数据库连接(Connection)

它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个

释放空间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

好处:资源重用

提升系统响应速度

避免数据库连接遗漏

标准接口:DataSource

官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口

功能:获取连接

Connection    getConnection()

常见的数据库连接池:

DBCP

C3P0

Druid

Druid(德鲁伊)

Druid连接池是阿里巴巴开源的数据库连接池项目

功能强大,性能优秀,是java语言最好的数据库连接池之一

Driud使用步骤

1.导入jar包driud-.**.

2.定义配置文件

3.定义加载文件

4,获取数据库连接池对象

5,获取连接

package com.itheima.druid;
/*
* Druid数据库连接池演示
* */

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //1.导入jar包

        //2.定义配置文件

       // 3加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("D:/xudian/ithaima/jdbc/JDBCDemo/src/com/itheima/druid.properties"));
        //4获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取数据库连接池Connection
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
       // System.out.println(System.getProperty("user.dir"));



    }
}

 diud包下的配置文件

目录

HJDBC

JDBC API

DriverManager

Connection

ResultSet

PreparedStatement

数据库连接池


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值