JDBC(数据库连接)

MYSQL 数据库总结:

http://t.csdn.cn/Ka9Vm

JDBC是使用Java语言操作关系型数据库的一套API。

将mysql-connector-j-8.0.32jar复制粘贴到一个新建的目录里,然后右键mysql-connector-j-8.0.32jar,添加为库。

JDBC(数据库连接)_第1张图片

DriverManager

一个工厂类,我们通过它来创建数据库连接。

当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面。

然后我们把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。

package com.ittht.JDBCDemo1;

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

public class DriverManage {
    public static void main(String[] args) throws Exception {
        //1.注册驱动(可省)
        //Class.forName("lib.mysql.jdbc.Driver");
        //2.获得连接
        String url="jdbc:mysql:///test";
        String username="root";
        String word="****";
        Connection conn= DriverManager.getConnection(url,username,word);
        //3.定义sql
        String sql="update jdbc set money=2000 where id=1";
        //4.获取执行SQL的对象
        Statement stmt=conn.createStatement();
        //5.执行SQL的对象
        int count=stmt.executeUpdate(sql);
        //6.处理结果
        System.out.println(count);
        //7.释放
        stmt.close();
        conn.close();
    }
}

Connection

  • 获取执行SQL对象
  • 管理事务

通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接

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

要记得 Connection 的关闭,数据库的连接是有限的,Connection在使用完毕后需要进行关闭。

如果要执行一个事务,例如银行转账,一方的金额减少,另一方金额增多,如果中途出现错误,就需要回滚:

可以使用异常处理机制:try...catch...

开启事务->提交事务->回滚事务

conn.setAutoCommit(false);

conn.commit();

conn.rollback();

在try语句中开启事务和提交事务,如果catch捕获到异常,就回滚。

package com.ittht.JDBCDemo1;

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

public class Demo3Connection {

    public static void main(String[] args) throws Exception {
        //1.注册驱动(可省)
        //Class.forName("lib.mysql.jdbc.Driver");
        //2.获得连接
        String url="jdbc:mysql:///test";
        String username="root";
        String word="****";
        Connection conn= DriverManager.getConnection(url,username,word);
        //3.定义sql
        String sql1 = "update jdbc set money=3000 where id=1";
        String sql2 = "update jdbc set money=3000 where id=2";
        //4.获取执行SQL的对象
        Statement stmt = conn.createStatement();

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

            //5.执行SQL的对象
            int count1 = stmt.executeUpdate(sql1);
            //6.处理结果
            System.out.println(count1);
            int i=1/0;
            //5.执行SQL的对象
            int count2 = stmt.executeUpdate(sql2);
            //6.处理结果
            System.out.println(count2);

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

        }
        catch (Exception throwables){
            //回滚事务
            conn.rollback();
            throwables.printStackTrace();
        }
        //7.释放
        stmt.close();
        conn.close();
    }
}

ResultSet

更新方法:在可滚动的 ResultSet 对象中,可以向前和向后移动指针,将其置于绝对位置或相对于当前行的位置。

可以用来表示数据库查询结果的对象,封装检索出来的结果,并且只能通过其方法对数据进行访问和修改,不能直接对结果集进行修改。

首先是定义一个类,里面定义的用 private 修饰的变量,跟数据表表格的数据是一一对应的。

然后构造 setter和getter 方法,为了方便查询数据,可以重写一个 ToString 方法。

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

    private String id;
    private int money;

     public String getId() {
         return id;
     }

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

     public int getMoney() {
         return money;
     }

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

 }

当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。

 @Test
    public void DemoResultSet() throws SQLException {
        String url="jdbc:mysql:///test";
        String username="root";
        String p="*****";
        Connection conn= DriverManager.getConnection(url,username,p);
        String sql="select * from jdbc";
        Statement stmt=conn.createStatement();
        ResultSet ir=stmt.executeQuery(sql);
        //创建集合
        List list=new ArrayList<>();
        while(ir.next()){

            String id=ir.getString("id");
            int money=ir.getInt("money");
            jdbc j=new jdbc();
            j.setId(id);
            j.setMoney(money);
            list.add(j);
            System.out.println(j);
        }

        ir.close();
        stmt.close();
        conn.close();

    }

PrepareStatement

预编译,性能更高,并且防止sql注入。

SQL注入

在请求的查询字符串中插入SQL命令,最终使服务器执行恶意命令。通过操作输入来修改SQL语句,用以达到执行代码。

        String name = "1233";
        String p= "' or '1'='1";
        String sql = "select * from account where name='" + name + "'and p='" + p+ "'";

这条 sql 输出得到:

select * from account where name='1233'and p='' or '1'='1'

是成立的,所以即使登录的账号和密码错误,也可以成功登录。

设置参数来修改:

        String sql="select * from account where name=? and p=?";
        //获取pstmt对象
        PreparedStatement pstmt=conn.prepareStatement(sql);

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

        //执行sql语句(不用传入sql)
        ResultSet rs=pstmt.executeQuery();
        System.out.println(sql);

将原来传入的语句用?替换,接着设置?的值。

注意:问号的位置是从1开始。

此时输出 sql 语句的得到的是:

select * from account where name=? and p=?

与前面不同的是,在获取 pstmt 对象时,就将 sql 语句传入,后面执行 sql 语句是,就不需要传入 sql了。

数据库连接

数据库连接池是一个容器,负责分配、管理数据库连接。

允许出现重复使用一个现有的数据库连接。

提升系统响应速度,避免数据库连接遗漏。

其中 Druid 是最好的数据库连接池之一。

你可能感兴趣的:(Java,数据库,mysql,sql)