2019-05-17JDBC

回顾:

脏读:未提交事务的数据

不可重复读:已提交数据 update

幻读或者虚读:已经提交了数据的行数 insert delete

JDBC介绍(掌握)

核心API

1.DriverManager 驱动管理类

2.connection连接接口

3.Statement 发送SQL语句的接口 Statement的子接口PreparedStatement 预编译接口,防止SQL注入问题

4.ResultSet 结果集 接收查询的数据

JDBC编程六步(掌握)

注册驱动

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

数据库获取连接

使用驱动管理类DriverManager中的静态方法:

        static Connection getConnection(String url, String user, String password)试图建立到给定数据库 URL 的连接。


参数:

                    url -连接数据库的地址

                        url整体格式:jdbc:mysql://连接数据库服务器的ip地址:连接数据库的端口号/具体的数据库名

                    user -数据库用户,root

                    password -用户的密码1234

 */

//2.获取和数据库的连接String url = "jdbc:mysql://localhost:3306/day04_db";//连接数据库的地址String user = "root";//数据库用户String password = "1234";//用户的密码Connection conn = DriverManager.getConnection(url, user, password);

获取发送SQL语句对象

使用驱动管理类DriverManager中的静态方法:

        static Connection getConnection(String url, String user, String password)试图建立到给定数据库 URL 的连接。


参数:

                    url -连接数据库的地址

                        url整体格式:jdbc:mysql://连接数据库服务器的ip地址:连接数据库的端口号/具体的数据库名

                    user -数据库用户,root

                    password -用户的密码1234

 */

//2.获取和数据库的连接String url = "jdbc:mysql://localhost:3306/day04_db";//连接数据库的地址String user = "root";//数据库用户String password = "1234";//用户的密码Connection conn = DriverManager.getConnection(url, user, password);

3.获取Statement对象

在java.sql.Connection接口中有如下方法获取到Statement对象

Statement的API介绍

int executeUpdate(String sql)

根据执行的DML(insert、update、delete)语句,发挥影响的行数

2.resultSet excuteQuery(String sql)

根据执行的结果集,只能执行select语句

注意:在MySQL中,只要不是查询就是修改。

executeUpdate:用于执行增删改

executeQuery:用于执行查询

使用步骤

1.注册驱动

2。获取连接

3.获取Statement对象

4.使用Statement对象执行SQL语句

5.释放资源

JDBC实现对单标查询

Result原理

1.ResultSet内部有一个指针,开始记录开始位置

2.调用next方法,ResultSet内部指针就会移动到下一行数据

3.我们可以通过ResultSet得到一行数据getXxx得到某列数据

public class Demo04 {

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

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

Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");

Statement stmt = conn.createStatement();

SString sql = "select * from user";

ResultSet rs = stmt.executeQuery(sql);

// 内部有一个指针,只能取指针指向的那条记录

        while(rs.next()){// 指针移动一行,有数据才返回true

int id = rs.getInt("id");

String name = rs.getString(2);

String pwd= rs.getString(3);

System.out.println(id+"+++"+name+"++++"+pwd);

}

// 关闭资源

rs.close();

stmt.close();

conn.close();

}

}


JDBC事务

开启事务(coon.setAutoCommit(false))——>执行一组SQL语句——>一切正常提交事务 coon.commit();


开启事务(coon.setAutoCommit(false))——>执行一组SQL语句——> 出现异常,回滚事务coon.rollback;

Connection 接口中与事务有关的方法

void setAutoCommit(boolean autoCommit)throws SQLException;

false:开启事务,true:关闭事务

voidcommit()throwsSQLException;

提交事务

voidrollback()throwsSQLException;

回滚事务

注意:在jdbc事务操作中,事务的控制都是通过Connection对象完成的,当一个完整的业务操作前,我们首先使用coon.setAutoCommit(false)来开启事务。默认情况下是true的,表示关闭事务,那么一条SQL语句就是一个事务,默认提交事务。如果设置为false,那么表示开启事务,所有的SQL语句就会都在一个事务中。

当业务操作完成后,如果整个操作没有问题,我们需要使用coon.commmit()来提交事务。当然了,如果出现了异常,我们需要使用coon.rollback()撤销所有的操作,所以出现事务的异常,需要进行事务的回滚。

使用步骤

1.注册驱动

2.获取连接

3.开启事务

4.获取Statement

5.使用Statement执行SQL

6.提交或回滚事务

7.关闭资源

package com.day04;

import com.mysql.jdbc.Driver;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

public class JDBC {

public static void main(String[] args)throws SQLException, ClassNotFoundException {

/* DriverManager.registerDriver(new Driver());

使用 DriverManager.registerDriver(new Driver());,存在以下不足,注册被注册两次

*/

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

//获取连接

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04_db","root","root");

System.out.println(connection);

//从连接中拿到一个Statement对象

        Statement statement = connection.createStatement();

//1.插入记录

/*String sql ="insert into user values(null,'zhaoliu','abc')";

int i=statement.executeUpdate(sql);

System.out.println("影响的行数:"+i );*/

//2.修改记录

/*  String  sql="update user set  username='tianqi'where username='zhaoliu'";

int  i=statement.executeUpdate(sql);

System.out.println("影响的行数:"+i );*/

//删除记录

        String sql ="delete from user where id=4";

int i=statement.executeUpdate(sql);

System.out.println("影响的行数:"+i );

statement.close();

connection.close();

}

}


编写JDBC工具类

在目录下创建jdbc.properties

jdbc.properties文件中的配置信息

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/day04_db

user=root

password=root

如何读取外部文件的内容?

public static void main(String[]args) {

        // 需求: 通过properties对象读取 外部配置的内容

        Propertiesprop=newProperties();

        try{

//对于FileInputStream流相对的路径是当前模块

FileInputStreamin=newFileInputStream("jdbc.properties");

            // 加载外部的配置文件

            prop.load(in);

        }catch(IOExceptione) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        // 读取外部配置文件的内容

        StringdriverClass=prop.getProperty("driverClass");

        Stringurl=prop.getProperty("url");

        Stringuser=prop.getProperty("user");

        Stringpassword=prop.getProperty("password");

        System.out.println(driverClass);

    }

获得连接的最终版

public class JDBCUtils {

static String driverClass = null;

static String url = null;

static String user = null;

static String password = null;

static {

// 需求: 通过properties对象读取 外部配置的内容

Properties prop = new Properties();

try {

FileInputStream in=new FileInputStream("jdbc.properties");

// 加载外部的配置文件

prop.load(in);

// 读取外部配置文件的内容

    driverClass = prop.getProperty("driverClass");

    url = prop.getProperty("url");

    user = prop.getProperty("user");

    password = prop.getProperty("password");

// 注册驱动

Class.forName(driverClass);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

// 获得连接

public static Connection getConnection() {

Connection con = null;

  try  {

          con = DriverManager.getConnection(url, user, password);

        } catch (Exception e)

{

        e.printStackTrace();

        }

        return con;

}

}

关闭资源

public static void release(Connection conn, Statement stmt, ResultSet rs) {

// 释放资源

try {

if (rs != null) {

rs.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

if (stmt != null) {

stmt.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

if (conn != null) {

conn.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

优化后的delete方法

@Test

    publicvoiddelete() {

        // 需求: 删除id=3的记录

        Connectionconn=null;

        Statementstmt=null;

        try{

            // 获得连接

            conn=JDBCUtils.getConnection();

            // 获得发送sql的对象

            stmt=conn.createStatement();

            // 执行sql 获得结果

            Stringsql="delete from user where id=3";

            intsum=stmt.executeUpdate(sql);

            // 处理结果

            System.out.println(sum);

        }catch(Exceptione) {

            e.printStackTrace();

        }finally{

            // 释放资源

            JDBCUtils.release(conn,stmt,null);

        }

    }


你可能感兴趣的:(2019-05-17JDBC)