使用jdbc连接数据库,如何使用PreParedStatement类实现in的查询

大家都知道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语句进行处理操作。

猜你喜欢

转载自blog.csdn.net/qq_38322527/article/details/82110552