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);

        }

    }


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容