谁在学习java的时候,有没有jsp.servlet.还java底层dao,biz实现方法...
发布网友
我来回答
共1个回答
热心网友
jdbc访问数据库的封装,获取集合的时候的使用了反射,数据库的列名和实体类的属性名的命名规则是:
比如数据库的列明是:stu_name 那么对应的属性名称是:stuName
数据库中列名单词单词分割使用_,属性名使用的是驼峰规则。
给你提供一个公用的使用jdbc的访问数据库代码,在service中只要准备sql和参数就可以了。
一下是接口
package dao;
import java.sql.Connection;
import java.util.List;
/**
* 提供数据库访问的基本的操作方式
* @author itJob 远标培训
*
*/
public interface BaseDao {
/**
*
* @param sql 只能传入insert update delete 类型操作
* @param params 如果没有参数 new Object []{}
*
*/
public void executeSql(String sql,Object [] params);
/**
*
* @param sql 只能传入insert update delete 类型操作
* @param params 如果没有参数 new Object []{}
* @param generaterKey 如果执行的是insert,且主键是自动增长,generaterKey=true返回主键的值
*/
public Integer executeSql(String sql,Object [] params,boolean generaterKey);
/**
* 使用手动事物
* @param sql 只能传入insert update delete 类型操作
* @param params 如果没有参数 new Object []{}
*
*/
public void executeSql(String sql,Object [] params,Connection conn);
/**
*
* @param sql
* @param params
* @param clazz 实体类的字节码
* @return
*/
public <T> List<T> getObjects(String sql,Object [] params,Class<T> clazz);
}
接口的实现类
package dao.impl;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import dao.BaseDao;
import dao.DbcpUtil;
/**
*
* @author itJob 远标培训
*
*/
public class BaseDaoImpl implements BaseDao {
/**
*
* @param sql 只能传入insert update delete 类型操作
* @param params 如果没有参数 new Object []{}
*
*/
public void executeSql(String sql,Object [] params){
executeSql(sql, params, false);
}
/**
*
* @param sql 只能传入insert update delete 类型操作
* @param params 如果没有参数 new Object []{}
* @param generaterKey 如果执行的是insert,且主键是自动增长,generaterKey=true返回主键的值
*/
public Integer executeSql(String sql,Object [] params,boolean generaterKey){
Integer key = null;
PreparedStatement pstmt = null;
Connection conn = null;
ResultSet rs = null;
//预编译sql
conn = DbcpUtil.getInstance().getConnection();
try {
if(generaterKey){
pstmt = conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
} else {
pstmt = conn.prepareStatement(sql);
}
//给sql中的参数赋值
for(int i = 0; i < params.length; i ++){
pstmt.setObject(i+1, params[i]);
}
pstmt.executeUpdate();
if(generaterKey){
rs = pstmt.getGeneratedKeys();
rs.next();
key = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbcpUtil.getInstance().close(conn, null, pstmt);
}
return key;
}
/**
* 使用手动事物
* @param sql 只能传入insert update delete 类型操作
* @param params 如果没有参数 new Object []{}
*
*/
public void executeSql(String sql,Object [] params,Connection conn){
PreparedStatement pstmt = null;
//预编译sql
try {
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
//给sql中的参数赋值
for(int i = 0; i < params.length; i ++){
pstmt.setObject(i+1, params[i]);
}
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
DbcpUtil.getInstance().close(null, null, pstmt);
}
}
/**
*
* @param sql
* @param params
* @param clazz 实体类的字节码
* @return
*/
public <T> List<T> getObjects(String sql,Object [] params,Class<T> clazz){
List objs = new ArrayList();
ResultSet rs = null;
Connection conn = null;
PreparedStatement pstmt = null;
//预编译sql
try {
conn = DbcpUtil.getInstance().getConnection();
pstmt = conn.prepareStatement(sql);
//给sql中的参数赋值
for(int i = 0; i < params.length; i ++){
pstmt.setObject(i+1, params[i]);
}
rs = pstmt.executeQuery();
//获取元数据
ResultSetMetaData metaData = pstmt.getMetaData();
//获取列数
int columnCount = metaData.getColumnCount();
while(rs.next()){
//创建一个对象
Object obj = clazz.newInstance();//实体类中必须提供不带参数构造函数
//获取值
for(int i = 1; i <= columnCount; i ++){
String columnName = metaData.getColumnName(i);//列名 构建属性
String columnLabel = metaData.getColumnLabel(i);//别名获取值
//获取该列的值
Object value = rs.getObject(columnLabel);
//根据类名构建属性名stu_id {stu,id} >> stuId stu_no_id {stu,no,id} >> stuNoId
String[] arrayFilds = columnName.split("_");
StringBuffer sb = new StringBuffer();
for(int index = 0; index < arrayFilds.length; index ++){
if(index == 0){
sb.append(arrayFilds[index]);
} else {
sb.append(arrayFilds[index].substring(0, 1).toUpperCase())
.append(arrayFilds[index].substring(1));
}
}
String fieldName = sb.toString(); //属性名
//判断构建的名称是否在实体类中存在
if(isContainsFieldName(fieldName,clazz)){
//获取属性
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);//给属性赋值
}
/*System.out.println(columnLabel + " : " + value + " : 属性名:" + sb.toString());
*/
if(i== columnCount){
//System.out.println("----------------分界线------------------------");
objs.add(obj);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DbcpUtil.getInstance().close(conn, rs, pstmt);
}
return objs;
}
/**
* 不存在
* @param fieldName
* @param clazz
* @return
*/
private boolean isContainsFieldName(String fieldName, Class clazz) {
Field[] declaredFields = clazz.getDeclaredFields();//全部的属性
for(Field f : declaredFields){
if(f.getName().equals(fieldName)){
return true;
}
}
return false;
}
}