Java实现Dbhelper支持大数据增删改
程序员文章站
2024-03-08 23:54:29
在做项目的时候,技术选型很重要,在底层的方法直接影响了我们对大数据访问以及修改的速度,在java中有很多优秀的orm框架,比如说:jpa,hibernate 等等,正如我们...
在做项目的时候,技术选型很重要,在底层的方法直接影响了我们对大数据访问以及修改的速度,在java中有很多优秀的orm框架,比如说:jpa,hibernate 等等,正如我们所说的,框架有框架的好处,当然也存在一些可以改进的地方,这个时候,就需要我们针对于不同的业务不同的需求,不同的访问量,对底层的架构重新封装,来支持大数据增删改。
代码:
import java.io.*; import java.sql.*; import java.util.*; import java.util.logging.level; import java.util.logging.logger; import javax.servlet.jsp.jstl.sql.*; /** * dbhelper * @author qmx * */ public class dbhelper { private string sql; //要传入的sql语句 public void setsql(string sql) { this.sql = sql; } private list sqlvalues; //sql语句的参数 public void setsqlvalues(list sqlvalues) { this.sqlvalues = sqlvalues; } private list<list> sqlvalue; //sql语句的参数 public void setsqlvalue(list<list> sqlvalues) { this.sqlvalue = sqlvalues; } private connection con; //连接对象 public void setcon(connection con) { this.con = con; } public dbhelper(){ this.con=getconnection(); //给connection的对象赋初值 } /** * 获取数据库连接 * @return */ private connection getconnection(){ string driver_class=null; string driver_url=null; string database_user=null; string database_password=null; try { inputstream fis=this.getclass().getresourceasstream("/db.properties"); //加载数据库配置文件到内存中 properties p=new properties(); p.load(fis); driver_class=p.getproperty("driver_class"); //获取数据库配置文件 driver_url=p.getproperty("driver_url"); database_user=p.getproperty("database_user"); database_password=p.getproperty("database_password"); class.forname(driver_class); con=drivermanager.getconnection(driver_url,database_user,database_password); } catch (classnotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (filenotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } return con; } /** * 关闭数据库 * @param con * @param pst * @param rst */ private void closeall(connection con,preparedstatement pst,resultset rst){ if(rst!=null){ try { rst.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } if(pst!=null){ try { pst.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } if(con!=null){ try { con.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } /** * 关闭数据库 * @param con * @param pst * @param rst */ private void closeall(connection con,statement pst,resultset rst){ if(rst!=null){ try { rst.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } if(pst!=null){ try { pst.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } if(con!=null){ try { con.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } /** * 查找 * @param sql * @param sqlvalues * @return */ public result executequery(){ result result=null; resultset rst=null; preparedstatement pst=null; try { pst=con.preparestatement(sql); if(sqlvalues!=null&&sqlvalues.size()>0){ //当sql语句中存在占位符时 setsqlvalues(pst,sqlvalues); } rst=pst.executequery(); result=resultsupport.toresult(rst); //一定要在关闭数据库之前完成转换 } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); }finally{ this.closeall(con, pst, rst); } return result; } /** * 增删改 * @return */ public int executeupdate(){ int result=-1; preparedstatement pst=null; try { pst=con.preparestatement(sql); if(sqlvalues!=null&&sqlvalues.size()>0){ //当sql语句中存在占位符时 setsqlvalues(pst,sqlvalues); } result=pst.executeupdate(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); }finally{ this.closeall(con, pst, null); } return result; } /** * 使用preparedstatement加批量的方法 * @return */ public int[] executeupdatemore(){ int[] result=null; try{ preparedstatement prest =con.preparestatement(sql,resultset.type_scroll_sensitive,resultset.concur_read_only); for(list sqlvaluestring : sqlvalue){ for(int i=0;i<sqlvaluestring.size();i++){ try { prest.setobject(i+1,sqlvaluestring.get(i)); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } prest.addbatch(); } prest.executebatch(); /* con.commit();*/ this.closeall(con, prest, null); } catch (sqlexception ex){ logger.getlogger(dbhelper.class.getname()).log(level.severe, null,ex); } return result; } /** * 使用preparedstatement加批量的方法,strvalue: * "insert intoadlogs(ip,website,yyyymmdd,hour,object_id) values('192.168.1.3','localhost','20081009',8,'23123')" * @return * @throws sqlexception */ public int[] executeupdatemorenotauto() throws sqlexception{ int[] result =null; con.setautocommit(false); statement stmt =con.createstatement(resultset.type_scroll_sensitive, resultset.concur_read_only); string[] sqlstring= null; for(string strvalue : sqlstring){ stmt.execute(strvalue); } con.commit(); return result; } /** * 使用preparedstatement加批量的方法,strvalue: * "insert intoadlogs(ip,website,yyyymmdd,hour,object_id) values('192.168.1.3','localhost','20081009',8,'23123')" * @return * @throws sqlexception */ public int[] executemorenotauto() throws sqlexception{ //保存当前自动提交模式 boolean booleanautocommit=false; string[] sqlstring= null; int[] result= null; try { booleanautocommit=con.getautocommit(); //关闭自动提交 con.setautocommit(false); statement stmt =con.createstatement(resultset.type_scroll_sensitive, resultset.concur_read_only); //使用statement同时收集多条sql语句 /*stmt.addbatch(insert_sql1); stmt.addbatch(insert_sql2); stmt.addbatch(update_sql3);*/ for(string strvalue : sqlstring){ stmt.addbatch(strvalue); } //同时提交所有的sql语句 stmt.executebatch(); //提交修改 con.commit(); con.setautocommit(booleanautocommit); this.closeall(con, stmt, null); } catch(exception e) { e.printstacktrace(); con.rollback(); //设定setautocommit(false)没有在catch中进行connection的rollback操作,操作的表就会被锁住,造成数据库死锁 } return result; } /** * 给sql语句中的占位符赋值 * @param pst * @param sqlvalues */ private void setsqlvalues(preparedstatement pst,list sqlvalues){ for(int i=0;i<sqlvalues.size();i++){ try { pst.setobject(i+1,sqlvalues.get(i)); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }
我们的在db.properties中写入访问数据库的信息:
driver_class=com.mysql.jdbc.driver driver_url=jdbc:mysql://192.168.22.246:3306/importexceltest database_user=basic database_password=basic
测试:
import java.util.*; public class importexceltest { public static void main(string[] args){ /*dbhelper db = new dbhelper(); string sql = "insert into tb_coursetype(id,coursetypename) values('2012003','qmx3')"; db.setsql(sql); db.executeupdate();*/ /*dbhelper db1 = new dbhelper(); string sql1 = "insert into tb_coursetype(id,coursetypename) values(?,?)"; list sqlvalues = new arraylist(); sqlvalues.add("2012004"); sqlvalues.add("qmx4"); db1.setsqlvalues(sqlvalues); db1.setsql(sql1); db1.executeupdate();*/ dbhelper db = new dbhelper(); string sql = "insert into tb_coursetype(id,coursetypename) values(?,?)"; list<list> sqlvalues = new arraylist(); list sqlvaluestring =new arraylist(); sqlvaluestring.add("2012010"); sqlvaluestring.add("qmx10"); sqlvalues.add(sqlvaluestring); list sqlvaluestring1 =new arraylist(); sqlvaluestring1.add("2012011"); sqlvaluestring1.add("qmx11"); sqlvalues.add(sqlvaluestring1); list sqlvaluestring2 =new arraylist(); sqlvaluestring2.add("2012012"); sqlvaluestring2.add("qmx12"); sqlvalues.add(sqlvaluestring2); list sqlvaluestring3 =new arraylist(); sqlvaluestring3.add("2012013"); sqlvaluestring3.add("qmx13"); sqlvalues.add(sqlvaluestring3); db.setsqlvalue(sqlvalues); db.setsql(sql); db.executeupdatemore(); } }
上一篇: 浅谈Java线程并发知识点
下一篇: Laravel实现表单提交