漯河做网站xknt,网站后台难做么,东莞网站设计案例,美妆网站建设项目计划书本篇继续对JDBC进行总结#xff1a;
①通过Service层与Dao层实现转账的练习#xff1b;
②重点#xff1a;由于每次使用连接就手动创建连接#xff0c;用完后就销毁#xff0c;这样会导致资源浪费#xff0c;因此引入连接池#xff0c;练习连接池的使用#xff1b;
…本篇继续对JDBC进行总结
①通过Service层与Dao层实现转账的练习
②重点由于每次使用连接就手动创建连接用完后就销毁这样会导致资源浪费因此引入连接池练习连接池的使用
③实现一个工具类不用每次都手写获取连接以及配置数据库要素等并且对工具类进行优化然后使用连接池以及工具类对前部分转账部分的练习进行优化
④对于工具类只封装好了1.注册驱动2.创建连接8.回收资源因此3.4.5.6.7.这五步没有完成因此需要用高级应用层封装对这五步进行封装基本每一个数据表都有一个对应的DAO接口以及其实现类对其进行增删改查但是这些操作重复性很高所以可以抽取出公共的代码然后给这些DAO的实现类可以抽取一个公共的父类称为BaseDao 对于查询操作需要用executeQuery,增删改操作需要用executeUpdate所以增删改一体查询一体
后面会继续更新Mybatis简化JDBC的操作
以下代码可以直接复制到idea中运行整体的位置如下注意导入druid以及jdbc jar包 代码一转账的练习
包含两部分代码一部分是Service层一部分是Dao层
package data_test7;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;//TODO 此类是对bank表的一些操作
public class BankDao {//account 加钱的账号money:加钱的金额这里需要设计jdbc因为是对数据库中的表中数据进行操作public void add(String account,int money,Connection connection)throws Exception{//此处就不需要再创建链接了为了保证同一个事务需要使用一样的连接才行//Class.forName(com.mysql.cj.jdbc.Driver);//Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/jdbc_test, root, dir99);String sqlupdate t_bank set moneymoney? where account?;;PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setObject(1,money);preparedStatement.setObject(2,account);int i preparedStatement.executeUpdate();preparedStatement.close();//connection.close();System.out.println(加钱成功);}public void sub(String account,int money,Connection connection)throws Exception{//此处就不需要再创建链接了为了保证同一个事务需要使用一样的连接才行//Class.forName(com.mysql.cj.jdbc.Driver);//Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/jdbc_test, root, dir99);String sqlupdate t_bank set moneymoney-? where account?;;PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setObject(1,money);preparedStatement.setObject(2,account);int i preparedStatement.executeUpdate();preparedStatement.close();//connection.close();System.out.println(扣钱成功);}
}package data_test7;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;//TODO 转账测试
//TODO 银行卡业务方法调用Dao中的方法
public class BankService {Testpublic void start() throws Exception {//hello给hi转账500块transfer(hi,hello,500);}public void transfer(String addAccount,String subAccount,int money) throws Exception {BankDao bankDaonew BankDao();//注意这种方法不准确因为当一个账户money为零的时候再运行加钱还是成功扣钱会报错。// 因此需要统一为一个事务这个事务包括加钱和扣钱注意一个事务最基本的要求就是必须是同一个连接对象connection//TODO 需要加上注册驱动和创建连接以及try-catch并且需要关闭自动提交事务这样加钱和扣钱就是同一个事务Class.forName(com.mysql.cj.jdbc.Driver);Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/jdbc_test, root, dir99);try{//设置不自动提交事务connection.setAutoCommit(false);bankDao.add(addAccount,money,connection);//此处需要再传入connection连接bankDao.sub(subAccount,money,connection);//事务提交connection.commit();}catch(Exception e){//事务回滚connection.rollback();//抛出异常throw e;}finally {connection.close();}//TODO 正常就提交事务出现异常就回滚到原来的那样防止扣钱失败但是加钱成功类似的错误//TODO 总结事务是添加到业务方法中的利用try-catch代码块开始事务和提交事务以及事务回滚将connection传入dao层即可dao只负责使用不用close}
}代码二连接池的使用
package data_test8;//TODO 数据库连接池每次使用连接就创建然后销毁的话会比较浪费资源因此使用的时候可以在连接池中直接获取使用完后再放回到连接池中
// Druid连接池的使用import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;public class DruidUsepart {//硬编码方式//直接使用代码设置连接池连接参数方式//1.创建一个druid连接池对象//2.设置连接池参数【必须|非必须】//3.获取连接[通用方法所有连接都一样]//4.回收连接public void testHard() throws Exception {//连接池对象DruidDataSource dataSourcenew DruidDataSource();//设置参数//必须设置的参数dataSource.setUrl(jdbc:mysql://127.0.0.1:3306/jdbc_test);dataSource.setUsername(root);dataSource.setPassword(dir99);dataSource.setDriverClassName(com.mysql.cj.jdbc.Driver);//帮助注册驱动和创建连接//非必须的参数dataSource.setInitialSize(5);//初始化连接的数量dataSource.setMaxActive(10);//最大数量//获取链接Connection connectiondataSource.getConnection();//数据库操作connection.close();}public void testSoft() throws Exception {//软编码方式//通过读取外部的配置文件的方法实例化druid连接池对象//1.读取配置文件 PropertiesProperties propertiesnew Properties();InputStream resourceAsStream DruidUsepart.class.getClassLoader().getResourceAsStream(druid.properties);properties.load(resourceAsStream);//2.使用连接池工具类的工厂模式创建连接池DataSource dataSource DruidDataSourceFactory.createDataSource(properties);Connection connectiondataSource.getConnection();//数据库操作connection.close();}
}
//TODO 每次使用连接都这样重新设置比较麻烦因此想将他们封装到工具类中每次想使用调用那个类即可代码三工具类的实现以及优化
普通版
package data_test8;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;//TODO 工具类1.0版本内部包含一个连接池对象并且对外提供获取连接和回收连接的方法
//TODO 工具类中的方法一般设置为静态的方便外部调用
/*实现内容
属性连接池对象只能实例化一次 实现方法单例模式或者static代码块全局只调用一次
方法对外提供链接的方法回收外部传入连接方法*/
public class jdbc_utils1 {private static DataSource dataSourcenull;static{Properties propertiesnew Properties();InputStream resourceAsStream jdbc_utils1.class.getClassLoader().getResourceAsStream(druid.properties);try {properties.load(resourceAsStream);} catch (IOException e) {e.printStackTrace();}try {dataSource DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//对外提供获取连接方法public static Connection getConnection() throws SQLException {return dataSource.getConnection();}//回收方法public static void freeConnection(Connection connection) throws SQLException {connection.close();}}优化后
package data_test8;
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
//TODO 对于第一个版本的工具类有缺陷就是在不同方法中调用getconnection方法返回的是新的连接并不是一样的连接
//TODO 利用线程本地变量存储连接信息确保一个线程的多个方法获取同一个连接connection
// 优点实务操作的时候service和dao 属于同一个线程不用再传递参数了大家都可以调用getConnection方法自动获取的是同一个连接public class jdbc_util2 {private static DataSource dataSourcenull;private static ThreadLocalConnectiontlnew ThreadLocal();static{Properties propertiesnew Properties();InputStream resourceAsStream jdbc_utils1.class.getClassLoader().getResourceAsStream(druid.properties);try {properties.load(resourceAsStream);} catch (IOException e) {e.printStackTrace();}try {dataSource DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//对外提供获取连接方法public static Connection getConnection() throws SQLException {//先查看线程本地变量中是否存在Connection connection tl.get();if(connectionnull){//线程本地变量中没有连接池获取connectiondataSource.getConnection();//存入线程本地变量tl.set(connection);}return connection;}//回收方法public static void freeConnection() throws SQLException {Connection connectiontl.get();if(connection!null){//清空线程本地变量tl.remove();connection.setAutoCommit(true);//要回归到初始状态当开启事务的时候是falseconnection.close();//回收到连接池}connection.close();}
}代码四对转账练习的优化使用连接池以及工具类
package data_test8.daoANDservice;import data_test8.jdbc_util2;import java.sql.Connection;
import java.sql.PreparedStatement;//TODO 此类是对bank表的一些操作
public class BankDao {//account 加钱的账号money:加钱的金额这里需要设计jdbc因为是对数据库中的表中数据进行操作public void add(String account,int money)throws Exception{//TODO 可以直接从连接池中获取Connection connection jdbc_util2.getConnection();String sqlupdate t_bank set moneymoney? where account?;;PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setObject(1,money);preparedStatement.setObject(2,account);int i preparedStatement.executeUpdate();preparedStatement.close();//connection.close();System.out.println(加钱成功);}public void sub(String account,int money)throws Exception{
//TODO 直接从连接池中获取Connection connection jdbc_util2.getConnection();String sqlupdate t_bank set moneymoney-? where account?;;PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setObject(1,money);preparedStatement.setObject(2,account);int i preparedStatement.executeUpdate();preparedStatement.close();//connection.close();System.out.println(扣钱成功);}
}package data_test8.daoANDservice;import data_test8.jdbc_util2;
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;//TODO 转账测试
//TODO 银行卡业务方法调用Dao中的方法
public class BankService {Testpublic void start() throws Exception {//hello给hi转账500块transfer(hi,hello,500);}public void transfer(String addAccount,String subAccount,int money) throws Exception {BankDao bankDaonew BankDao();//TODO 直接从连接池中获取Connection connection jdbc_util2.getConnection();try{//设置不自动提交事务,开启事务connection.setAutoCommit(false);bankDao.add(addAccount,money);bankDao.sub(subAccount,money);//事务提交connection.commit();}catch(Exception e){//事务回滚connection.rollback();//抛出异常throw e;}finally {jdbc_util2.freeConnection();}}
}代码五对sql语句进行封装结合工具类以及连接池对增删改查操作的优化
package data_test9;//TODO 首先jdbc中一共有八步1.注册驱动2.创建连接3.编写sql语句4创建statement5.占位符赋值6.发送sql语句7.结果解析8.回收资源import data_test8.jdbc_util2;import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;// TODO 对于test8中的工具类只封装好了1.注册驱动2.创建连接8.回收资源因此3.4.5.6.7.这五步没有完成因此需要用高级应用层封装对这五步进行封装
// TODO 基本每一个数据表都有一个对应的DAO接口以及其实现类对其进行增删改查但是这些操作重复性很高所以可以抽取出公共的代码然后给这些DAO的实现类可以抽取一个公共的父类称为BaseDao
//TODO 对于查询操作需要用executeQuery,增删改操作需要用executeUpdate所以增删改一体查询一体
public class BaseDao {public int executeUpdate(String sql,Object...params) throws SQLException {//TODO 此处是对非查询语句方法的封装sql是传入的带占位符的sql语句params是占位符的值此处用了可变参数(注意可变参数可以直接当作数组使用)Connection connection jdbc_util2.getConnection();PreparedStatement preparedStatement connection.prepareStatement(sql);for(int i0;iparams.length;i){//TODO 注意此处preparedStatement.setObject(i1,params[i]);}int rows preparedStatement.executeUpdate();//是否回收连接需要考虑是否是事务,如果将setAutoCommit设置为false代表事务开始不自动提交这一系列的操作要么全部执行成功要么全部都不成功如果开启事务了就不用管业务层去处理if(connection.getAutoCommit()){//可以通过这个方法来获取是否是false还是true也就是事务是否开启//如果为true代表没有开启事务此时就需要回收jdbc_util2.freeConnection();}return rows;}/*对于非查询语句的方法返回值是int类型代表了影响的行数但是对于查询语句方法返回的是什么类型呢确实是一个集合但并不是listMapmap没有数据校验机制并且不支持反射操作其实数据库数据-》对应java的实体类有一个表user表里面有idnameaccountpassword属性此时这个表对应一个java类User类有idnameaccountpassword属性那么表中的一行数据代表java类的一个对象——》多行——》Listjava实体类listjava实体类可以校验并且支持反射操作那么返回值的类型就是某一个实体类的集合T声明一个泛型不确定类型第一个T表示这个方法是一个泛型方法可以用于指定查询结果的类型ListT表示该方法返回的是一个包含T类型的对象的集合下方的ClassT由外面传入确定这个泛型的类型例如传入一个User类那么这个泛型就是User类型还有一个好处就是可以使用这个类的反射机制给属性赋值public T ListT executeQuery(ClassTcla,String sql,Object...params)具体实现如下*/public T ListT executeQuery(ClassT cla, String sql, Object...params) throws Exception {//获取连接Connection connection jdbc_util2.getConnection();PreparedStatement preparedStatement connection.prepareStatement(sql);//占位符赋值if(params!nullparams.length!0){for(int i0;iparams.length;i){preparedStatement.setObject(i1,params[i]);}}//执行sql语句ResultSet resultSet preparedStatement.executeQuery();//结果解析ListTlistnew ArrayList();ResultSetMetaData metaData resultSet.getMetaData();//获取列的数量也就是属性的数量int columnCount metaData.getColumnCount();while(resultSet.next()){T tcla.newInstance();//利用反射调用类的无参构造函数实例化对象for(int i1;icolumnCount;i){//得到本行i列属性的值Object objectresultSet.getObject(i);//得到本行i列的属性名String columnLabel metaData.getColumnLabel(i);//此时得到了这一列属性名和属性值也就是给这个类的实例化对象的属性赋值可以利用反射实现Field field cla.getDeclaredField(columnLabel);field.setAccessible(true);//属性可能是私用的这样就可以打破private修饰限制属性可以被设置//给对象的属性赋值第一个参数是想要赋值的对象如果属性为静态的可以为null第二个参数是属性值field.set(t,object);}list.add(t);}//关闭资源resultSet.close();preparedStatement.close();if(connection.getAutoCommit()){//没有事务可以关闭:jdbc_util2.freeConnection();}return list;}}package data_test9;import org.junit.Test;import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//TODO 利用新封装的BaseDao类对增删改查进行优化
public class better extends BaseDao {//TODO 此处需要继承一下BaseDao这样就有了其中的Update方法public static void main(String[] args) {}Testpublic void testInsert() throws Exception {
// //对于job_grades表添加A 1500 3000这条数据
// //1.创建驱动
// Class.forName(com.mysql.jdbc.Driver);
// //2.创建连接
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb,root,dir99);
// //3.编写sql语句以及创建prepareStatement
// String sqlinsert into job_grades values(?,?,?);
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// preparedStatement.setObject(1,A);
// preparedStatement.setObject(2,1500);
// preparedStatement.setObject(3,3000);
// //发送sql语句
// int i preparedStatement.executeUpdate();
// if(i0){
// System.out.println(数据插入成功);
// }else{
// System.out.println(数据插入失败);
// }
// preparedStatement.close();
// connection.close();String sqlinsert into job_grades values(?,?,?);int a executeUpdate(sql, A, 88888, 66666);//返回影响行数}Testpublic void testDelete()throws Exception{
// Class.forName(com.mysql.jdbc.Driver);
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb, root, dir99);
// String sqldelete from job_grades where grade_level?;
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// preparedStatement.setObject(1,F);
// int i preparedStatement.executeUpdate();
// if(i0){
// System.out.println(删除成功);
// }else{
// System.out.println(删除失败);
// }
// preparedStatement.close();
//String sqldelete from job_grades where grade_level? and lowest_sal?;executeUpdate(sql,A,88888);}Testpublic void testUpdate()throws Exception{//对于job_grades表将刚添加的A 1500 3000这条数据中3000改为9999
// Class.forName(com.mysql.jdbc.Driver);
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb, root, dir99);
// String sqlupdate job_grades set highest_sal? where lowest_sal?;
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// preparedStatement.setObject(1,9999);
// preparedStatement.setObject(2,1500);
// int i preparedStatement.executeUpdate();
// if(i0){
// System.out.println(更新成功);
// }else{
// System.out.println(更新失败);
// }
// preparedStatement.close();
// connection.close();String sqlupdate job_grades set highest_sal? where lowest_sal?;int i executeUpdate(sql,99999,66666);}Test//注意此处查询想查询所有数据然后将数据放入到ListMaplist集合中//可知查询结果是一行一行的返回的是resultSet,然后将一行存入到map中map(key列名value列的内容)-》ListMap list;//实现思路遍历每一行数据一行对应一个map获取一行的列名和对应的列的属性装配即可然后将map装到一个集合当中就完成了public void testSearch()throws Exception{
// Class.forName(com.mysql.jdbc.Driver);
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb, root, dir99);
// String sqlselect * from job_grades;
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// ResultSet resultSet preparedStatement.executeQuery();
// //TODO 获取列的信息对象:避免手动获取每一个列的数据,metaData装的是当前结果集中列的信息对象它可以根据下角标获取列的名称也可以获取列的数量
// ResultSetMetaData metaData resultSet.getMetaData();
// //列的数量有了它以后就可以水平遍历列
// int columnCount metaData.getColumnCount();
// ListMap listnew ArrayList();
// while(resultSet.next()){
// //一行对应一个map
// Map mapnew HashMap();
// //下面这种方式纯手动提取如果列的个数更多会非常麻烦并且换一个表就得重新写效率很低map.put(gradelevel,resultSet.getString(1));map.put(lowestsal,resultSet.getInt(2));map.put(highestsal,resultSet.getInt(3));
// //新的方法读取每一个属性的数据自动遍历列注意要从一开始和数据区分开
// for(int i1;icolumnCount;i){
// //获取对应列的属性值
// Object value resultSet.getObject(i);
// //要是想加入map中需要传入key和valuevalue已经有了但是key列名还没有获取列的名称这个方法可以获取列的别名getcolumnname方法会获取列的名称万一要是起了别名就找不到了
// String columnLabel metaData.getColumnLabel(i);
// map.put(columnLabel,value);
// }
// list.add(map);
// }
// System.out.println(list);
// for(Object data:list){
// System.out.println(data);
// }
// resultSet.close();
// preparedStatement.close();
// connection.close();String sqlselect * from job_grades;ClassJob_grades clas Job_grades.class;ListJob_grades a executeQuery(clas, sql);for (Object o:a){System.out.println(o);}}
}
class Job_grades{private String grade_level;private int lowest_sal;private int highest_sal;public String toString(){return grade_level lowest_sal highest_sal;}}package data_test9;import org.junit.Test;import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//TODO 利用新封装的BaseDao类对增删改查进行优化
public class better extends BaseDao {//TODO 此处需要继承一下BaseDao这样就有了其中的Update方法public static void main(String[] args) {}Testpublic void testInsert() throws Exception {
// //对于job_grades表添加A 1500 3000这条数据
// //1.创建驱动
// Class.forName(com.mysql.jdbc.Driver);
// //2.创建连接
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb,root,dir99);
// //3.编写sql语句以及创建prepareStatement
// String sqlinsert into job_grades values(?,?,?);
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// preparedStatement.setObject(1,A);
// preparedStatement.setObject(2,1500);
// preparedStatement.setObject(3,3000);
// //发送sql语句
// int i preparedStatement.executeUpdate();
// if(i0){
// System.out.println(数据插入成功);
// }else{
// System.out.println(数据插入失败);
// }
// preparedStatement.close();
// connection.close();String sqlinsert into job_grades values(?,?,?);int a executeUpdate(sql, A, 88888, 66666);//返回影响行数}Testpublic void testDelete()throws Exception{
// Class.forName(com.mysql.jdbc.Driver);
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb, root, dir99);
// String sqldelete from job_grades where grade_level?;
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// preparedStatement.setObject(1,F);
// int i preparedStatement.executeUpdate();
// if(i0){
// System.out.println(删除成功);
// }else{
// System.out.println(删除失败);
// }
// preparedStatement.close();
//String sqldelete from job_grades where grade_level? and lowest_sal?;executeUpdate(sql,A,88888);}Testpublic void testUpdate()throws Exception{//对于job_grades表将刚添加的A 1500 3000这条数据中3000改为9999
// Class.forName(com.mysql.jdbc.Driver);
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb, root, dir99);
// String sqlupdate job_grades set highest_sal? where lowest_sal?;
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// preparedStatement.setObject(1,9999);
// preparedStatement.setObject(2,1500);
// int i preparedStatement.executeUpdate();
// if(i0){
// System.out.println(更新成功);
// }else{
// System.out.println(更新失败);
// }
// preparedStatement.close();
// connection.close();String sqlupdate job_grades set highest_sal? where lowest_sal?;int i executeUpdate(sql,99999,66666);}Test//注意此处查询想查询所有数据然后将数据放入到ListMaplist集合中//可知查询结果是一行一行的返回的是resultSet,然后将一行存入到map中map(key列名value列的内容)-》ListMap list;//实现思路遍历每一行数据一行对应一个map获取一行的列名和对应的列的属性装配即可然后将map装到一个集合当中就完成了public void testSearch()throws Exception{
// Class.forName(com.mysql.jdbc.Driver);
// Connection connection DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/atguigudb, root, dir99);
// String sqlselect * from job_grades;
// PreparedStatement preparedStatement connection.prepareStatement(sql);
// ResultSet resultSet preparedStatement.executeQuery();
// //TODO 获取列的信息对象:避免手动获取每一个列的数据,metaData装的是当前结果集中列的信息对象它可以根据下角标获取列的名称也可以获取列的数量
// ResultSetMetaData metaData resultSet.getMetaData();
// //列的数量有了它以后就可以水平遍历列
// int columnCount metaData.getColumnCount();
// ListMap listnew ArrayList();
// while(resultSet.next()){
// //一行对应一个map
// Map mapnew HashMap();
// //下面这种方式纯手动提取如果列的个数更多会非常麻烦并且换一个表就得重新写效率很低map.put(gradelevel,resultSet.getString(1));map.put(lowestsal,resultSet.getInt(2));map.put(highestsal,resultSet.getInt(3));
// //新的方法读取每一个属性的数据自动遍历列注意要从一开始和数据区分开
// for(int i1;icolumnCount;i){
// //获取对应列的属性值
// Object value resultSet.getObject(i);
// //要是想加入map中需要传入key和valuevalue已经有了但是key列名还没有获取列的名称这个方法可以获取列的别名getcolumnname方法会获取列的名称万一要是起了别名就找不到了
// String columnLabel metaData.getColumnLabel(i);
// map.put(columnLabel,value);
// }
// list.add(map);
// }
// System.out.println(list);
// for(Object data:list){
// System.out.println(data);
// }
// resultSet.close();
// preparedStatement.close();
// connection.close();String sqlselect * from job_grades;ClassJob_grades clas Job_grades.class;ListJob_grades a executeQuery(clas, sql);for (Object o:a){System.out.println(o);}}
}
class Job_grades{private String grade_level;private int lowest_sal;private int highest_sal;public String toString(){return grade_level lowest_sal highest_sal;}}