JDBC的Statement对象的使用

声明此篇文章部分图片引用了百战尚学堂的

首先先给大家看一下JDBC的编写步骤,便于后边的讲解

 

如何获取Connection对象?

通过反射机制Class.forName(数据库驱动名称)加载数据库驱动器,有人会问为什么那么我们来看mysql的驱动器源码:

mysql实现了java所提供的jdbc标准,而jdbc包下有一个Driver类,该类的代码中有一段静态代码块,静态代码块在类加载时加载,只会加载一次,所以当我们通过反射机制加载数据库驱动器时,相当于调用了该类的静态代码块

静态代码块中加载并注册了驱动器

通过反射机制加载了mysql的驱动器之后,可以使用DriverManager的静态方法getConnection(url,username,password)传递参数,该方法返回一个Connection对象,而这个方法会获取到我们传递的数据库url对应的数据库连接对象

mysql数据库的url:jdbc:mysql://localhost:数据库端口号/数据库名?useSSL=false

代码示例:

注意:在获取数据库连接对象之前,需要先加载数据库驱动器

通过这种方式获取Connection对象有什么问题?

通过这种方式获取Connection对象会有硬编译的问题,硬编码是指将可变变量用一个固定值来代替的方法。用这种方法编译后,如果以后需要更改此变量就非常困难了。

如何解决这种问题?

通过properties属性文件可以解决这种问题,这种文件以key=value格式存储内容。Java中可以使用Properties工具类来读取这个文件。项目中会将一些配置信息放到properties文件中,所以properties文件经常作为配置文件来使用。

Properties工具类中常用方法

load(InputStream is)        通过给定的输入流对象读取properties文件并解析

getProperty(String key)        根据key获取对应的value

代码示例:

而以后如果我们需要改数据就只需要在properties文件中更改就行了,不需要动源代码

 而此时如果想要创建多个mysql是不是就得写多次这样的代码,那不就造成了数据冗余吗?所以我们可以操作properties文件的代码抽离出来写一个JdbcUtils工具类。

将部分代码抽离写出JdbcUtils工具类

此时我们可以看到我将这段代码放到了静态代码块中,为什么呢,我们可以参考一下mysql的jdbc包中的Driver类,它通过了静态代码块进行数据库驱动器的加载,而静态代码块在类加载时执行一次,之后就会再执行了

而我们操作properties文件是需要用到IO流得,大家都知道IO流是比较耗时间的,而且操作properties文件只需要执行一次就好了,所以我们直接将操作properties文件的代码放到静态代码块中

然后定义了getConnection方法,该方法的返回值是Connection对象,通过该方法我们可以获取到mysql的连接器

/**
 * Jdbc工具类
 */
public class JdbcUtils {
    private static String url;
    private static String name;
    private static String pwd;
    static{
        try(//通过字节输入流读取properties文件
            FileInputStream fis = new FileInputStream("src/jdbc.properties")){
            //实例化Properties对象
            Properties prop = new Properties();
            //解析读取到的properties文件
            prop.load(fis);
            //读取连接数据库的url
            url = prop.getProperty("url");
            //获取用户名
            name = prop.getProperty("username");
            //获取密码
            pwd = prop.getProperty("pwd");
            //获取数据库驱动全名
            String driver = prop.getProperty("driver");
            //通过反射机制加载数据库驱动
            Class.forName(driver);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //获取数据库连接对象
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url,name,pwd);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

但是Connection对象是需要关闭的,所以我们再写一个关闭Connection对象的方法,便于我们使用完之后关闭

为了方便后期的讲解,我们再加一个closeResource方法,关闭Statement对象和Connection对象

 

通过Connection对象获取Statement对象

Connection类中有一个静态方法叫createStatement(),通过该方法可以获取到Statement对象,而Statement对象就是用来执行sql语句的

Statement接口特点

用于执行静态 SQL 语句并返回它所生成结果的对象。 由 createStatement 创建,用于发送简单的 SQL 语句(不支持动态绑定)。

那执行sql语句首先我们得要有表把,所以我们这里创建一个表叫users,userid为主键列

 

通过Statement对象执行sql语句

想要通过Statement对象执行sql语句,首先需要知道我们编写代码的顺序

1、首先先搭建好try…catch…finally框架,并且在try语句外声明Connection和Statement对象

2、然后获取Connection对象

3、通过Connection对象调用createStatement方法,获取Statement对象

4、编写String类型的sql语句

5、通过Statement对象的execute(sql)方法执行sql语句

6、最后关闭Statement对象和Connection对象

然后我们来看代码:

这段代码虽然看起来多,但其实有三个方法,而这三个方法都是遵循上面的顺序进行编写的,主要的是这个sql语句的编写,我们这个类实现的是对users表的DML操作(插入、更新、删除)

执行sql语句调用statement下的execute(sql)方法,传递sql语句,该方法返回的是布尔值,如果我们sql语句执行后有记录就返回true否则返回false

/**
 * Statement对象的使用
 */
public class TestStatement {
    /**
     * 添加用户
     */
    public void insertUser(String username,int userage){
        Connection connection = null;
        Statement statement = null;
        try{
            //获取mysql数据库连接对象
            connection = JdbcUtils.getConnection();
            //获取Statement对象
            statement = connection.createStatement();
            //定义需要执行sql语句
            String sql = "insert into users values(default,'"+username+"',"+userage+")";
            //执行sql,返回boolean值,如果sql有结果集返回true,如果没有结果集返回false
            boolean execute = statement.execute(sql);
            System.out.println(execute);
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(statement,connection);
        }
    }

    /**
     * 修改用户信息
     */
    public void updateUser(int userid,String username,int userage){
        Connection connection = null;
        Statement statement = null;
        try{
            //获取连接对象
            connection = JdbcUtils.getConnection();
            //获取Statement对象
            statement = connection.createStatement();
            //定义sql语句
            String sql = "update users set username = '"+ username +"',userage = "+ userage+ " where userid = "+ userid;
            //执行sql语句
            int ret = statement.executeUpdate(sql);
            System.out.println(ret);
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(statement,connection);
        }
    }

    /**
     * 删除用户信息
     */
    public void deleteUser(int userid){
        Connection connection = null;
        Statement statement = null;
        try{
            //获取数据库连接对象
            connection = JdbcUtils.getConnection();
            //获取Statement对象
            statement = connection.createStatement();
            //编写sql语句
            String sql = "delete from users where userid = "+userid;
            //执行sql语句
            //statement.execute(sql);
            int ret = statement.executeUpdate(sql);
            System.out.println(ret);
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(statement,connection);
        }
    }
}

然后我们就来测试一下这个类的添加用户、修改用户、删除用户的方法

添加用户:

 

 修改用户:

  

删除用户:

 

要点:关闭Connection对象和Statement对象时,一定要先关闭Statement对象后关闭Connection对象 

记住Statement对象执行sql语句的代码编写顺序:

1、首先先搭建好try…catch…finally框架,并且在try语句外声明Connection和Statement对象

2、然后获取Connection对象

3、通过Connection对象调用createStatement方法,获取Statement对象

4、编写String类型的sql语句

5、通过Statement对象的execute(sql)方法执行sql语句

6、最后关闭Statement对象和Connection对象

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值