JDBC~Java中的JDBC概述、连接数据库的注意点、利用PreparedStatement实现增删改

2 篇文章 0 订阅

JDBC概述

JDBC本质是什么?

  • JDBC是SUN公司制定的一套接口(interface)
  • 接口都有调用者和实现者
  • 面向接口调用、面向接口写实现类,这都属于面向接口编程

为啥要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力
多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
建议:
Animal a=new Cat();
//public void feed(Animal a){ //面向父类编程
}
不建议:
Dog d=new Dog();
在这里插入图片描述

  • JDBC编程六步:
    第一步:注册驱动(告诉Java程序要连接的是哪家的数据库)
    第二步:获取链接(表示JVM的进程和数据库进程之间的通道打开,这是进程之间的通信,重量级的,使用完成后一定要关闭)
    第三步:获取数据库操作对象(专门执行SQL语句的对象)
    第四步:执行SQL语句(DQL、DML…)
    第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有需要处理结果集)
    第六步:释放资源(使用完资源后一定要关闭资源。Java和数据库之间属于进程间的通信,开启后一定要关闭)

在这里插入图片描述

连接数据库的几种方式

必须给的信息:

  • 使用哪个数据库驱动
  • url
  • 用户名
  • 密码

加载注册驱动

  • 加载驱动用Class类的forName方法,将驱动类型放进去
  • 注册驱动用DriverManger类的registerDriver方法

填写URL

  • 通过URL选择正确的驱动程序
  • 格式是协议+字协议+主机名+端口号+数据库名+参数,如jdbc:mysql://localhost:3306/db2

连接数据库的方式
方式一

    public static void testConnection1() throws SQLException {
        Driver driver=new com.mysql.cj.jdbc.Driver();
        String url="jdbc:mysql://localhost:3306/atguigudb1?serverTimezone=GMT%2B8";
        Properties info=new Properties();
        info.setProperty("user","root");
        info.setProperty("password","llll");
        Connection conn=driver.connect(url,info);
        System.out.println(conn);
    }

方式二

    public static void testConnection2() throws Exception {
         //1.获取Driver实现类对象,使用反射获得
        Class clazz=Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver=(Driver) clazz.newInstance();
        String url="jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8";
        Properties info=new Properties();
        info.setProperty("user","root");
        info.setProperty("password","llll");
        Connection conn=driver.connect(url,info);
        System.out.println(conn);
    }

方式三

    public static void testConnection3() throws Exception {
        Class clazz=Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver=(Driver) clazz.newInstance();
       String url="jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8";
       String user="root";
       String password="llll";
       //注册驱动
        DriverManager.registerDriver(driver);
        Connection conn=DriverManager.getConnection(url,user,password);
        System.out.println(conn);
    }

方式四

    public static void testConnection4() throws Exception {
        String url="jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8";
        String user="root";
        String password="llll";
        //2.加载Driver  不用显式的注册驱动  其实加载的过程也可以省略
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection con=DriverManager.getConnection(url,user,password);
        System.out.println(con);
    }

方式五

   //把连接数据库的信息放到配置文件中,直接进行连接
    public static void testConnection5() throws Exception {
     //1.读取配置文件中的基本信息
        InputStream is=ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties pros=new Properties();
        pros.load(is);
        String user=pros.getProperty("user");
        String password=pros.getProperty("password");
        String url=pros.getProperty("url");
        String driverClass=pros.getProperty("driverClass");
        Class.forName(driverClass);
        Connection con=DriverManager.getConnection(url,user,password);
        System.out.println(con);
    }

利用JDBC操作数据库

  • 进行增删改查必须借助Statement
  • 但是Statement有弊端(需要拼串+会有SQL注入问题)
  • 所以不用,用PreparedStatement

PreparedStatement

  • 通过Connection对象调用 preparedStatement方法,把SQL语句写在方法参数

在这里插入图片描述

Statement的作用相当于快递员,我们把要执行的SQL写给它,它再把SQL传递给具体的数据库区执行

利用JDBC实现添加(insert)

    public static void testInsert() throws IOException, ClassNotFoundException, SQLException {
        //1.读取配置文件中的4个基本信息
        InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
        Properties pros=new Properties();
        pros.load(is);
        String user=pros.getProperty("user");
        String password=pros.getProperty("password");
        String url=pros.getProperty("url");
        String driverClass=pros.getProperty("driverClass");
         //2.加载驱动
        Class.forName(driverClass);
        //3.获取链接
        Connection con=DriverManager.getConnection(url,user,password);
        //4.预编译Sql语句,返回PreparedStatement的实例
        String sql="insert into account(id,name,balance)values(?,?,?)";
        PreparedStatement ps=con.prepareStatement(sql);
        //5.填充占位符
        ps.setInt(1,6);
        ps.setString(2,"猪小明");
        ps.setDouble(3,50.00);
        //6.执行操作
        ps.execute();
        //7.资源的关闭
        ps.close();
    }

利用JDBC实现删除(delete)

public static void testDelete()  throws Exception{
        //1.获取链接
        Connection connection=JDBCUtils.getConnection();
        //2.预编译sql语句
        String sql="delete from account where id=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,2);
        //3.执行
        statement.execute();
        //4.释放资源
        JDBCUtils.closeResource(connection,statement);
    }

包装相同的代码,实现修改(update)

我们发现用JDBC操作数据库时(增删改),都有相同部分的代码:获得数据库连接、关闭资源.
可以将这两部分代码包装在一个类中,直接调用,简化代码

封装

public class JDBCUtils {
    public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {
        InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
        Properties pros=new Properties();
        pros.load(is);
        String user=pros.getProperty("user");
        String password=pros.getProperty("password");
        String url=pros.getProperty("url");
        String driverClass=pros.getProperty("driverClass");
        //2.加载驱动
        Class.forName(driverClass);
        //3.获取链接
        Connection con= DriverManager.getConnection(url,user,password);
        return con;
    }
    public static void closeResource(Connection conn, Statement ps) throws SQLException {
        ps.close();
        conn.close();
    }
}

修改

 public static  void testUpdate() throws SQLException, IOException, ClassNotFoundException {
        //1.获取链接
        Connection connection= JDBCUtils.getConnection();
        //2.预编译sql语句,返回PreparedStatement的实例
        String sql="update account set name=? where id=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,"冷檬");
        statement.setObject(2,6);
        //执行
        statement.execute();
        //5.关闭资源
        JDBCUtils.closeResource(connection,statement);
    }

利用JDBC实现一个方法增删改

  public static void main(String[] args) throws Exception {
      String sql="delete from account where id=?";
      update(sql,6);
    }
    public static void update(String sql,Object...args)throws Exception{
        //1.获取数据库的连接
        Connection connection=JDBCUtils.getConnection();
        //2.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement statement=connection.prepareStatement(sql);
        //3.填充占位符
        for(int i=0;i<args.length;i++){
            statement.setObject(i+1,args[i]);
        }
        //4.执行
        statement.execute();
        //5.关闭资源
        JDBCUtils.closeResource(connection,statement);
    }
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值