首页 > 编程语言 >JAVAWEB-NOTE04-JDBC

JAVAWEB-NOTE04-JDBC

时间:2023-02-26 14:22:57浏览次数:51  
标签:JDBC res JAVAWEB money name NOTE04 sql conn String

目录

简介

快速入门

快速用JAVA操作MDBS的方法:
第0步:创建工程,导入驱动的jar包(也就是实现jdbc的接口)

第一步:注册驱动

Class.forName()

第二步:获取连接

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

第三步:定义SQL语句

String sql = "语句"

第四步:获取执行SQL对象

Statement stmt = conn.createStatement();

第五步:执行SQL

stmt.executeUpdate(sql);

第六步:处理返回结果
第七步:释放资源

eg:现在我想用Java去操作我本地的db1这个数据库,将张三的金额改为5000:
第0步:将驱动jar复制到工程的Lib中,还要让这个工程识别Jar包:

package com.jdbclearn;
/*
* JDBC快速入门
* */

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

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义sql
        String sql = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"张三\";";
        //4.获取执行sql的对象statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        int i = stmt.executeUpdate(sql);//此处的i就是mysql返回的成功操作的行row数
        //6.处理返回参数
        System.out.println(i);
        //7.释放资源
        stmt.close();
        conn.close();
    }
}

IDEA运行结果:

mysql中数据结果被java代码改变:

API详解

DriverManager

两个作用:
1.注册驱动(mysql 5 之后可以省略此步)

2.获取数据库连接

Connection

两个作用:
1.获取执行SQL对象

2.管理事务

java里面如何管理事务?使用try catch:
eg:

try {
            //手动开启事务
            conn.setAutoCommit(false);
            //3.定义sql
            String sql1 = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"张三\";";
            String sql2 = "UPDATE trans_money SET trans_money.money = 5000 WHERE trans_money.name = \"李四\";";
            //4.获取执行sql的对象statement
            stmt = conn.createStatement();
            //5.执行sql
            int i1 = stmt.executeUpdate(sql1);//此处的i就是mysql返回的成功操作的行row数
            int i2 = stmt.executeUpdate(sql2);
            //6.处理返回参数
            System.out.println(i1);
            System.out.println(i2);
            //没有问题就commit
            conn.commit();
        } catch (Exception e) {
            //在catch中进行回滚操作
            conn.rollback();
            e.printStackTrace();
        }

没有开启事务时:
开启事务后:

Statement

ResultSet


 //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义一个SQL
        String sql = "SELECT * FROM trans_money;";
        //4.操作sql对象
        Statement stmt = conn.createStatement();
        //5.查询的结果返回一个ResultSet对象
        ResultSet res = stmt.executeQuery(sql);
        //6.遍历出res的内容
        while(res.next()){
            String name = res.getString("name");
            int money = res.getInt("money");

            //打印内容
            System.out.println(name);
            System.out.println(money);
            System.out.println("------------");
        }
        res.close();
        stmt.close();
        conn.close();

ResultSet案例

需求:查询account账号表的数据,封装到Account对象中,并且存储到ArrayList集合中
这是一个常见的业务需求,网页前端展示页面的时候就需要遍历这个集合来展示数据。

第一步先创建一个Account类:

public class Account {
    //创建一个Account实体类
    /*
    * 对java实体类的众多理解:

    A .就是属性类,通常定义在model层里面

    B. 一般的实体类对应一个数据表,其中的属性对应数据表中的字段。
    好处:
    1.对对象实体的封装,体现OO思想。
    2.属性可以对字段定义和状态进行判断和过滤
    3.把相关信息用一个实体类封装后,我们在程序中可以把实体类作为参数传递,更加方便。

    C. 说白了就是为了让程序员在对数据库操作的时候不用写SQL语句

    D. 就是一个数据库表生成一个类
    这样做对数据库操作起来方便
    编写代码较少 提高效率 可以使程序员专注逻辑关系

    E. 实体类就是把对某一个表的操作全写在一个类中.
    */
    private String name;
    private int money;

    public String getName() {
        return name;
    }

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

    public int getMoney() {
        return money;
    }

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

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

第二步,将查询的值封装到Account对象中,并添加到list:

 //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义一个SQL
        String sql = "SELECT * FROM account;";
        //4.操作sql对象
        Statement stmt = conn.createStatement();
        //5.查询的结果返回一个ResultSet对象
        ResultSet res = stmt.executeQuery(sql);
        //6.遍历出res的内容
        List <Account> list = new ArrayList<>();
        while(res.next()){
            Account account = new Account();

            String name = res.getString("name");
            int money = res.getInt("money");

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

            list.add(account);
        }
        System.out.println(list);
        res.close();
        stmt.close();
        conn.close();

运行后完成需求:

PreparedStatemet

作用:

演示SQL注入

假设现在存在这样一个登录界面,我们在登录界面输入的用户名和密码会去到用户表中查询,如果有对应的用户和正确的密码就能成功登录

现在先演示一下正确的操作:

  //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
        String username = "root";
        String password = "1234";
        //IDEA快速生成返回值:ctrl+alt+v
        Connection conn = DriverManager.getConnection(url, username, password);

        //接受用户的输入
        String name = "jack";
        String pwd = "654321";

        //定义SQL语句
        String sql = "SELECT * FROM user_info WHERE username = '"+name+"' AND passcode = '"+pwd+"'";

        //定义执行sql对象
        Statement stmt = conn.createStatement();

        ResultSet res = stmt.executeQuery(sql);

        if (res.next()){
                System.out.println("log success~");
        }else {
                System.out.println("log failed!");
        }

        res.close();
        stmt.close();
        conn.close();

可以看到登录成功:

这时我们去修改用户的输入:

 //接受用户的输入
        String name = "sss";
        String pwd = "' or '1' = '1";

        //定义SQL语句
        String sql = "SELECT * FROM user_info WHERE username = '"+name+"' AND passcode = '"+pwd+"'";

可以看到完全不正确的用户名和密码也登录成功了:

这就是sql注入的危害,因为以上的改了pwd的sql语句其实是这样的:

SELECT * FROM user_info WHERE username = 'sss' AND passcode = '' or '1' = '1'

解决sql注入

//接受用户的输入
        String name = "sss";
        String pwd = "' or '1' = '1";

        //定义SQL语句
        String sql = "SELECT * FROM user_info WHERE username = ? AND passcode = ?";

        //定义执行sql对象
        PreparedStatement preparedStatement = conn.prepareStatement(sql);

        //给参数赋值
        preparedStatement.setString(1,name);
        preparedStatement.setString(2,pwd);

        ResultSet res = preparedStatement.executeQuery();

        if (res.next()){
                System.out.println("log success~");
        }else {
                System.out.println("log failed!");
        }

        res.close();
        preparedStatement.close();
        conn.close();

运行结果登录失败:

原理

数据库连接池

简介


Druid数据库连接池

使用步骤

1.导入jar包druid-1.1.12jar
2.定义配置文件
3.加载配置文件
4.获取数据库连接池对象
5.获取连接

标签:JDBC,res,JAVAWEB,money,name,NOTE04,sql,conn,String
From: https://www.cnblogs.com/zbcgoal/p/17154349.html

相关文章

  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown co
     这里最好写数据库的字段名,userName和username。mybatis是能区分的。但是create_time和createTime。mybatis会认为不一致,这种情况,要把表的真实列名create_time......
  • JAVAWEB学习-实现增删改查-03
    今天继续写之前的没写完的增删改查,完成增和查代码normal1.java1packageTest.test1;23importjavax.servlet.ServletException;4importjavax.servlet......
  • JavaWeb-动力节点
    目录......
  • JAVAWEB-NOTE03-约束、数据库设计、多表查询、事务
    目录约束约束的概念约束的分类约束的演示外键约束数据库设计简介软件研发的步骤数据库设计概念数据库设计的步骤一对多(多对一)多对多一对一多表查询内连接外连接左外连接右......
  • JDBC-连接数据库 第三版 安全-2023-2-25
    避免Sql注入的问题。不用Statement而用PrepareStatement 预编译然后手工赋值setIntorsetString 插入:publicclassTestInsert{publicstaticvoidmain(......
  • JDBC -数据库导入-第二版-2023-2-25
    1、配置资源文件.properties(driver,url,username,password)便于后期更改driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/shop?useUnicode=true&cha......
  • 【新手入门】JDBC+Servlet+jsp【新闻系统的增删改查】:持续学习,持续优化,争取做一个真正
    新闻的增删改查  学习了一些博客知识【结尾会贴上,大家可以参考】在借鉴的基础上又进行了代码的优化,从而实现了CRUD,下面分享我的代码过程:包结构,是为了方便管理,所以我......
  • JAVAWEB-NOTE02-SQL
    目录SQL简介SQL通用语法SQL分类DDL操作数据库操作表navicat连接本地数据库DMLDQL基础查询条件查询分组查询聚合函数分组查询排序查询分页查询SQL简介●英文:Structured......
  • JDBC
    快速入门在模块下新建lib文件夹,将mysql的jar包粘贴进去并右键选择添加为库,范围选择模块库packagejdbc;importjava.sql.Connection;importjava.sql.DriverManager......
  • Javaweb----Maven环境配置
    Maven环境配置maven的作用:写javaweb项目时,自动导入相应的java包。maven的环境变量配置2.1进入maven的官网下载maven:链接地址https://maven.apache.org/download.c......