使用 DAO模式 来对数据库做增删改查操作
DAO模式可以大概分为三个层:1.DAO层 2.服务层 3.表现层
1)表现层 :相当于客户端用来查看,提交信息的角色
2)服务层 :是表现层和DAO层的纽带,其实也没干什么事就是通知消息的角色
3)DAO :真正要做事的角色(对数据库的某些操作)
public void update(String sql, Object...objects){
Connection conn = null;
PreparedStatement preparedStatement = null;
try {
conn = TestJDBC.getConnection();
preparedStatement = conn.prepareStatement(sql);
for(int i=0; i<objects.length; i++){
preparedStatement.setObject(i+1, objects[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e){
e.printStackTrace();
} {
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public <T> T get(Class<T> clazz, String sql, Object...objects){
//1.建立连接
Connection conn = null;
//2.获取PreparedStatement
PreparedStatement preparedStatement = null;
try {
conn = TestJDBC.getConnection();
preparedStatement = conn.prepareStatement(sql);
//3.赋值
for (int i = 0; i<objects.length; i++){
preparedStatement.setObject(i+1, objects[i]);
}
//4.执行,并使用ResultSet接受
ResultSet re = preparedStatement.executeQuery();
if(re.next()){
//5.创建clazz对象
T t = clazz.newInstance();
//6、获取ResultSetMetaData,并放入对象
ResultSetMetaData rsmd = re.getMetaData();
for(int i=0; i<rsmd.getColumnCount(); i++){
String columnLable = rsmd.getColumnLabel(i+1);
Object columnValue = re.getObject(i+1);
//为对象属性赋值
Field field = clazz.getDeclaredField(columnLable);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
} else {
return null;
}
} catch (Exception e){
e.printStackTrace();
} finally {
if (preparedStatement != null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}
元数据 (DatabaseMetaData && ResultSetMetaData)
- 提供数据库,返回结果的元数据对象
- 利用反射技术,可以写出通用的方法
获取自动插入时生成的主键值
PreparedStatement st = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
st.executeUpdate();
ResultSet rs = st.getGeneratedKeys(); //得到插入行的主键
if(rs.next())
System.out.println(rs.getObject(1));
网友评论