JDBC自学总结梳理

JDBC自学总结梳理,第1张

JDBC自学总结梳理

          寒假几天,在b站看了韩顺平老师的教学视频,收获很多。这里记录一下这几天学习JDBC的内容以便于日后复习。

        首先是获取连接,获取连接有几种方式。第一种如下:创建出driver对象(com.jdbc.mysql.Driver包中),使用driver的connect方法获取连接。

//使用创建driver对象方式获取连接
    @Test
    public void connection01() throws SQLException {
        Driver driver = new Driver();
        String url = "jdbc:mysql://localhost:3306/lrz_db03";
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "1230");
        Connection connect = driver.connect(url, properties);
        System.out.println("获取链接为" + connect);
    }

        第二种方式是使用driverManager的getConnection方法获取

//使用driverManager获取连接
    @Test
    public void connection02() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");//进行类加载
        String url = "jdbc:mysql://localhost:3306/lrz_db03";
        String user = "root";
        String password = "1230";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    }

        第三种方式也是比前两种方式更灵活的是使用配置文件进行URL和用户名和密码的编写

 @Test
    public void connection03() throws IOException, SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\connection.properties"));
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    }

        但最后的方式是使用数据库连接池的方式进行连接,这种方式大大减少性能消耗。这里使用德鲁伊(Druid)连接池进行连接,首先需要导入相应的jar包,使用配置文件进行连接的具体信息的编写,如密码、用户名、URL、最大连接数,最小连接数等。通过Properties的到配置文件后,通过以下代码即可获取连接

//通过德鲁伊来获取连接
Properties properties = new Properties();
properties.load(new FileInputStream("src\druid.properties"));
//获取连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//通过连接池获取连接
Connection connection = dataSource.getConnection();

        获取连接后,就是对对数据库进行增删改查等 *** 作。比如使用PrepareStatement进行查询,这里注意使用Statement会有SQL注入问题(有意思)

//执行语句 查询dog表
        PreparedStatement preparedStatement = connection.prepareStatement("select * from dog");
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            System.out.println(resultSet.getString(1) + resultSet.getString(2));
        }

        这里使用executeQuery方法,返回resultset结果集对象,这个对象只能查询不能够进行数据的来回滚动读取。后续会改进。该对象的next方法,返回TRUE和FALSE,表示是否有下一个查询行,也有previous方法获取上一行数据。

        由于获取连接课关闭连接比较常用,所以可以封装成一个类及方法,以后可以直接调用该类的get_Connection和close_Connection来获取连接和关闭连接。

public class Utils {
    static DataSource dataSource;
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection get_Connection() throws SQLException {
        //得到连接池
        return dataSource.getConnection();
    }
   
    public static void close_Connection(Connection con, Statement sta, ResultSet res){
        try {
            if(con != null){
                con.close();
            }
            if(sta != null){
                sta.close();
            }
            if(res != null){
                res.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

        说到使用resultSet的问题,这里获得结果集后无法进行反复调用以及关闭不方便,所以使用Apache提供的DBUtils来将获取的结果进行进一层封装,变成对象。例如数据库中有actor表,有以下的属性。

         这里就可以创建一个actor对象,属性和上面一一对应。并加上set和get方法,无参有参构造器都写上。导入Apache的dbutils的jar包。创建queryRunner对象qr,使用qr对象来进行增删改查 *** 作。 比如下面的query查询方法,这时返回的就是一个list集合,在query方法的第三个参数中,创建了一个BeanListHandler对象,qr对象在底层会自动将获取到的resultSet结果集进行进一步的对象封装并添加到一个list集合中,将该集合返回。关闭连接只需关闭连接即可,qr对象会将statement和resultset的连接关闭。

 @Test
    public  void test() throws SQLException {
        //先得到连接
        Connection connection = Utils.get_Connection();
        QueryRunner queryRunner = new QueryRunner();
        String sql = "select * from actor";
        List query = queryRunner.query(connection, sql, new BeanListHandler<>(actor.class));
        System.out.println(query);
        Utils.close_Connection(connection, null, null);
    }

       查询单行和单行单列大同小异。执行dml *** 作则使用qr.updata(connection,sql)获取返回的影响行数。

        最后由于这种方式的SQL语句比较固定,不能通过参数传入,通用性不好,这里可以再进行进一步的封装变成DAO(数据访问对象)层。编写父类BasicDao。该类有Query Runner其中包含查询方法。该方法集成了上述所有的链接和关闭连接以及查询 *** 作。以后根据数据库对象可创建相应的dao对象,继承BasicDao即可。

public class BasicDao {
    private QueryRunner qr = new QueryRunner();

    //开发通用dml方法,针对任意表
    public int update(String sql, Object... parameters) {
        Connection connection = null;
        try {
            connection = Utils.get_Connection();
            int update = qr.update(connection, sql, parameters);
            return update;
        } catch (SQLException throwables) {
            throw new RuntimeException();
        } finally {
            Utils.close_Connection(connection, null, null);
        }
    }

    //返回多个对象,即多行数据
    public List queryMulti(String sql, Class clazz, Object...parameters){
        Connection connection = null;
        try {
            connection = Utils.get_Connection();
            List query = qr.query(connection, sql, new BeanListHandler<>(clazz), parameters);
            return query;
        } catch (SQLException throwables) {
            throw new RuntimeException();
        } finally {
            Utils.close_Connection(connection, null, null);
        }
    }
}

        学习内容大致如上,如有错误敬请指正,最后感谢韩顺平老师!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5718734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存