JDBC操作数据库

一. jdbc连接数据步骤

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>

1.注册驱动

Class.forName("com.mysql.jdbc.Driver");

2.创建连接

Connection connection = DriverManager.getConnection(url,user,password);

参数说明:

url:jdbc:mysql://localhost:3306/studb

localhost:表示本地服务器

3306:数据库默认端口号

studb:数据库名

user:表示连接数据库的用户名

password:表示连接数据库的密码

3.创建SQL执行器

Statement statement = connection.createStatement();

4.执行SQL语句并返回结果

ResultSet resultSet = statement.executeQuery(sql);

Int i= statement.executeUpdate(sql);

5.释放资源

先创建的后关闭

 /**
     * 使用Statement执行sql
     */
    @Test
    public void statementTest() {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //创建连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "数据库用户名", "数据库密码");
            //创建statement对象:执行sql语句,查询executeQuery(),增删改executeUpdate(),
            statement = connection.createStatement();
            //创建ResultSet,
            resultSet = statement.executeQuery("select * from 表名");
//          next()----将游标下移一行,判断是否存在。
//          getInt() 获取int类型字段的值,
//          getString() 获取String字段的值,
//          通过列的名字来获取字段的值或通过列的序号来获取字段的值
            if (resultSet.next()) {
                String Name= resultSet.getString("列名");
                System.out.println(Name);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (resultSet!=null) {
                    resultSet.close();
                }
                if (statement!=null) {
                    statement.close();
                }
                if (connection!=null) {
                    connection.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

二. PreparedStatement解决SQL注入问题

3.创建SQL执行器

PreparedStatement preparedStatement = connection.prepareStatement(sql);

preparedStatement.setString(int parameterIndex,String x));

preparedStatement.setLong(int parameterIndex,Long x);

4.执行SQL语句并返回结果

preparedStatement.executeQuery();

preparedStatement.executeUpdate();

 /**
     * 使用PrepareStatement执行sql
     */
    @Test
    public void prepareStatementTest() {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //创建连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "数据库用户名", "数据库密码");
            //创建PreparedStatement:执行sql语句,可以防止sql注入
            preparedStatement = connection.prepareStatement("select * from 表名 where lkm_id = ?");
            preparedStatement.setLong(1,1);
            //创建ResultSet,
            resultSet = preparedStatement.executeQuery();
//          next()----将游标下移一行,判断是否存在。
//          getInt() 获取int类型字段的值,
//          getString() 获取String字段的值,
//          通过列的名字来获取字段的值或通过列的序号来获取字段的值
            if (resultSet.next()) {
                String lkmName = resultSet.getString("lkm_name");
                System.out.println(lkmName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (resultSet!=null) {
                    resultSet.close();
                }
                if (preparedStatement!=null) {
                    preparedStatement.close();
                }
                if (connection!=null) {
                    connection.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

三. JDBC工具类封装

1.创建配置文件:jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/stm_service
jdbc.user=root
jdbc.password=admin123

2. 编写JDBC工具类:JdbcUtils

/**
 * JDBC工具类
 *
 * @author wuqirui@yihuacomputer.com
 * @since 2021/11/10
 */
public class JdbcUtils {
    private static String driverClass = null;
    private static String url = null;
    private static String user = null;
    private static String password = null;
    /**
     * 静态代码块
     */
    static {
        try {
            //获取jdbc.properties文件路径
            String path = JdbcUtils.class.getClassLoader().getResource("jdbc.properties").getPath();
            Properties properties = new Properties();
            //获取properties对象
            properties.load(new FileInputStream(path));
            driverClass = properties.getProperty("jdbc.driverClass");
            url = properties.getProperty("jdbc.url");
            user = properties.getProperty("jdbc.user");
            password = properties.getProperty("jdbc.password");
            //加载驱动
            Class.forName(driverClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取连接
     */
    public static Connection getConnection()  {
        Connection connection = null;
        try {
            //获取连接
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 释放资源
     */
    public static void close(ResultSet rs,PreparedStatement pdst, Connection conn) {
        try {
            if (rs!=null) {
                rs.close();
            }
            if (pdst!=null) {
                pdst.close();
            }
            if (conn!=null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3.使用JdbcUtils操作数据库

  /**
     * 使用jdbcUtils
     */
    @Test
    public void jdbcUtilsTest() {
        //获取连接
        Connection connection = JdbcUtils.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            preparedStatement = connection.prepareStatement("select * from cst_linkman where lkm_id = ?");
            preparedStatement.setLong(1,1 );
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                String lkmName = resultSet.getString("lkm_name");
                System.out.println(lkmName);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            JdbcUtils.close(resultSet,preparedStatement ,connection);
        }
    }

四. DbUtils工具类(优化jdbc编程)

<dependency>
    <groupId>commons-dbutils</groupId>
    <artifactId>commons-dbutils</artifactId>
    <version>1.7</version>
</dependency>

Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。尤其结合连接池使用效果更为理想。

DbUtils的核心是两个类一个接口:

1、DBUtils类:主要为关闭连接,装载JDBC驱动程序之类的常规工作提供方法,都是静态的方法。

2、QueryRunner类:为我们提供两个重要方法,调用方法之前需要先创建一个QueryRunner的对象。

为我们提供两个重要方法,调用方法之前需要先创建一个QueryRunner的对象。

QueryRunner qRunner=new QueryRunner();

QueryRunner qRunner=new QueryRunner(new ComboPooledDataSource());

创建对象时需要传入一个连接池的数据源,这里结合c3p0连接池来完成。

  1. qRunner.update(Connection conn,String sql, Object... params)
  2. qRunner.update(String sql, Object... params)

update()方法等价于executeUpdate(),支持DML操作

3)qRunner.query(Connection conn,String sql, ResultSetHandler rsh,Object... params)

4)qRunner.query(String sql, ResultSetHandler rsh,Object... params)

query()方法等价于executeQuery(),支持DQL操作

3、ResultSetHandler接口:用于处理ResultSet结果集,将结果集的的数据转换成不同形式。该接口的实现类有很多:

ArrayHandler

将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值。

ArrayListHandler

将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

BeanHandler

将结果集中第一条记录封装到一个指定的javaBean中。

BeanListHandler

将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中。

ColumnListHandler

将结果集中指定的列的字段值,封装到一个List集合中。

ScalarHandler

它是用于单列数据查询。例如:select count(*) from users 操作。

MapHandler

将结果集中第一条记录封装到Map集合中,Key代表列名, Value代表该列数据。

MapListHandler

将结果集中每一条记录封装到Map集合中,Key代表列名, Value代表该列数据,Map集合再存储到List集合

4、使用DbUtils操作数据库 

/**
     * 使用DbUtils
     */
    @Test
    public void DbUtilsTest() {
//        String insertSql = "INSERT INTO cst_linkman (lkm_name,lkm_phone) values (?,?)";
//        String querySql = "SELECT * FROM cst_linkman WHERE lkm_name = ?;";
        String queryListSql = "SELECT * FROM cst_linkman;";
        //使用自己封装的工具类获取连接对象
        Connection connection = JdbcUtils.getConnection();
        //创建QueryRunner对象
        QueryRunner queryRunner = new QueryRunner();
        try {
//          通过queryRunner对象操作数据库
//          queryRunner.update(connection, insertSql, "王思聪","888888");
//          CstLinkman cstLinkman = queryRunner.query(connection, querySql, new BeanHandler<CstLinkman>(CstLinkman.class), "王思聪");
            List<CstLinkman> list = queryRunner.query(connection, queryListSql, new BeanListHandler<CstLinkman>(CstLinkman.class));
            for (CstLinkman cstLinkman : list) {
                System.out.println(cstLinkman);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                DbUtils.close(connection);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

五. 数据库连接池-c3p0连接池 

1. 依赖导入项目中

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>mchange-commons-java</artifactId>
    <version>0.2.11</version>
</dependency>

 2. 编写属性配置文件c3p0.properties

注意事项:

  1. 属性配置文件的名称必须叫c3p0.properties,不能改文件名
  2. 该属性配置文件必须放在src路径下
  3. 属性配置文件中的属性名必须与下表中指定的名称相同,不能随意修改,而且必须加c3p0前缀。

#基础配置
c3p0.driverClass =com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/stm_service
c3p0.user=root
c3p0.password=admin123
#选配
c3p0.maxPoolSize = 100  最大连接数  默认15
c3p0.minPoolSize = 10   是小连接数 默认3
c3p0.initialPoolSize = 10  初始化连接数 在最大和最小之间
c3p0.maxIdleTime = 30   最大空闲时间,毫秒为单位

3. 编写c3p0工具类:C3p0Utils

**
 * c3p0工具类
 *
 * @author wuqirui@yihuacomputer.com
 * @since 2021/11/13
 */
public class C3p0Utils {
    //获取连接的方法
    public static Connection getConnection() {
        Connection connection = null;
        //创建数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //通过数据源对象获取连接
        try {
            connection = comboPooledDataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;

    }
}

4. 使用c3p0操作数据库

 /**
     * 使用c3p0+DbUtils
     *
     */
    @Test
    public void C3p0AndDbUtilsTest() {
        String insertSql = "INSERT INTO cst_linkman (lkm_name,lkm_phone) values (?,?)";
//        创建QueryRunner时,传入一个c3p0连接池的数据源,这样可以避免使用c3p0工具类
        QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
        try {
            queryRunner.update(insertSql,"林俊杰","999999");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值