2020-09-26 JDBC

JDBC

工作原理

在这里插入图片描述

JDBC API 可做三件事

与数据库建立连接、执行SQL 语句、处理结果

API使用过程:
DriverManager :依据数据库的不同,管理JDBC驱动
Connection :负责连接数据库并担任传送数据的任务
Statement :由 Connection 产生、负责执行SQL语句
ResultSet:负责保存Statement执行后所产生的查询结果

示例代码

//给工程导入数据库驱动包
//Oracle驱动包或MySql驱动包

//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

//获取连接对象
Connection conn=DriverManager.getConnection(
	"jdbc:oracle:thin:@localhost:1521:orcl",	//连接地址,localhost为数据库所在服务器地址,1521为端口号,orcl为服务名
	"system",  //连接数据库的用户名
	"1234"		//密码
)

//获取statement对象
Statement st=conn.creatStatment();

//如果为查询sql,则获取结果集
ResultSet rs=st.executeQuery(sql);
//如果为增删改sql,则返回被修改的行数
int result=st.executeUpdate(sql);

//遍历结果集
while(rs.next()){
    
    
	rs.getString("字段名");
	rs.getString(第几列)
	rs.getInt("字段名");
	....
	//可以将结果存在集合里面返回
}

//关闭资源,先从ResultSet开始关闭,接着是Statment,最后是Connection
if(rs!=null) rs.close();
...

//代码省略try-catch

ResultSet对象

常用方法:
boolean next():将光标从当前位置向下移动一行,如果不存在下一行,返回false。
boolean previous():游标从当前位置向上移动一行。
void close():关闭ResultSet 对象。
int getInt(int colIndex):以int形式获取结果集当前行指定列号值,从1开始。
int getInt(String colLabel):以int形式获取结果集当前行指定列名值。

Statement对象

常用方法:
ResultSet executeQuery(String sql):执行SQL查询并获取到ResultSet对象。
int executeUpdate(String sql):可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数。
boolean execute(String sql):可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet。
void close():关闭Statement对象。

Statement子接口PreparedStatement可以避免sql注入,使用起来更加灵活,安全,高效。建议使用。

拓展

ResultSet转List

public static <T> List<T> resultSetToList(ResultSet rs, Class<T> cls) {
    
    
        //定义接收的集合
        List<T> list = new ArrayList<T>();
        //创建一个对象,方便后续反射赋值
        Object obj=null;
        try {
    
    
            while (rs.next()) {
    
    
                //利用反射获取,执行类的实例化对象
                obj = cls.newInstance();
                //利用反射,获取对象类信息中的所有属性
                Field [] fields = cls.getDeclaredFields();
                for(Field fd:fields){
    
    
                    //暴力访问
                    fd.setAccessible(true);

                    Object fdobj = rs.getObject(fd.getName());
                    System.out.println(fdobj);
                    //为空不处理
                    if(fdobj != null) {
    
    
//                        时间类型转字符串
//                        if (fdobj instanceof Date && fd.getType().equals(String.class)) {
    
    
//                            String s = format.format(fdobj);
//                            fd.set(obj, s);
//                        }
                        //非字符串类型转字符串
                        if(!(fdobj instanceof Date) && fd.getType().equals(String.class))
                        {
    
    
                            //为对象属性赋值
                            fd.set(obj, String.valueOf(fdobj));
                         //如果对象属性为int类型
                        }else if(fd.getType().equals(Integer.class)){
    
    
                            fd.set(obj,(((BigDecimal)fdobj).intValue()));
                            //如果对象属性为double类型
                        }else if (fd.getType().equals(Double.class)) {
    
    
							fd.set(obj,((BigDecimal)fdobj).doubleValue());
						}
                    }
            }
                //返回转换后的集合
                list.add((T)obj);
            }
            System.out.println(((Master)list.get(0)).getMname());
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        } catch (InstantiationException e) {
    
    
            e.printStackTrace();
        } catch (IllegalAccessException e) {
    
    
            e.printStackTrace();
        }
        //返回集合\
        return list;
    }

猜你喜欢

转载自blog.csdn.net/weixin_44158992/article/details/108816787