Java/jdbc连接数据库预处理只能查询一条数据?

今天在写一个小项目的时候连接数据库读取数据生成栏目,开始写了个这样的方法:但是每次只能读取一行数据,明明有好几条数据,其代码如下:

public static List<Programa> getPrograma(int qx) throws SQLException{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<Programa> list = new ArrayList<Programa>();
		Programa programa = null;
		
		try {
			conn=connectionFactory.getConnection();
			
			String sql = "";
			if (qx == 1) {	//for admin
				sql="select pId,pName,pURL from programaTable where -1<?";	
			}
			else {	//for user :QX == 0
				sql="select pId,pName,pURL from programaTable where QX=?";
			}
			
			pstmt=conn.prepareStatement(sql);
			pstmt.setInt(1, qx);
			
			rs=pstmt.executeQuery();
						
			if(rs.next()){
				System.out.println("000000000");
				programa = new Programa();
				
				programa.setId(rs.getInt(1));
				programa.setName(rs.getString(2));
				programa.setUrl(rs.getString(3));
				
				list.add(programa);
			}
			
			rs.close();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		return list;
	}

 

我就纳闷了,以前也写过JDBC连数据库的,我开始还以为是MYSQL的问题,后来我写过了一个方法,能把数据全部正确的读出来:代码如下:

public static List<Programa> getPrograma2(int qx) throws SQLException{
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		List<Programa> list = new ArrayList<Programa>();
		Programa programa = null;

		try {
			con = connectionFactory.getConnection();
			String sql = "select pId,pName,pURL from programaTable";

			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);

			while (rs.next()) {
				int col1 = rs.getInt(1);
				String col2 = rs.getString(2);
				String col3 = rs.getString(3);

				programa = new Programa();
				programa.setId(col1);
				programa.setName(col2);
				programa.setUrl(col3);

				list.add(programa);
			}

			// 关闭数据库连接
			rs.close();
			stmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}


后来看查一下,连接数据库的配置文件,原来配置文件将自动提交设置为true,

总结:如果设置自动提交为false,用预处理连接数据库,只能查询一条数据(不管rs = stmt.executeQuery(sql);后面是否写上上con.commit();

                                                      但是不用预处理能查到该查到的所有数据(不用写自动提交)

              如果设置自动提交为true用预处理连接数据库,只能查询一条数据(rs = stmt.executeQuery(sql);后面不能写上上con.commit();否则报错

                                                      但是不用预处理能查到该查到的所有数据(不用写自动提交)

 

于是就出现一个问题,难道用预处理只能查到一条数据吗?????

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我会回答你的问题。首先需要导入mysql连接的jar包,然后建立与数据库的连接,判断是否连接成功可以通过getConnection方法返回的连接对象是否为null来判断。接下来,使用PreparedStatement接口实现增删改查操作,可以预防SQL注入攻击。 以下是Java连接MySQL数据库的示例代码: ```java import java.sql.*; public class MySQLDemo { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 建立连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC", "root", "root"); // 判断连接是否成功 if (conn != null) { System.out.println("数据库连接成功"); } else { System.out.println("数据库连接失败"); } // 实现增删改查 String sql = "insert into user(name,age) values(?,?)"; ps = conn.prepareStatement(sql); ps.setString(1, "Tom"); ps.setInt(2, 20); ps.executeUpdate(); sql = "select * from user"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getInt("age")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 上述代码中,我们首先加载了MySQL驱动程序,然后建立了与数据库test的连接。然后使用PreparedStatement接口实现了插入一条数据查询所有数据的操作,并使用了setXXX方法设置占位符的值。最后,我们关闭了ResultSet、PreparedStatement和Connection对象,释放了资源。 希望我的回答能帮到你,如果还有其他问题可以继续问我哦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值