首先,先说一下jdbc是什么?jdbc是一套统一的接口规范,方便程序员连接数据库,进行数据库的CRUD。
然后,我们怎们怎么使用JDBC呢?
首先,你需要下载JDBC的jar包。以连接Mysql8.0数据库为例,你需要到Mysql的官网下载JDBC的jar包。在下载jar包的时候,要注意jar包的版本,要与你的本地安装的Mysql数据库版本一致,不然就会出错。然后把下载好的jar包导入你的工程,那么准备工作就完成了。
这是我的数据库login表的数据截图:id是int类型字段,name是string类型字段
下面以一个小demo为例,演示一下JDBC操作数据库,执行sql语句的过程。
public class JDBCdemo1 {
public void test() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test?" +
"useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8",
"sa","123456");
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery("select * from login");
while(rs.next()){
System.out.println(rs.getObject(1).getClass());
System.out.println(rs.getString(2));
}
conn.close();
statement.close();
rs.close();
}
public static void main(String[] args) throws SQLException, ClassNotFoundException {
JDBCdemo1 j=new JDBCdemo1();
j.test();
}
}
执行结果截图
分析一下上面执行的步骤吧
1、Class.forName()获取数据库驱动;
2、Connection类建立数据库的连接;
3、Statement类创建一个执行sql语句的对象。
4、Resultset类存放Statement类执行sql语句获得的结果集。
5、释放资源。
总的来说,就是上面几步,但是在实际开发中,用以上的方法写的话,不停地进行获取驱动、建立连接、释放资源的操作,将会产生大量的冗余代码。所以我们需要封装一个工具类JDBCUtils,来方便我们日常的使用。
除此之外,使用Statement类进行sql语句的执行,可能会出现sql注入的漏洞。因此我们在下面将使用它的子类PreparedStatement来执行sql语句。
PreparedStatement是如何解决sql注入漏洞的呢?
PreparedStatement类首先会预编译你的sql语句,如果你是动态的sql语句,会以占位符?来代替动态变量。然后使用set方法设置动态变量的值,即使你的动态变量中包含有sql关键字,PreparedStatement类也会把他当作是普通字符处理。
JDBCUtils工具类代码
public class JDBCUtils{
private static final String driverClassName;
private static final String url;
private static final String username;
private static final String password;
static {
Properties properties=new Properties();
try {
properties.load(new FileInputStream("src/db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
driverClassName=properties.getProperty("driverClassName");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
}
public static void loadDriver(){
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn=null;
loadDriver();
try {
conn=DriverManager.getConnection(url,username,password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
public static void release(PreparedStatement prep,Connection conn) throws SQLException {
prep.close();
conn.close();
}
public static void release(ResultSet rs,PreparedStatement prep,Connection conn) throws SQLException {
rs.close();
prep.close();
conn.close();
}
}
我们可以把数据存放在db.properties文件下,然后使用工具类读取它里面的值。
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
username=sa
password=123456
主函数调用工具类
public class Run {
Connection conn=null;
PreparedStatement prep=null;
ResultSet rs=null;
void jdbcutils() throws SQLException {
conn=JDBCUtils.getConnection();
String sql="select * from login where id=?";
prep=conn.prepareStatement(sql);
prep.setString(1,"1");
rs=prep.executeQuery();
while (rs.next()){
System.out.println(rs.getString("id"));
System.out.println(rs.getString("name"));
}
JDBCUtils.release(rs,prep,conn);
}
public static void main(String[] args) {
Run run=new Run();
try {
run.jdbcutils();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
执行结果截图
PreparedStatement执行sql语句的方法:
execute方法:返回一个boolean型,当执行sql语句得到的结果集不为空,则返回true,如果执行sql语句得到的结果集为空,则返回false。此方法可以执行任意sql语句。
executeQuery方法:返回一个或者多个Resultset对象。此方法一般用于执行查询语句,执行其他语句会报错。
executeUpdate方法:返回一个int型,反映数据库中受影响的行数。此方法一般用于执行插入语句、更新语句、删除语句,执行查询语句会报错。