java之JDBC的学习笔记

JDBC就是用来使用java语言操作关系型数据库的一套API

全称(Java DataBase Connectivity)Java 数据库连接

JDBC本质:

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

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

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

 JDBC好处:

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

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

JDBC快速入门

0、创建工程,导入驱动jar包

设置jar的作用域   Add as Library---->Create Library

1、注册驱动

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

2、获取连接

Connection conn=DriverManager.getConnection(url,username,password)

3、定义SQLyuj

String sql="updata ......"

4、获取执行SQL对象

Statement stmt=conn.createStatement();

5、执行SQl语句

stmt.executeUpdate(sql)

6、处理返回结果

7、释放资源

示例

package top.wong.jdbc;

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

public class JDBCDemo {
    public static void main(String[] args) throws Exception {


        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "密码";

        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        //定义SQL
        String sql = "update student set sname='林青霞' where id=5";

        //获取执行SQL的对象 Statement
        Statement stmt = conn.createStatement();

        int count = stmt.executeUpdate(sql);
        System.out.println(count);

        stmt.close();

        conn.close();
    }
}

JDBC API详解

DriverManager

驱动管理类

作用:

1、注册驱动

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

    try {
        DriverManager.registerDriver(new Driver());

   }catch (SQLEXception var1){
        throw new RuntimeException("Can't register driver !");

   }


}

2、获取数据库连接

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

//参数

//url:连接路径

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

//细节
//如果连接的是本机mysql服务器,并且mysql服务默认端口号是3306,则可以简写为:
//jdbc:mysql:数据库名称?参数键值对
//配置useSLL=false参数,禁用安全连接方式,解决警告提示

Connection

作用:

获取执行SQL的对象

普通执行SQL对象

Statement createStatement()

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

PreparedStatement PrepareStatement(sql)

执行存储过程的对象

CallableStatement prepareCall(sql)

事务管理

MySQL事务管理

开启事务:BEGIN;/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;


MySQL默认自动提交事务

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

开启事务:setAutoCommit(boolean autoCommit) :true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()

示例

package top.wong.jdbc;

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

public class JDBCDemo {
    public static void main(String[] args) throws Exception {


        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "";

        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        //定义SQL
        String sql1 = "update student set sname='林青霞' where id=5";
        String sql2="update student set sname='林青霞' where id=6";

        Statement stmt = conn.createStatement();

        //当出现异常的时、将事务回滚到提交之前

        try {
            //开启事务
            conn.setAutoCommit(false);

            //执行SQL语句
            int count1 = stmt.executeUpdate(sql1);
            //操作
            System.out.println(count1);

            //int i=3/0;

            int count2 = stmt.executeUpdate(sql2);
            System.out.println(count2);

            //提交事务
            conn.commit();

        }catch (Exception e){

            //回滚到提交事务之前
            conn.rollback();
            e.printStackTrace();
        }
        
        stmt.close();
        conn.close();
    }
}

Statement

作用

执行SQL语句

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

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


ResultSet executeQuery(sql):执行DQL语句
//返回值 :ResultSet结果集对象

executeUpdate

executeUpdate执行增删改DML

package top.wong.jdbc;


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

public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {

        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "";

        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        Statement statement = conn.createStatement();

        //executeUpdate 增
        statement.executeUpdate("insert into student(sname,age,tid)VALUES ('李华',188,2)");

        //executeUpdate 删
        statement.executeUpdate("delete from student where id=6");

        //executeUpdate 改
        statement.executeUpdate("update student set sname='黎明' where id =7");



        statement.close();
        conn.close();


    }
}

executeUpdate对表数据库的增删改DDL

package top.wong.jdbc;


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

public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {

        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "";

        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        Statement statement = conn.createStatement();

        //删除表
       statement.executeUpdate("drop table students");



        statement.close();
        conn.close();


    }
}

ResultSet

封装了DQL查询语句的结果集

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

获取查询结果集

boolean next()
//将光标从当前位置向前移动一行
//判断当前是否是有效行
//返回值
//true :有效行,当前行有数据
//false:无效行,当前行没有数据

xxx getXxx(参数):获取参数
//xxx:数据类型;如 int getInt(参数); String getString(参数)
//参数
//    int :列的编号,从1开始
//    String :列的名称

案例

将从数据库中查到的数据封装到Account对象中并将对象添加到集合中

package top.wong.pojo;

public class Account {

    Integer id;
    String name;
    Integer age;
    Integer tid;

    public Account() {
    }

    public Account(Integer id, String name, Integer age, Integer tid) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.tid = tid;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getTid() {
        return tid;
    }

    public void setTid(Integer tid) {
        this.tid = tid;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", tid=" + tid +
                '}';
    }
}
package top.wong.jdbc;

import top.wong.pojo.Account;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class JDBCDemo02 {

    public static void main(String[] args) throws Exception {

        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "";

        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);
        Statement statement = conn.createStatement();


        ResultSet resultSet = statement.executeQuery("select * from student");

        // 将表中的数据封装到Account中,并将对象存放到List集合中
        //创建List集合
        List<Account> list=new ArrayList<>();
        while (resultSet.next()){
            Account a = new Account();

            a.setName(resultSet.getString("sname"));
            a.setAge(resultSet.getInt("age"));
            a.setId(resultSet.getInt("id"));
            a.setTid(resultSet.getInt("tid"));
            list.add(a);
        }

        resultSet.close();
        statement.close();
        conn.close();

        Iterator<Account> iterator = list.iterator();

        while (iterator.hasNext()){
            Account next = iterator.next();
            System.out.println(next.toString());
        }



    }

}

PreparedStatement

作用

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

SQL输入演示

package top.wong.jdbc;

import top.wong.pojo.Account;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class JDBCDemo03 {

    public static void main(String[] args) throws Exception {


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

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";




        Connection conn = DriverManager.getConnection(url, "root", "");
        Statement statement = conn.createStatement();


        //用户名
        String username="admin";

        //密码
//        String password="123456";
        String password="'or '1'='1";
        String sql="select * from t_user where username='"+username+"' and password='"+password+"'";
        System.out.println(sql);
//select * from t_user where username='admin' and password=''or '1'='1'
        ResultSet resultSet = statement.executeQuery(sql);

        if(resultSet.next()){
            System.out.println("登录成成功");
        }else{
            System.out.println("登录失败");
        }


        resultSet.close();
        statement.close();
        conn.close();



    }
}




获取PreparedStatement对象

//SQL 语句中参数值,使用?占位代替
String sql ="select * from t_user where username=? and password=?"
PreparedStatement pstmt=conn.prepareStatement(sql)

设置参数值

PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型;如setInt(参数1,参数2)
参数:
   参数1:?的位置编号,从1开始
   参数2: ?的值

执行SQL

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

package top.wong.jdbc;

import java.sql.*;

public class JDBCDemo04 {
    public static void main(String[] args) throws Exception {


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

        String url = "jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8";


        Connection conn = DriverManager.getConnection(url, "root", "?");



        //用户名
        String username = "admin";

        //密码
        String password="123456";
//        String password = "'or '1'='1";

        String sql="select * from t_user where username= ? and password= ?";

        //获取PreparedStatement
        PreparedStatement preparedStatement = conn.prepareStatement(sql);//转义"\'or \'1 \'=\'1"

        //对问号占位符赋值
        preparedStatement.setString(1,username);
        preparedStatement.setString(2,password);

        //执行SQL语句
        ResultSet resultSet = preparedStatement.executeQuery();

        if (resultSet.next()) {
            System.out.println("登录成成功");
        } else {
            System.out.println("登录失败");
        }


        resultSet.close();
        conn.close();
    }



    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_53558470

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值