
jdbc访问数据库的封装,获取集合的时候的使用了反射,数据库的列名和实体类的属性名的命名规则是:
比如数据库的列明是:stu_name 那么对应的属性名称是:stuName
数据库中列名单词单词分割使用_,属性名使用的是驼峰规则。
给你提供一个公用的使用jdbc的访问数据库代码,在service中只要准备sql和参数就可以了。
一下是接口
package dao;import javasqlConnection;
import javautilList;
/
提供数据库访问的基本的 *** 作方式
@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 daoimpl;import javalangreflectField;
import javasqlConnection;
import javasqlPreparedStatement;
import javasqlResultSet;
import javasqlResultSetMetaData;
import javasqlSQLException;
import javautilArrayList;
import javautilList;
import daoBaseDao;
import daoDbcpUtil;
/
@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 = DbcpUtilgetInstance()getConnection();
try {
if(generaterKey){
pstmt = connprepareStatement(sql,PreparedStatementRETURN_GENERATED_KEYS);
} else {
pstmt = connprepareStatement(sql);
}
//给sql中的参数赋值
for(int i = 0; i < paramslength; i ++){
pstmtsetObject(i+1, params[i]);
}
pstmtexecuteUpdate();
if(generaterKey){
rs = pstmtgetGeneratedKeys();
rsnext();
key = rsgetInt(1);
}
} catch (SQLException e) {
eprintStackTrace();
} finally {
DbcpUtilgetInstance()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 {
connsetAutoCommit(false);
pstmt = connprepareStatement(sql);
//给sql中的参数赋值
for(int i = 0; i < paramslength; i ++){
pstmtsetObject(i+1, params[i]);
}
pstmtexecuteUpdate();
} catch (SQLException e) {
eprintStackTrace();
try {
connrollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1printStackTrace();
}
} finally {
DbcpUtilgetInstance()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 = DbcpUtilgetInstance()getConnection();
pstmt = connprepareStatement(sql);
//给sql中的参数赋值
for(int i = 0; i < paramslength; i ++){
pstmtsetObject(i+1, params[i]);
}
rs = pstmtexecuteQuery();
//获取元数据
ResultSetMetaData metaData = pstmtgetMetaData();
//获取列数
int columnCount = metaDatagetColumnCount();
while(rsnext()){
//创建一个对象
Object obj = clazznewInstance();//实体类中必须提供不带参数构造函数
//获取值
for(int i = 1; i <= columnCount; i ++){
String columnName = metaDatagetColumnName(i);//列名 构建属性
String columnLabel = metaDatagetColumnLabel(i);//别名获取值
//获取该列的值
Object value = rsgetObject(columnLabel);
//根据类名构建属性名stu_id {stu,id} >> stuId stu_no_id {stu,no,id} >> stuNoId
String[] arrayFilds = columnNamesplit("_");
StringBuffer sb = new StringBuffer();
for(int index = 0; index < arrayFildslength; index ++){
if(index == 0){
sbappend(arrayFilds[index]);
} else {
sbappend(arrayFilds[index]substring(0, 1)toUpperCase())
append(arrayFilds[index]substring(1));
}
}
String fieldName = sbtoString(); //属性名
//判断构建的名称是否在实体类中存在
if(isContainsFieldName(fieldName,clazz)){
//获取属性
Field field = clazzgetDeclaredField(fieldName);
fieldsetAccessible(true);
fieldset(obj, value);//给属性赋值
}
/Systemoutprintln(columnLabel + " : " + value + " : 属性名:" + sbtoString());
/
if(i== columnCount){
//Systemoutprintln("----------------分界线------------------------");
objsadd(obj);
}
}
}
} catch (SQLException e) {
eprintStackTrace();
try {
connrollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1printStackTrace();
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} finally {
DbcpUtilgetInstance()close(conn, rs, pstmt);
}
return objs;
}
/
不存在
@param fieldName
@param clazz
@return
/
private boolean isContainsFieldName(String fieldName, Class clazz) {
Field[] declaredFields = clazzgetDeclaredFields();//全部的属性
for(Field f : declaredFields){
if(fgetName()equals(fieldName)){
return true;
}
}
return false;
}
}
以select from students where age<20为例,mysql内部运行机制是这样的:
第一步:读取from后面的表(数据源),将整个表从硬盘存入到内存中,得到一个临时表,因为还没有附上条件,此时查询结果集还没有得出。
第二步:读取where后面的条件。逐行扫描内存临时表中所有"行",符合where条件的"行"才能继续呆在内存中此时是对临时表执行过滤,查询结果集还没有得出(就像在跑步,还拿不到跑步成绩)
第三步:读取select后面内容。临时表+执行完where条件后,最终得到一个结果集在内存中select后面的内容作用于结果集,决定到底哪些列可以输出到数据库客户端(让人看到)
这个机制如果了解,对于sql查询语句的拍错是非常有利的。具体的可以去黑马程序员搜一下免费的视频,干货比较全。
以上就是关于谁在学习java的时候,有没有jsp.servlet.还java底层dao,biz实现方法 数据库全部的内容,包括:谁在学习java的时候,有没有jsp.servlet.还java底层dao,biz实现方法 数据库、一条select语句中,mysql内部的底层运行机制是怎样的、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)