JAVA--JDBC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caoshiminYQS/article/details/86546160

配置文件:

driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306
database=/day20
user=root
password=root

User实体类:

package yanqiushi;

public class User {
    private String uname;
    private int id;
    private int age;
    private String loc;


    public User() {
    }

    public User(String uname, int id, int age, String loc) {
        this.uname = uname;
        this.id = id;
        this.age = age;
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", id=" + id +
                ", age=" + age +
                ", loc='" + loc + '\'' +
                '}';
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }
}

JdbcUtil

package com.yanqiushi;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class JdbcUtil {
    private static String FILE_NAME = "src/jdbc.properties";
    private static String url;
    private static String database;
    private static String user;
    private static String password;
    static{
        try {
            Properties properties = new Properties();
            properties.load(new FileReader(FILE_NAME));
            String driverName = properties.getProperty("driverName");
            url = properties.getProperty("url");
            database = properties.getProperty("database");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage() + "\n\t\t" + "请将配置文件jdbc.properties放置到src目录下");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection(){
        try {
            Connection connection = DriverManager.getConnection(url+database,user,password);
            return connection;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void execute(ExecuteInter executeInter){
        try {
            Connection connection = getConnection();
            executeInter.execute(connection).close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void showRS(ResultSet resultSet){
        try {
            while (resultSet.next()){
                System.out.print(resultSet.getString(1) + "\t");
                System.out.print(resultSet.getString(2) + "\t");
                System.out.print(resultSet.getString(3) + "\t");
                System.out.print(resultSet.getString(4) + "\t");
                System.out.println();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet resultSet,Statement statement,Connection connection){
        if (resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement != null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(Statement statement,Connection connection){
        close(null,statement,connection);
    }
    public static void close(Connection connection){
        close(null,connection);
    }
    public static void close(){
        close(null);
    }
}

测试1(六步):

package com.yanqiushi;

import com.mysql.jdbc.Driver;

import java.sql.*;

public class Main1 {
    /*
        JDBC, 全称:
                Java Database Connection
                Java对数据库的连接规范

                mysql-connector-java-5.1.18-bin.jar
                这个jar包,我们叫它驱动

                JDBC是规范,那么不同的数据库厂商可以对该规范有不同的实现
                所以使用不同的数据库的时候,只需要更换不同的jar包(也就是驱动)即可
     */
    public static void main(String[] args) throws SQLException {

        //  1.注册驱动
        DriverManager.registerDriver(new Driver());

        //  2.获得连接
        Connection connection = DriverManager.getConnection(
                // jdbc:mysql://localhost:端口号/数据库名称
                "jdbc:mysql://localhost:3306/day20",
                "root",
                "123"
        );
        System.out.println(connection.getClass().getName());

        //  3.找个对象给我们干活:statement(这个接口,用来声明要执行的sql语句)
        String sql = "select * from hw_user";
        Statement statement = connection.createStatement();

        //  4.让这个对象去执行sql语句:执行查询语句时,得到的返回值类型为ResultSet(也就是我们常说的结果集)
        ResultSet resultSet = statement.executeQuery(sql);

        //  5.从ResultSet中取出数据
        while (resultSet.next()){
            System.out.print(resultSet.getInt("uid")+"\t");
            System.out.print(resultSet.getString("uname")+"\t");
            System.out.print(resultSet.getInt(3)+"\t");
            System.out.print(resultSet.getString(4)+"\t");
            System.out.println();
        }

        //  6.关闭资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

测试2(注册驱动):

public class Main2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        //  将Driver类加载进内存
        //  也就会执行该类的静态代码块
        // 也就实现了注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day20" + "?user=root&password=123");

        Statement statement = connection.createStatement();
        int i = statement.executeUpdate("INSERT INTO hw_user VALUES (NULL ,'张一山',40,'北京')");
        //  受影响的行数
        System.out.println(i);
        statement.close();
        connection.close();

    }
}

测试3:

package com.yanqiushi;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class Main3 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {

        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/day20";
        Properties info = new Properties();
        info.load(new FileReader("src/com/wsh/study/db.properties"));
        Connection connection = DriverManager.getConnection(url, info);
        Statement statement = connection.createStatement();
        String update = "update hw_user set uname='马云' where uname='马化腾'";
        boolean execute = statement.execute(update);
        statement.close();
        connection.close();

        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        });
    }
}

测试4(接口回调):


import java.sql.Statement;

public class Main4 {
    public static void main(String[] args) {
        // 调用JdbcUtil类时,该类会加载进内存
        // 也就会执行静态代码块,获得配置文件中的数据
        // 执行静态方法execute
        // 传入的是ExecuteInter接口的一个匿名实现类对象
        // 这里和我们学习线程时很类似
        // 传进去的对象,我们先叫它e
        // 在execute方法中(可以点进去看)
        // 第一步:根据配置文件中的数据建立连接
        // 第二步:调用e的execute方法,将连接传入
        //             这里就会回来执行这个匿名实现类的execute方法
        //             在这个方法中我们获得state,执行sql语句
        //             并且,将state作为返回值返回
        // 第三步:将e.execute()得到的返回值关闭
        // 第四步:关闭连接

        // 这种写法叫:接口回调
        JdbcUtil.execute(new ExecuteInter() {
            @Override
            public Statement execute(Connection connection) throws SQLException{

                    Statement statement = connection.createStatement();
                    String sql = "select * from hw_user";
                    ResultSet resultSet = statement.executeQuery(sql);
                    // 接下来就是遍历resultSet
                   JdbcUtil.showRS(resultSet);
                    return statement;

            }
        });
    }
}

测试5(防止sql注入):


package com.yanqiushi;

import java.sql.*;

public class Main5 {
    /**
     *  1.PrepareStatement可以使用动态参数
     *          Statement只能执行静态的sql语句
     *
     *  2.防止sql注入
     *          什么是sql注入?
     *          select * from user where username = ? and password = ?
     * @param args
     */

    public static void main(String[] args) {
        JdbcUtil.execute(new ExecuteInter() {
            @Override
            public Statement execute(Connection connection) {
                try {
                    PreparedStatement preparedStatement =
                            connection.prepareStatement("SELECT * FROM hw_user WHERE loc=? AND age >?;");
                    preparedStatement.setString(1,"北京");
                    preparedStatement.setInt(2,20);
                    ResultSet resultSet = preparedStatement.executeQuery();
                    JdbcUtil.showRS(resultSet);
                    return preparedStatement;
                } catch (SQLException e) {
                    e.printStackTrace();
                }

                return null;
            }
        });

        String user = "zhangsan";
        String password = "123";
        String sql = "select * from user where username = " + user
                + "and password = " + password;
    }


}

测试6(批处理):

接口:

package com.yanqiushi;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public interface ExecuteInter {

    Statement execute(Connection connection) throws SQLException;
}
package com.yanqiushi;

import java.sql.PreparedStatement;
import java.sql.SQLException;

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

        // {}就是匿名内部类实现ExecuteInter接口时
        // 复写的那个方法execute的方法体
        // connection就是execute方法的参数

        JdbcUtil.execute(connection -> {
            try {
                PreparedStatement preparedStatement = connection.prepareStatement("INSERT  INTO hw_user VALUES (NULL ,'张三',30,'上海')");
                // 将30岁的张三插入到批处理中
                preparedStatement.addBatch();

                // 添加批处理任务
                preparedStatement.addBatch("INSERT  INTO hw_user VALUES (NULL ,'李四',10,'武汉')");
                preparedStatement.addBatch("INSERT  INTO hw_user VALUES (NULL ,'张三',11,'武汉')");

                // 开始执行批处理任务
                preparedStatement.executeBatch();
                return preparedStatement;
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        });
    }

}

测试7(事务):

package com.yanqiushi;

import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main7 {

    private static PreparedStatement preparedStatement;

    public static void main(String[] args) {
        /**
         *  事物的四个特性
         *      原子性
         *      一致性
         *      隔离性
         *      持久性
         *
         *      统称为ACID
         */
        JdbcUtil.execute(connection -> {
            // 设置为false,表示手动提交
            // 也就是开启了事务
            // 默认是自动提交的
            try {
                connection.setAutoCommit(false);
                preparedStatement = connection.prepareStatement(
                        "DELETE FROM hw_user WHERE uname=?"
                );
                preparedStatement.setString(1,"张三");
                preparedStatement.execute();
//                Class.forName("");
                preparedStatement.setString(1,"李四");
                preparedStatement.execute();
                // 提交事务
                connection.commit();
//                return preparedStatement;
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                // 回滚,取消操作
                try {
                    connection.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
            return preparedStatement;
        });
    }

}

测试8(对某个已知类的扩展):

重写QuerrRunner:

package com.yanqiushi;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

import java.sql.Connection;
import java.sql.SQLException;

public class QueryRunnerSon extends QueryRunner {

    @Override
    public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
        T query = super.query(conn, sql, rsh, params);
        conn.close();
        return query;
    }
}
package com.yanqiushi;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main8 {
    public static void main(String[] args) throws SQLException {

        //dbUtil是apache公司给我们提供的一个工具类

        // 强行翻译(询问执行者)
        QueryRunner queryRunner = new QueryRunnerSon();
        String sql = "select * from hw_user";
        List<User> query = queryRunner.query(
                JdbcUtil.getConnection(),
                sql,
                new ResultSetHandler<List<User>>() {
            @Override
            public List<User> handle(ResultSet resultSet) throws SQLException {
                // TODO 把rusultset中的数据
                // 封装到一个对象中
                List<User> users = new ArrayList<>();
                while (resultSet.next()){
                    User user = new User(
                            resultSet.getString(2),
                            resultSet.getInt(1),
                            resultSet.getInt(3),
                            resultSet.getString(4));
                    users.add(user);
                }
                return users;
            }
        });
        // 对已知的某个类进行扩展

//        Iterator<User> iterator = query.iterator();
        for (User user : query) {
            if (user.getId() == 1) {
                System.out.println(user.toString());
            }
        }


    }
}

猜你喜欢

转载自blog.csdn.net/caoshiminYQS/article/details/86546160