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);//读取连接数据库的urlurl = 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,如果没有结果集返回falseboolean 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对象