今天在使用QueryRunner类来查询多表数据时遇到bug
首先在runner里面使用select*是会报错的具体原因需要后面探索
java.sql.SQLException: '1.7722222222E10' in column '5' is outside valid range for the datatype INTEGER
Scanner sc=new Scanner(System.in);
QueryRunner runner=new QueryRunner();
Connection conn=null;
conn=JDBCUtils.getConnection();
String sql="SELECT *FROM order_items INNER JOIN orders ON order_items.order_id = orders.id WHERE user_id = (SELECT id FROM users WHERE username =?)";
BeanListHandler<OrderItems>handler=new BeanListHandler<OrderItems>(OrderItems.class);
System.out.println("请输入用户");
String username=sc.next();
List<OrderItems> list=runner.query(conn,sql,handler,username);
list.forEach(System.out::println);
而使用preparestatement则不会报错
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.next();
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test01_bookstore?rewriteBatchedStatements=true", "root", "root");
//3、编写sql
String sql = "SELECT * FROM order_items INNER JOIN orders ON order_items.order_id = orders.id WHERE user_id = (SELECT id FROM users WHERE username = ?)";
//4、创建PreparedStatement
PreparedStatement pst = conn.prepareStatement(sql);//此时的sql带?的
pst.setString(1, username);
//5、执行sql
ResultSet rs = pst.executeQuery();
while(rs.next()){
for (int i = 1; i <= 14; i++) {
System.out.print(rs.getObject(i)+"\t");
}
System.out.println();
}
//6、关闭
rs.close();
pst.close();
conn.close();
input.close();
但可以看出queryrunner使用起来简便许多
在后面我换成具体字段后又出现bug,经过查阅发现在多表查询里面需要指定字段属于哪个表否则会报错
Column 'id' in field list is ambiguous
修改之后就正常了
Scanner sc=new Scanner(System.in);
QueryRunner runner=new QueryRunner();
Connection conn=null;
conn=JDBCUtils.getConnection();
String sql="SELECT order_items.id, order_items.count,order_items.amount,order_items.title,order_items.author, order_items.price,order_items.img_path,order_items.order_id FROM order_items INNER JOIN orders ON order_items.order_id = orders.id WHERE user_id = (SELECT id FROM users WHERE username =?)";
BeanListHandler<OrderItems>handler=new BeanListHandler<OrderItems>(OrderItems.class);
System.out.println("请输入用户");
String username=sc.next();
List<OrderItems> list=runner.query(conn,sql,handler,username);
list.forEach(System.out::println);