连接数据库后,可对数据库操作,java.sql包中有3个接口分别定义了对数据库的调用的不同方式:
Statement:用于执行静态SQL语句并返回它所生成结果的对象。
PreparedStatement:SQL语句被预编译并存储在此对象中,可使用此对象多次高效执行该语句。
CallableStatement:用于执行SQL存储过程。
下面使用PreparedStatement完成数据库增删改操作。
不使用Statement的原因:1、存在拼串操作,繁琐
????????????????????????????????????????? 2、存在SQL注入问题
前提
准备配置文件jdbc.properties
此文件作用是保存连接数据库的基本信息如用户名、密码。
user=root
password=ad
url=jdbc:mysql://localhost:3306/jdbc
driverClass=com.mysql.cj.jdbc.Driver
?
一、“增”操作
1、实例化
后面需要将使用的资源关闭,先实例化并赋null,后面通过判断是否使用资源,再进行关闭。
public static void testInsert(){
Connection conn = null;//获取连接
PreparedStatement ps = null;//预编译SQL实例
2、连接数据库
先读取配置文件连接数据库的基本信息;
然后创建一个Properties集合(保存配置文件内容),并加载配置文件;
用字符串将集合中相应的内容读取;
最后加载驱动,并使用前面实例化的对象conn获取连接。
try {
//读取配置文件基本信息
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//加载驱动
Class.forName(driverClass);
//获取连接
conn = DriverManager.getConnection(url,user,password);
3、预编译sql语句、填充占位符、执行
成功连接数据库后,用字符串保存sql语句(其中的?是占位符);
用前面实例化的对象ps保存预编译sql语句;
然后通过调用ps相关方法填充占位符,第一个参数表示第几个"?",第二个参数表示值;
最后执行execute。
//预编译sql语句,返回实例
String sql = "insert into customers(name,email,birth)values(?,?,?)";
ps = conn.prepareStatement(sql);
//填充占位符
ps.setString(1,"张修宇");
ps.setString(2,"940107148@qq.com");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//日期格式
Date date = sdf.parse("2002-4-30");
ps.setDate(3, new java.sql.Date(date.getTime()));
//执行操作
ps.execute();
}
catch (Exception e){
e.printStackTrace();
}
4、关闭资源
最后需要将所使用的资源关闭。
finally {
//资源关闭
try {
if(ps != null)
ps.close();
}catch (SQLException e){
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
二、优化“增”操作
由于前面的连接数据库操作在“删改”操作也使用,频繁使用,所以将连接数据库操作封装,如需使用直接调用。
创建一个软件包util,软件包下创建类JDBCUtils
类下封装连接数据库方法和关闭资源方法。
package util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**封装数据库连接和关闭*/
public class JDBCUtils {
public static Connection getConnection() throws Exception{
//读取配置文件基本信息
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//加载驱动
Class.forName(driverClass);
//获取连接
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}
public static void closeResource(Connection conn, Statement ps){
try {
if(ps != null)
ps.close();
}catch (SQLException e){
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
三、“删”操作
实现原理如上,修改操作也类似。
1、实例化
/**修改一条记录*/
public static void testUpdate(){
Connection conn = null;
PreparedStatement ps = null;
2、连接数据库
try {
//获取数据库连接
conn = JDBCUtils.getConnection();
3、预编译、填充占位符、执行
//预编译
String sql = "update customers set name = ? where id = ?";
ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1,"莫扎特");
ps.setObject(2,18);
//执行
ps.execute();
}
4、关闭资源。
catch (Exception e){
e.printStackTrace();
}finally {
//资源关闭
JDBCUtils.closeResource(conn,ps);
}
}
四、“增删改”通用方法
可以通过一个方法实现“增删改”操作,在不同情况传入不同参数;
与前面不同的是,需要传入sql语句、值参数。
1、定义方法、设置参数
将所用sql语句、值传入,args为可变形参,传入值对应sql语句中的"?"占位符;
/**通用增删改操作*/
public static void update(String sql,Object ...args){//args可变形参,占位符长度
2、实例化
Connection conn = null;
PreparedStatement ps = null;
?3、连接数据库
try {
//获取连接
conn = JDBCUtils.getConnection();
4、预编译、填充占位符、执行
//预编译
ps = conn.prepareStatement(sql);
//填充占位符
for(int i = 0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
//执行
ps.execute();
}
5、关闭资源
catch (Exception e){
e.printStackTrace();
}finally {
//资源关闭
JDBCUtils.closeResource(conn,ps);
}
}
?
使用示例
public static void testCommonUpdate(){
//删除
String sql = "delete from customers where id = ?";
update(sql,3);
//修改
String sql1 = "update `order` set order_name = ? where order_id = ?";
update(sql1,"DD","2");
}
“查询”操作比前面的操作稍复杂,将在下篇文章讲解。
|