24 jdbc

Java DataBase Connectivity (java语言链接数据库)

image-20210908205313829

properties文件中的内容是
className=MySql

ResourceBundle bundle=ResourceBundle.getBundle("jdbc);
String className=bundle.getString("className");
Class c=Class.forName(className);
JDBC jdbc=(JDBC)c.newInstance();   
jdbc.getConnection();                                               

jdbc 环境变量,针对文本编辑器.

image-20210908213805418

用idea 不需要配置这个,用自己的配置方式.

jdbc 编程6步

image-20210908215426747

image-20210908220506270

image-20210908220601596

image-20210908221400638

遍历结果集&& 6步连接操作

注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//因为参数是字符串,可以通过properties文件获取
//以下方法不需要接受返回值,因为只想静态代码块加载
Class.forName("com.mysql.jdbc.Driver");
获取连接
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/zzy","root","222222");
获取数据库中的操作对象
stmt=conn.createStatement();
//jdbc中的sql语句不需要分号结尾
String sql="delete from dept where deptno =40";
//增删改的时候
int count=stmt.executeUpdate(sql);
​
System.out.println(count==1?"执行成功":"失败");
​
//查语句的时候
String sql="select empno as a,ename,sal from emp";
ResultSet rs=stmt.executeQuery(sql);
​
​
    while(rs.next()){
        /*String empno=rs.getString(1);//不管数据库中的类型是啥,取出来都是String,jdbc中所有下标从1开始.不是从0开始
        String ename=rs.getString(2);
        String sal=rs.getString(3);
        */
        
        以列名获取
        int  empno=rs.getInt("a");//因为前面列名变化了叫a 所以这里也是a
        String ename=rs.getString("ename");
        double sal=rs.getDouble("sal");
        
        System.out.println(empno+" "+ename+" "+ sal);
    }
}
​
​
释放资源按照后开先关 依次执行
    
    
Class.forName("com.mysql.jdbc.Driver")                         ;'
 Connection conn=DriverManager.getConnection();
Statement stmt=conn.createStatement();
int count=stmt.executeUpdate(sql语句);
stmt.close();
conn.close()
​
                            
                            

image-20210909115909632

image-20210909120016963

ResultSet是结果集,但和集合没有关系!

rs.next();返回boolean

使用idea 配置mysql驱动

image-20210909135020789

image-20210909135106256

image-20210909135126707

导入模块

image-20210909135149723

使用powerDesign 进行数据库的设计

注意保存的格式是ansi 格式 得把.sql脚本再通过记事本另存为utf-8

但是再docs命令中是gbk 所以中文还是乱码.

在navicat中是正确的

功能业务

image-20210909221006639

pa

1.JDBC是什么

2.jdbc的本质是什么?

多态:

Animal a = new Cat ( ) --》面向抽象编程

父类型的引用 指向 子类型的对象

3.开发前准备工作

4.jdbc 过程

注册驱动方式两种

使用资源绑定器绑定属性配置文件

URL解析

5.遍历结果集

idea

导入.jar包

字符串中拼变量

(sql)单引号中 加双引号 加两个加号++ 加号里面加变量

解决Sql注入问题

image-20210910115015329

image-20210910115720232

PreparedStatement预编译

其中一个问号 表示一个占位符,占位符不能使用单引号括起来

image-20210910114018685

4查(SELECT)

第四步用 rs = ps.executeQuery(“字段”);

增删改(INSERT DELETE UPDATE)

第四步用 rs= ps.executeUpdate(“字段”);

框架(select)

public static void main(String[] args){
    Connection conn = null;
    PreparedStatement ps = null;//加d是名词
    ResultSet rs = null;
​
    try {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/codeyuaiiao?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8","root","3615yuhaijiao");
        //3.获取预编译的数据库操作对象
        String sql = "select * from student";
        ps = conn.prepareStatement(sql);//动词
        //4.执行sql语句
        rs = ps.executeQuery();//查询select
        //rs = ps.executeUpdate();//增删改都是用Update(INSERT DELETE UPDATE)
        //5.处理查询结果集
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        //6.释放资源
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

用preparedStatement完整代码

Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //注册驱动
​
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/zzy?useSSL=true","root","222222");
            //获取预编译的数据库操作对象
            String sql="insert into dept(deptno,dname,loc) value(?,?,?)";
​
            ps= conn.prepareStatement(sql);
            ps.setInt(1,41);
            ps.setString(2,"销售");
            ps.setString(3,"上海");
​
            //执行sql
​
            int count=ps.executeUpdate();
            
            //如果是select 语句返回的是ResultSet
            //rs=ps.executeQuery(); 括号中不需要sql,输入输了,那就再编译了没有必要!
            
            
            System.out.println(count==1?"chenggong":"shibai");
//            while(rs.next())
//            {
//                System.out.println(rs.getString(1));
//            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

事务三件套 (开启 提交 回滚)

conn.setAutoCommit(false); 关闭自动提交 开启事务

conn.commit(); 手动提交

conn.rollback(); catch中写 回滚

if(conn != null){

try{

conn.rollback();

}catch(sqlException e1){

e1.printStackTrace();

}

}

image-20210910170106412

JDBC 工具类DButil

public class DBUtil {
    /**
     * 工具类中的构造方法都是私有的
     * 因为工具类当中的方法都是静态的,不需要new对象
     */
    private DBUtil(){ //构造方法私有化,防止调用,因为只需要调用静态方法就行了
​
    }
    //静态代码块在类加载时执行,并且只执行一次.
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public  static Connection getConnection() throws SQLException{
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/zzy","root","222222");
    }
​
    /**
     *
     * @param conn 连接对象
     * @param stmt 数据库操作对象
     * @param rs    结果集
     */
    public  static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace(); 
            }
        }
    }
​
}

工具类的调用

Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
    conn=DBUtil.getConnection();
    String sql="select ename from emp where ename like ? ";
    ps=conn.prepareStatement(sql);
    ps.setString(1,"A%");
    rs=ps.executeQuery();
​
    while (rs.next())
    {
        System.out.println(rs.getString("ename"));
    }
​
} catch (SQLException e) {
    e.printStackTrace();
}finally {
    DBUtil.close(conn,ps,rs);
}

行级锁 (for Update)

悲观锁:事务没结束之前,事务必须排队,一整行记录不准改动,不允许并发。

乐观锁:支持并发,事务不排队,需要一个版本号。一个事务发现前后的版本号不一致了 就执行回滚操作 ,本次操作不执行。

image-20210910203622937

代码 1

public static void main(String[] args) {
    Connection conn=null;
    PreparedStatement ps=null;
    ResultSet rs=null;
    try {
        conn = DBUtil.getConnection();
        conn.setAutoCommit(false);
        String sql="select ename,job,sal from emp where job= ?  for update ";
        ps = conn.prepareStatement(sql);
        ps.setString(1,"manager");
         rs = ps.executeQuery();
        while(rs.next())
        {
            System.out.println(rs.getString("ename")+" "+ rs.getString("job") +" " +rs.getString("sal"));
        }
​
        conn.commit();
    } catch (SQLException e) {
        if (conn != null) {
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
​
        e.printStackTrace();
​
    }finally {
        DBUtil.close(conn,ps,rs);
    }
​
}

代码2

Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
    conn=DBUtil.getConnection();
    conn.setAutoCommit(false);
    String sql="UPDATE  emp SET sal=sal*9.9 where job=?";
    ps=conn.prepareStatement(sql);
    ps.setString(1,"manager");
​
    int i = ps.executeUpdate();
    System.out.println(i);
​
    conn.commit();
} catch (SQLException e) {
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
    e.printStackTrace();
}finally {
    DBUtil.close(conn,ps,rs);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值