声明此篇文章部分图片引用了百战尚学堂的
首先先给大家看一下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对象