jdbc--Statement和PreparedStatment以及事务

1.什么是JDBC

  JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

2.数据库驱动

  我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。

本文使用的是mysql数据库,需要引用jar包--"mysql-connector-java-5.1.46.jar"。 

 

 下面分别介绍使用JDBC的Statement和PreparedStatment的步骤:

1、 Statement的使用:

public class TestStatment {
    public static void main(String[] args) {

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //1 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2 获取连接
            connection = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/test", "root", "1111");

            //3 创建statment对象
            statement = connection.createStatement();

            //4 执行sql,获取结果集resultSet 
            resultSet = statement.executeQuery("select * from user");

            //5 遍历结果
            //resultSet.next():移动指针,如果指针的位置有值则返回true否则返回false
            while (resultSet.next()) {//遍历行
                // 通过结果集resultSet获取响应的数据
                System.out.println("id:"+resultSet.getInt("id"));
                System.out.println("name:"+resultSet.getString("name"));
            }

            //更新
            int c = statement.executeUpdate("update user set sex='男' where id=2");
            //c 影响行数
            if(c>0){
                System.out.println("更新成功");
            }


        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {


            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            //6 关闭statment
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            //7 关闭连接
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

2、 PreparedStatment的使用

public class TestPreparedStatment {
    public static void main(String[] args) {

        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            //1 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2 获取连接
            connection = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/test", "root", "1111");

            //3 创建statment对象
            //参数使用占位符"?"
             preparedStatement = connection.prepareStatement("select * from user where id=?");

            // 将上面的sql语句中的第一个"?"用数值5代替
            preparedStatement.setInt(1,5);

            //4 执行sql
            resultSet =  preparedStatement.executeQuery();

            //5 遍历结果
            //resultSet.next():移动指针,如果指针的位置有值则返回true否则返回false
            while (resultSet.next()) {//遍历行
                System.out.println("id:"+resultSet.getInt("id"));
                System.out.println("name:"+resultSet.getString("name"));
            }

            //更新
            //参数使用占位符?
            //preparedStatement好处:sql可以预编译,重复利用。提高应用执行速度
            preparedStatement = connection.prepareStatement("update user set sex=? where id=?");

            // 将上面的sql语句中的第一个"?"用字符串"man"代替
            preparedStatement.setString(1,"man");
            // 将上面的sql语句中的第二个"?"用数值5代替
            preparedStatement.setInt(2,5);

            int c = preparedStatement.executeUpdate();
            //c 影响行数
            if(c>0){
                System.out.println("更新成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            //6 关闭statment
            try {
                // statement.close();
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            //7 关闭连接
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

PreparedStatment相比较与Statement,使用了预编译,语句可以重复利用,提高应用执行速度。

 

 3、jdbc事务相关操作

/**
 * jdbc事务操作
 */
public class TestTransaction {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {

            //1 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2 获取连接
            connection = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/test", "root", "1111");

            //设置事务非自动提交(默认是自动提交)
            //开启事务
            connection.setAutoCommit(false);

            //3 创建statment对象
            preparedStatement = connection
                    .prepareStatement("select * from user where id=? for update");

            preparedStatement.setInt(1,5);

            //4 执行sql
            resultSet =  preparedStatement.executeQuery();

            //5 遍历结果
            //resultSet.next():移动指针,如果指针的位置有值则返回true否则返回false
            while (resultSet.next()) {//遍历行
                System.out.println("id:"+resultSet.getInt("id"));
                System.out.println("name:"+resultSet.getString("name"));
            }

            //更新
            //参数使用占位符?
            //preparedStatement好处:sql可以预编译,重复利用。提高应用执行速度
            preparedStatement = connection
                    .prepareStatement("update user set sex=? where id=?");
            preparedStatement.setString(1,"man1");
            preparedStatement.setInt(2,5);
            int c = preparedStatement.executeUpdate();
            //c 影响行数
            if(c>0){
                System.out.println("第一个sql更新成功");
            }

            //更新
            //参数使用占位符?
            //preparedStatement好处:sql可以预编译,重复利用。提高应用执行速度
            preparedStatement.setString(1,"man2");
            preparedStatement.setInt(2,6);
             c = preparedStatement.executeUpdate();
            //c 影响行数
            if(c>0){
                System.out.println("第二个sql更新成功");
            }

            // 如果没有异常,则直接提交事务
            connection.commit();//提交事务

        } catch (SQLException e) {
            try {
                // 如果上面的代码有异常,则进入catch块中回滚事务
                connection.rollback();//回滚事务
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            try {
                connection.rollback();//回滚事务
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            //6 关闭statment
            try {
                //statement.close();
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            //7 关闭连接
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

你可能感兴趣的:(Java,jdbc,Statement)