大家都知道PreParedStatement类相比Statement更加方便的实现sql语句的动态赋值问题,虽然Statement也可以采取字符串拼接的方式实现,但代码整体风格看着不舒服,PreparedStatement类由Connect接口获取,同时再sql语句中采用占位符("?")的形式,方便程序员进行数据的赋值。但由此引申一个问题,如何区域查询呢?
大家随便看个sql
select userId,userName,accountName,userPwd,userAge,createTime from users where userId in (1,3,4,5,7,9)
查询时,条件查询in中包含的信息作为条件,再java的sql语句中,需要使用PreparedStatement的变量调用指定的setXxx()进行值的赋值操作,如何实现调用指定类型和传入值呢,我琢磨了个简单方法,和大家分享下
代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* preparedStatement写in
* @author 76519
*
*/
public class TestMysql4 {
static final String DRIVER = "com.mysql.jdbc.Driver";
static final String URL = "jdbc:mysql://127.0.0.1:3306/supermarket";
static final String USERNAME = "root";
static final String PASSWORD = "root";
public static void main(String[] args) throws Exception {
Object[] intArray = new Object[] {"1","3","4","5","7",9};
// 数据库驱动加载至容器中 --- 容器:一个java项目的进程就是一个容器
Class.forName(DRIVER);
// 通过 DriverManager 类取得连接对象
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
System.out.println(conn);
//查询sql
String sql = " select userId,userName,accountName,userPwd,userAge,createTime from users "
+ " where userId in (?) ";
/*String s = String.join(",",sb.toString()).trim();
System.out.println(s);
String newSql = String.format(sql.replace("?", "%s"), s);*/
String newSql = String.format(sql.replace("?", "%s"), getStringFromArray(intArray));
PreparedStatement pstmt = conn.prepareStatement(newSql);
System.out.println(pstmt.toString());
// 获取查询的结果集
ResultSet resultSet = pstmt.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getInt(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3));
}
// 资源使用类型 需要对其操作完成后 进行关闭操作
pstmt.close();
conn.close();
}
public static String getStringFromArray(Object ... objects ) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < objects.length; i++) {
if(i == objects.length - 1) {
sb.append(objects[i]);
}else {
sb.append(objects[i]).append(",");
}
}
return sb.toString().trim();
}
}
大家可以看到,我的sql语句中依旧采取的是占位符的格式
String sql = " select userId,userName,accountName,userPwd,userAge,createTime from users "
+ " where userId in (?) ";
代码中最为重要的就是下面的一段代码
String newSql = String.format(sql.replace("?", "%s"), getStringFromArray(intArray));
PreparedStatement pstmt = conn.prepareStatement(newSql);
这段代码是临时想出来的,我结合Statement和PreparedStatement比较,想一个问题:
能不能像Statement那样,将sql语句写"固定"一样,拼接起来进行操作而又不失动态效果呢?
源码中对于java.lang.String.format(xxxxx)是这么写的
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
将Object类型的可变参数转化为指定的格式,我的做法是将占位符格式为类似C语言的"%s"(字符串类型),再将数据替换到占位符的位置上,构成新的sql语句,此时的sql语句中 已经将值全部写入了,只需要将新的sql语句进行处理操作。