JDBC 小结

1

ResultSetMetaData metaData = resultSet.getMetaData();
  • 获取列数

    int columnCount = metaData.getColumnCount(); 
    
  • 获取列名

    //需要一个下标,下标从1开始。
    String columnName = metaData.getColumnName(index); 
    
  • 获取列的别名

    //同样需要下标。
    String columnLabel = metaData.getColumnLabel(index);
    
  • 必须在声明sql时,使用类属性名来命名字段的别名。

  • 使用ResultSetMetaData时,需要使用getColumnName时使用getColumnLabel代替。

  • 如果字段没有别名,getColumnLabel仍然可以获取列名

  • 针对于不同表的通用的查询操作

     public <T> T forAllQuery(Class<T> clazz,String sql,Object...args){
            try{
                //获取连接
                Connection connection = MysqlUtil.getConnection();
                //预编译sql语句
                PreparedStatement preparedStatement = connection.prepareStatement(sql);
                //填充占位符
                for (int i = 0; i < args.length; i++) {
                    preparedStatement.setObject(i+1,args[i]);
                }
                //执行executeQuery
                ResultSet resultSet = preparedStatement.executeQuery();
                //获取列数
                ResultSetMetaData rsmd = resultSet.getMetaData();
                int columnCount = rsmd.getColumnCount();
    			//创建集合对象
                List list = new ArrayList();
                if (resultSet.next()){
                    //创建相应类的对象
                    T t = clazz.newInstance();
                    for (int i = 0; i < columnCount; i++) {
                        //获取列值
                        Object columnValue = resultSet.getObject(i + 1);
                        //获取列名(别名)
                        String columnLabel = rsmd.getColumnLabel(i + 1);
                        //使用反射给指定对象赋值
                        Field field = clazz.getDeclaredField(columnLabel);
                        field.setAccessible(true);
                        field.set(t,columnValue);
                    }
                    list.add(t);
                }
                return list;
            }catch (Exception e){
                e.printStackTrace();
            }
    

    等学到反射再回来看

  • 为什么PreparedStatement可以解决SQL注入

  • 因为PreparedStatement进行了预编译,将sql语句的逻辑进行了确定

  • PreparedStatement可以来操作Blob类型的文件

  • PreparedStatement可以进行更高效的批量操作。

2 小结及课后练习

练习题1:从控制台向数据库的表customers中插入一条数据,表结构如下:

Connection connection = MysqlUtil2.getConnection();
String sql = "INSERT INTO customers Values(null,?,?,?,null)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,username);
preparedStatement.setString(2,email);
preparedStatement.setString(3,birthday);
preparedStatement.executeUpdate();

练习题2:创立数据库表 examstudent,表结构如下:

向数据表中添加如下数据:

代码实现1:插入一个新的student 信息

请输入考生的详细信息

Type:
IDCard:
ExamCard:
StudentName:
Location:
Grade:

信息录入成功!

//使用增删改的通用模板进行操作。
String sql = "INSERT INTO examstudent Values(null,?,?,?,?,?,?)";
testUpdate(sql,type,idCard,examCard,studentName,locatin,grade);
posted @ 2021-12-27 23:08  Boerk  阅读(52)  评论(0)    收藏  举报