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;
}