JDBC那些事

一JDBC概述

Java提供的一套用来操作数据的接口

二如何获取数据库的连接

1.获取数据库连接的必要条件

/*
	①数据必须是正常的在运行。
	②数据库的账号和密码必须正确
	③提供正确的驱动程序
*/

2.方式一:Driver

 //多态:创建驱动程序的对象
Driver driver = new com.mysql.jdbc.Driver();
//获取mysql连接对象
Properties info = new Properties();
info.setProperty("user","root");//mysql账号
info.setProperty("password","123321");//mysql密码
/*
         jdbc:mysql://localhost:3306/myemployees
          jdbc:mysql : 协议
          localhost :mysql所在的机器的ip地址
          3306 :mysql的端口号
          myemployees:库名
         */
String url = "jdbc:mysql://localhost:3306/myemployees";
Connection connect = driver.connect(url, info);//mysql连接地址

System.out.println(connect);

3.方式二:DriverManager

//多态:创建驱动程序的对象 -- 注意:mysql的Driver类中在静态代码块中已经注册了驱动
Driver driver = new com.mysql.jdbc.Driver();
//注册驱动
DriverManager.registerDriver(driver);
//获取连接对象
Connection con =
    DriverManager.getConnection("jdbc:mysql://localhost:3306/myemployees",
                                "root", "123321");
System.out.println(con);

4.方式三:读取配置文件

  		FileInputStream fis = null;
        Connection con = null;
        try {
            Properties properties = new Properties();
            fis = new FileInputStream("jdbc.properties");
            properties.load(fis);
            String driver = properties.getProperty("driver");
            String url = properties.getProperty("url");
            String user = properties.getProperty("user");
            String password = properties.getProperty("password");

            //通过读取配置文件内容获取数据库连接对象
            Class.forName(driver);
            //获取连接对象
            con = DriverManager.getConnection(url, user, password);
            System.out.println(con);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (con != null){
                try {
                    con.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }

三 对数据库增删改查操作

 /*
        修改数据
     */
    @Test
    public void test3() throws SQLException {
        //1.获取数据库接对象
        Connection connection = JDBCUtils.getConnection();
        //2.预编译
        String sql = "update s set age=? where id=?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //3.给占位符赋值
        ps.setInt(2,1);
        ps.setInt(1,28);
        //4.执行sql语句
        int i = ps.executeUpdate();
        System.out.println(i + "条受到影响");
        //5.关闭资源
        JDBCUtils.close(connection,ps);
    }

    /*
        删除数据
     */
    @Test
    public void test2() throws SQLException {
        //1.获取数据库接对象
        Connection connection = JDBCUtils.getConnection();
        //2.预编译
        String sql = "delete from s where id=?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //3.给占位符赋值
        ps.setInt(1,1);
        //4.执行sql语句
        int i = ps.executeUpdate();
        System.out.println(i + "条受到影响");
        //5.关闭资源
        JDBCUtils.close(connection,ps);
    }

    /*
        插入数据
     */
    @Test
    public void test() throws SQLException {
        //1.获取数据库连接对象
        Connection connection = JDBCUtils.getConnection();
        //2.预编译
        String sql = "insert into s(id,name,age) values(?,?,?)";//数据用?替代。?叫作占位符
        PreparedStatement ps = connection.prepareStatement(sql);
        //3.给占位符设置数据
        //setInt(int parameterIndex, int x) : 第一个参数:第几个占位符 第二个参数:设置的数据
        ps.setInt(1,2);
        ps.setString(2,"longge");
        ps.setInt(3,20);
        //4.执行sql语句
        /*
            executeUpdate() :用来执行 增,删,改的操作 返回所影响数据的条数
         */
        int i = ps.executeUpdate();
        System.out.println(i + "条受到影响");
        //5.关资源
        JDBCUtils.close(connection,ps);
    }

   /*
       获取多行数据
    */
    public List<Student> getStudents() throws SQLException {
        Connection connection = JDBCUtils.getConnection();
        PreparedStatement ps =
                connection.prepareStatement("select id,name,age from s");
        /*
            executeQuery() : 执行查询语句
         */
        ResultSet resultSet = ps.executeQuery();
        //创建一个集合用来存对象
        List<Student> list = new ArrayList<>();
        //遍历数据
        while(resultSet.next()){//判断是否有数据
            //获取数据
            //getInt(String columnLabel) : 参数是字段名称
            //getInt(int columnIndex) :参数是字段的索引
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            //封装成对象
            list.add(new Student(id,name,age));
        }
        //关闭资源
        JDBCUtils.close(connection,ps,resultSet);
        return list;//没有数据就return null
    }

    /*
        获取单行数据
     */
    public Student getStudent() throws SQLException {
        Connection connection = JDBCUtils.getConnection();
        PreparedStatement ps =
                connection.prepareStatement("select id,name,age from s where id=?");
        ps.setInt(1,2);
        /*
            executeQuery() : 执行查询语句
         */
        ResultSet resultSet = ps.executeQuery();
        //遍历数据
        while(resultSet.next()){//判断是否有数据
            //获取数据
            //getInt(String columnLabel) : 参数是字段名称
            //getInt(int columnIndex) :参数是字段的索引
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            //封装成对象
            return new Student(id,name,age);
        }
        //关闭资源
        JDBCUtils.close(connection,ps,resultSet);
        return null;//没有数据就return null
    }

四 SQL注入


五 批处理

(1)在url中加一个参数

jdbc:mysql://localhost:3306/myemployees?rewriteBatchedStatements=true

(2)调用方法

//添加到批处理中
ps.addBatch();
//执行sql语句
ps.executeBatch();
//清空批处理
ps.clearBatch();

(2)代码

//1.获取数据库的连接对象
Connection connection = JDBCUtils.getConnection();
//2.预编译
String sql = "insert into s(id,name,age) values(?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
//3.设置数据
for (int i = 1; i <= 100000; i++) {
    ps.setInt(1,i);
    ps.setString(2,i+"");
    ps.setInt(3,i);
    //添加到批处理中
    ps.addBatch();
    if (i % 1000 == 0) {
        //执行sql语句
        ps.executeBatch();
        //清空批处理
        ps.clearBatch();
    }
}
//4.关闭资源
JDBCUtils.close(connection,ps);

六 事务

/*
事务的ACID(acid)属性    
1. 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 
2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性(Isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
*/
//1.获取数据库连接对象
Connection connection = JDBCUtils.getConnection();
//2.禁止自动提交
connection.setAutoCommit(false);
try{
    //3.转账的操作
    String sql = "update account set balance=? where account=?";
    PreparedStatement ps = connection.prepareStatement(sql);
    //设置1100的账户
    ps.setInt(1,900);
    ps.setInt(2,1100);
    ps.executeUpdate();

    System.out.println(1 / 0);

    //设置2200的账户
    ps.setInt(1,1100);
    ps.setInt(2,2200);
    ps.executeUpdate();

    //提交
    connection.commit();

}catch (Exception e){
    e.printStackTrace();
    //事务回滚
    connection.rollback();
}finally {
    //把禁止提交恢复原来的状态
    connection.setAutoCommit(true);

    if (connection != null){
        connection.close();
    }

}

七 连接池

1、什么是数据库连池

​ 连接对象的缓冲区。负责申请,分配管理,释放连接的操作。

2、为什么要使用数据库连接池

通过DriverManager获取新连接,用完直接抛弃断开,连接的利用率太低,太浪费。
对于数据库服务器来说,压力太大了。

3、阿里的德鲁伊连接池技术

    /*
        方式二 : 读取配置文件的方式
            注意:配置文件中的key不能随意修改
            url=jdbc:mysql://localhost:3306/myemployees
            username=root
            password=123321
            driverClassName=com.mysql.jdbc.Driver
     */
    @Test
    public void test2() throws Exception {
        //1.创建Properties的对象
        Properties p = new Properties();
        //2.加载流
        p.load(new FileInputStream("druid.properties"));
        //3.创建DataSource的对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(p);
        //4.获取连接对象
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }

    /*
        方式一
     */
    @Test
    public void test() throws SQLException {
        //创建DruidDataSource的对象
        DruidDataSource ds = new DruidDataSource();
        //设置参数
        ds.setUrl("jdbc:mysql://localhost:3306/myemployees");
        ds.setUsername("root");
        ds.setPassword("123321");
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        //获取连接对象
        Connection connection = ds.getConnection();
        System.out.println(connection);
    }

八 JDBCUtils

1.配置文件内容

/*
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myemployees?rewriteBatchedStatements=true
user=root
password=123321
*/

2.代码

public class JDBCUtils {

    private static FileInputStream fis = null;
    private static String driver = null;
    private static String url = null;
    private static String user = null;
    private static String password = null;

    /*
        静态代码块 :读取配置文件中的内容
     */
    static{
        try {
            Properties properties = new Properties();
            fis = new FileInputStream("jdbc.properties");
            properties.load(fis);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            //通过读取配置文件内容获取数据库连接对象
            Class.forName(driver);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static Connection getConnection(){
        //获取连接对象
        Connection con = null;
        try {
            con = DriverManager.getConnection(url, user, password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return con;
    }

    public static void close(Connection connection, PreparedStatement ps, ResultSet rs) {
       close(connection,ps);
       if (rs != null){
           try {
               rs.close();
           } catch (SQLException throwables) {
               throwables.printStackTrace();
           }
       }
    }

    public static void close(Connection connection, PreparedStatement ps) {
        if (connection != null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        if (ps != null){
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

九 DBUtils

public class DBUtilsTest {
    /*
        使用DBUtils实现增,删,改,查的功能
     */

    /*
        查询数据

        注意:Javabean中的字段名称和类型必须和表中的字段类型保持一致。
            如果Javabean中的字段名和表中的字段名不一一致,可以采用别名的方式进行解决。
     */
    @Test
    public void test4() throws SQLException {
        //创建QueryRunner的对象
        QueryRunner queryRunner = new QueryRunner();
        //sql语句
        String sql = "select id as sid,name,age from s where id = ?";
        Student student = queryRunner.query(JDBCUtils.getConnection(), sql,
                new BeanHandler<Student>(Student.class), 1);
        System.out.println(student);
    }
    @Test
    public void test5() throws SQLException {
        //创建QueryRunner的对象
        QueryRunner queryRunner = new QueryRunner();
        //sql语句
        String sql = "select id,name,age from s";
        List<Student> query = queryRunner.query(JDBCUtils.getConnection(), sql,
                new BeanListHandler<Student>(Student.class));
        //遍历
        for (Student s : query) {
            System.out.println(s);
        }
    }

    /*
       修改数据
    */
    @Test
    public void test3() throws SQLException {
        //创建QueryRunner的对象
        QueryRunner queryRunner = new QueryRunner();
        //update()用来执行增,删,改的方法
        String sql = "update s set name=? where id=?";
        int update = queryRunner.update(JDBCUtils.getConnection(), sql,"cang",1);
        System.out.println(update + "条数据受到影响");
    }

    /*
        添加数据
     */
    @Test
    public void test2() throws SQLException {
        //创建QueryRunner的对象
        QueryRunner queryRunner = new QueryRunner();
        //update()用来执行增,删,改的方法
        String sql = "insert into s(id,name,age) values(?,?,?)";
        int update = queryRunner.update(JDBCUtils.getConnection(), sql,3,"long",30);
        System.out.println(update + "条数据受到影响");
    }

    /*
        删除
     */
    @Test
    public void test() throws SQLException {
        //创建QueryRunner的对象
        QueryRunner queryRunner = new QueryRunner();
        //update()用来执行增,删,改的方法
        String sql = "delete from s";
        int update = queryRunner.update(JDBCUtils.getConnection(), sql);
        System.out.println(update + "条数据受到影响");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值