PreparedStatement实现数据更新
在之前分析Statement接口的时候所采用的就是一种数据增加的更新处理才发现的问题,同样现在将通过PreparedStatement接口来解决之前所遇到的问题。
在使用PreparedStatement接口的时候由于需要准确的设置数据的操作类型,所以在进行日期设置的时候就需要有一个非常重要的说明: PreparedStatement 支持的是java.sql.Date,而不支持java.util.Date对象实例。
在PreparedStatement类中设置日期的方法使用的是java.sql.Date,而不支持java.util.Date对象实例,观察具体的方法定义。
NO. | 方法 | 类型 | 描述 |
01 | public void setDate(int parameterIndex, Date x) throws SQLException | 普通 | 设置指定占位符的日期数据内容 |
02 | public void setTime(int parameterIndex, Time x) throws SQLException | 普通 | 设置指定占位符的时间数据内容 |
03 | public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException | 普通 | 设置指定占位符的日期时间数据内容(时间戳) |
在程序开发中所能够使用到描述日期时间的数据类型都属于“java.util.Date”类对象实例,而数据库里面才会使用到java.sql包中对应的日期时间实例,此时就需要考虑将java.util.Date类的对象转为各自的java.sql包中的日期时间对象,依靠各自类的构造方法就可实现:
java.sql.Date类构造 | public Date(long date) |
java.sql.TIme类构造 | public Time(long time) |
java.sql.Timestamp类构造 | public Timestamp(long time) |
千万不要忘记了java.util.Date 类中提供有一个public long getTime()方法,这个方法可以直接将当前java.util.Date类中的对象实例转为long数据类型,而这个转换后的结果就可以实现各自java.sql包中的日期时间类的对象实例化了。
范例:实现数据的增加
import java.util.Date;
import java.sql.*;
public class PreparedStatmentDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
String name = "张三";
int age = 16; //年龄
Date birthday =new Date(); //日期就使用java.util.data描述
double salary = 6900; //工资
String note = "张三是一个很自律的人"; //说明
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
String sql ="INSERT INTO user (name,age,birthday,salary,note) VALUE (?,?,?,?,?)"; //用占位符代替要插入的内容
PreparedStatement preparedStatement = connection.prepareStatement(sql); //创建一个PreparedStatement接口实例对象
preparedStatement.setString(1,name);
preparedStatement.setInt(2,age);
//将程序中使用的java.util.Date转换为sql中用的java.sql.Date
preparedStatement.setDate(3,new java.sql.Date(birthday.getTime()));
preparedStatement.setDouble(4,salary);
preparedStatement.setString(5,note);
int count = preparedStatement.executeUpdate(); //执行sql操作,返回受影响的行数
System.out.println("【受影响的行数为】"+count);
connection.close(); //关闭连接
}
}
【受影响的行数为】1
现在观察一下数据库中user表的数据:
可以发现此时表中的数据已经成功受影响。
以上的程序实际上代表的是整个PreparedStaterment 执行数据更新处理操作的方式,只要在PreparedStatement接口里面设置有相应的SQL占位符,那么就必须在执行更新或查询前明确的进行内容的设置。此操作是针对于不同的数据类型使用了不同的setXxx(方法,而在PreparedStatement接口中为了简化这一繁 琐的数据类型的区分问题,所以可以通过setObject()(方法实现占位符数据的配置。
范例:使用setObject()方法实现该功能
import java.util.Date;
import java.sql.*;
public class PreparedStatmentDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
String name = "张三";
int age = 16; //年龄
Date birthday =new Date(); //日期就使用java.util.data描述
double salary = 6900; //工资
String note = "张三是一个很自律的人"; //说明
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
String sql ="INSERT INTO user (name,age,birthday,salary,note) VALUE (?,?,?,?,?)"; //用占位符代替要插入的内容
PreparedStatement preparedStatement = connection.prepareStatement(sql); //创建一个PreparedStatement接口实例对象
preparedStatement.setObject(1,name);
preparedStatement.setObject(2,age);
//将程序中使用的java.util.Date转换为sql中用的java.sql.Date
preparedStatement.setObject(3,new java.sql.Date(birthday.getTime()));
preparedStatement.setObject(4,salary);
preparedStatement.setObject(5,note);
int count = preparedStatement.executeUpdate(); //执行sql操作,返回受影响的行数
System.out.println("【受影响的行数为】"+count);
connection.close(); //关闭连接
}
}
【受影响的行数为】1
这个时候就可以更加简化的实现占位符参数的数据配置处理操作了,而这样的处理机制在日后进行--些框架结构设计上可以简化许多的判断逻辑。