谁在学习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;

}


}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com