谁在学习java的时候,有没有jsp.servlet.还java底层dao,biz实现方法 数据库

谁在学习java的时候,有没有jsp.servlet.还java底层dao,biz实现方法 数据库,第1张

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内部的底层运行机制是怎样的、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10139389.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存