JavaWeb从入门到入土第五天

JDBC

概念:Java DateBase Connectivity JAVA数据库连接
JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
JDBC
使用步骤:
1.导入驱动jar包
2.注册驱动
3.获取数据库连接对象Connection
4.定义sql
5.获取执行sql语句的对象Statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源

代码实现

public class jdbcDemo1 {
    public static void main(String[] args) throws Exception {
        //导入驱动jar包
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
        //定义sql语句
        String sql = "update account set balance = 500 where id = 1";
        //获取执行sql的对象Statement
        Statement statement = conn.createStatement();
        //执行sql
        int count = statement.executeUpdate(sql);
        //处理结果
        System.out.println(count);
        statement.close();
        conn.close();
    }
}

详解各个对象

1.DriverManager:驱动管理对象
功能:
(1)注册驱动:Class.forName(“com.mysql.jdbc.Driver”);
通过查看源码发现在com.mysql.jdbc.Driver存在静态代码块
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤

(2)获取数据库连接:
方法:static Connection getConnection(String url, String user, String password)
参数:
url:指定连接的路径,语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
user:用户名
password:密码

2.Connection:数据库连接对象
功能:
(1)获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)

(2)管理事务:
开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()

3.Statement:执行sql的对象
(1)执行sql:
boolean execute(String sql):可以执行任意的sql
int executeUpdate(String sql):可以执行DML(insert、update、delete)语句,DDL(create, alter,drop)语句 这里返回值为影响的行数
ResultSet executeQuery(String sql):执行DQL(select)语句

4.ResultSet:结果集对象
next():游标向下移动一行
getXxx():获取数据
Xxx:代表数据类型 如:int getInt()
参数:int:代表列的编号,从1开始。 如:getString(1)
String:代表列的名称。 如:getDouble(“balance”)
使用步骤:
1.游标向下移动一行
2.判断是否有数据
3.获取数据

5.PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。
(1)注入用户随便,输入密码:a’ or ‘a’ = 'a
(2)sql:select *from user where username = ‘fasdfdas’ and password = ‘a’ or ‘a’ = ‘a’
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的SQL:参数使用?作为占位符

练习

查询emp表的数据将其封装为对象。然后装载集合,返回。

package cn.itcast.jdbc;

import cn.itcast.domain.Emp;

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

/**
 * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
 */
public class jdbcDemo8 {

    public static void main(String[] args) {
        List<Emp> list = new jdbcDemo8().findAll();
        System.out.println(list);
    }

    /**
     *查询所有emp对象
     * @return
     */
    public List<Emp> findAll(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet resultSet = null;
        List<Emp> list = null;
        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
            //定义sql
            String sql = "select * from emp";
            //获取执行sql的对象
            stmt = conn.createStatement();
            //执行sql
            resultSet = stmt.executeQuery(sql);
            //遍历结果集
            Emp emp = null;
            list = new ArrayList<>();
            while (resultSet.next()){
                //获取数据
                int id = resultSet.getInt("id");
                String ename = resultSet.getString("ename");
                int job_id = resultSet.getInt("job_id");
                int mgr = resultSet.getInt("mgr");
                Date joindate = resultSet.getDate("joindate");
                double salary = resultSet.getDouble("salary");
                double bonus = resultSet.getDouble("bonus");
                int dept_id = resultSet.getInt("dept_id");
                //创建emp对象
                emp = new Emp();
                emp.setId(id);
                emp.setBounds(bonus);
                emp.setDept_id(dept_id);
                emp.setEname(ename);
                emp.setJob_id(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);

                //装载集合
                list.add(emp);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        finally {
            if (resultSet != null){
                try {
                    resultSet.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }

            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }

            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        return list;
    }
}

抽取jdbc工具类:JDBCUtils

目的:简化书写

JDBC管理事务:

1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个步骤要么同时成功,要么同时失败。
2.操作:
(1)开启事务:在执行sql之前开启事务
(2)提交事务:当所有sql都执行完提交事务
(3)回滚事务:在catch中回滚事务
3.使用Connection对象来管理事务


版权声明:本文为weixin_49131718原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。