接口:

public interface DaoMessage<T> {int ERROR = 0x400;int SUCCESS = 0x200;        //接口参数默认finalint  getStatus();T getDate();    //避免我们强制类型转换 对应类 泛型<T>}

写工厂,因为整个操作基于工厂的连接,所以工厂类设计成父类:

class ConnectionFactory {//连接工厂数据源配置工具private static Properties config;//静态代码块完成工厂资源初始化static {config = new Properties();//通过线程的内置上下文对象获取项目target根目录String root = Thread.currentThread().getContextClassLoader().getResource("").getFile();//通过File的数结构特征提取项目根目录的上一级目录File rootDir = new File(root).getParentFile().getParentFile();//构建配置文件路径//config/jdbc.properties//D:\d\tools\idea\myprojects\mysql\schooldatamake\config\jdbc.properties//System.out.println(rootDir.getPath() + "/config/jdbc.properties");//System.out.println(root);final String CONFIG_PATH = rootDir.getPath()+"/config/jdbc.properties";try {config.load(new FileReader(CONFIG_PATH));//加载数据源驱动Class.forName(config.getProperty("mysql.driver"));} catch (IOException | ClassNotFoundException e) {e.printStackTrace();System.exit(-1);}}//创建 Connection 连接对象static Connection newInstance() throws SQLException {return DriverManager.getConnection(config.getProperty("mysql.url"),config.getProperty("mysql.username"),config.getProperty("mysql.password"));}//释放基于Auto Close able的资源//因为资源关闭有很多  所以老师写在了这里 并用了 static修饰符protected static void close(AutoCloseable...closes){for (AutoCloseable close : closes) {if(null!=close){try {close.close();} catch (Exception e) {e.printStackTrace();}}}}}

写底层 jdbc 实现mysql数据库增删改的 合并方法 的类 继承ConnectionFactory 实现DaoMessage接口:

public class BaseDao extends ConnectionFactory{//设计:DaoMessage对外公开    此内部类不对外公开//类似于 线程里面的 call    future  是设计未来的对象//实现 BaseDao 的数据交互的标准定义private static class Message<T> implements DaoMessage<T>{private int status;private T t;//静态方法必须要带泛型   为什么?static <T> Message succeed(T t){return new Message(t);}static Message fail(){return new Message();}private Message(){this.status = ERROR;}private Message(T t){this.status = SUCCESS;this.t = t;}@Overridepublic int getStatus() {return status;}@Overridepublic T getDate() {return t;}}//获取数据源的连接对象private static Connection con() throws SQLException {return newInstance();}//根据连接对象,sql命令和预编译参数获取执行对象private static PreparedStatement pst(Connection con,String sql,Object...args) throws SQLException {PreparedStatement pst = con.prepareStatement(sql);if(null != args && args.length>0){for (int i = 0; i < args.length; i++) {pst.setObject(i+1,args[i]);}}return pst;}//设计int返回值的目的:要统一一个数据的标准    增删改查的状态值  改成规范接口DaoMessage<Integer>//执行增删改查操作public static DaoMessage<Integer> exeUpdate(String sql,Object...args){//异常不能一直抛 总是要抓的 在这里抓Connection con = null;PreparedStatement pst = null;try {con = con();pst = pst(con,sql,args);return Message.succeed(pst.executeUpdate());} catch (SQLException e) {e.printStackTrace();}finally {close(pst,con); //释放需要注意的问题:连接释放掉   结果集也会释放掉}//哪里开 哪里关 并把数据在这一个方法中写完全存起来return Message.fail();}//批量插入          colSize   几个?  batchSize 一批能承受多少条数据   ( , , , )public static DaoMessage<Integer> addBatch(String sql,int colSize,int batchSize,Object...args){Connection con = null;PreparedStatement pst = null;int affectedRows =0;try {con = con();pst = pst(con,sql);for (int i = 0,realSize=0; i < args.length; i+=colSize) {//添加一条(行)数据for (int j = i , size = 0; size < colSize ; j++,size++) {pst.setObject(size+1,args[j]);}//将该行作为一个批次缓存至执行器pst.addBatch();//insert into ... values (),(),(),//当执行器中当前的缓存数量达到 batchSize 时提交数据(持久化)if(++realSize%batchSize==0){//提交并累加影响行数affectedRows+= pst.executeBatch().length;//清空执行器缓存pst.clearBatch();}}//提交affectedRows += pst.executeBatch().length;//清空执行器缓存pst.clearBatch();return Message.succeed(affectedRows);} catch (SQLException e) {e.printStackTrace();}finally {close(pst,con);}return Message.fail();}//下一个方法exeQuery 泛型   ?  写了此方法//反射解析实体类型中属性名称和setter方法private static<T> Map<String, Method> map(Class<T> c){Map<String, Method> map = new HashMap<>();for (Method m : c.getMethods()) {String name = m.getName();if(!name.startsWith("set"))continue;name = name.substring(3);name = name.substring(0,1).toLowerCase()+name.substring(1);map.put(name,m);}return map;}//至此考虑  字段---属性 一致的问题   属性名和字段名一致可以解决//解析结果集中元数据的结构: 将字段名称和顺序编号以键值对返回private static Map<String,Integer> map(ResultSet rst) throws SQLException {Map<String,Integer> map = new HashMap<>();ResultSetMetaData metaData = rst.getMetaData();//System.out.println(metaData);for (int i = 1; i <= metaData.getColumnCount(); i++) {map.put(metaData.getColumnLabel(i),i);}return map;}//执行查询操作public static <T> DaoMessage<List<T>> exeQuery(Class<T> c,String sql,Object...args){Connection con = null;PreparedStatement pst = null;ResultSet rst = null;Map<String,Method> mapReflect = null;Map<String,Integer> mapMeta = null;try {con = con();pst = pst(con,sql,args);rst = pst.executeQuery();mapReflect = map(c);//至此考虑  字段---属性 一致的问题   属性名和字段名一致可以解决mapMeta = map(rst);List<T> list = new ArrayList<>();while (rst.next()) {T t = c.newInstance();for (Map.Entry<String, Method> e : mapReflect.entrySet()) {//                    System.out.println(e.getValue());
//                    System.out.println(rst);
//                   System.out.println(mapMeta);
//                    System.out.println(e.getKey());e.getValue().invoke(t,rst.getObject(mapMeta.get(e.getKey())));}list.add(t);}return Message.succeed(list);} catch (SQLException e) {e.printStackTrace();} catch (IllegalAccessException | InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} finally {close(rst,pst,con);if(null!= mapReflect){mapReflect.clear();}//如果是全局变脸  map=null   局部变量这样做每什么意义if(null!= mapMeta){mapMeta.clear();}//集合用完就clear是一个好习惯}return Message.fail();}
}

批量添加数据:

public class DataMaker {Random rand = new Random();public void mkEmployee(){String names = "王苇第悌井旺亓红苌梧司空央董木官璧宏子郗芬似岳辉风石颂御童保杰澄天庆庆律骞汝睿商衍丰采区皎忻阔天暖夹谷攸亢饮守帆干骞答元庚晶戈其刘范泥南濮格勇沛相胤游珍练凯库芬盍暄";List<String> list = new ArrayList<>(names.length()/2);for (int i = 0; i < names.length(); i+=2) {list.add(names.substring(i,i+2));}String[] pos ={"教员","班主任","就业专员"};List<Object> args = new ArrayList<>(list.size()*2);for (String name : list) {args.add(name);args.add(pos[rand.nextInt(pos.length)]);}final String SQL = "insert into employee(empName,empPos) values(?,?)";BaseDao.addBatch(SQL,2,30,args.toArray());//2个问号}public void mkProduct(){final String SQL = "insert into productinfo(product) values(?)";BaseDao.addBatch(SQL,1,30,new String[]{"大数据","云计算"}).getDate();}public void mkSubject(){final String SQL = "insert into subjectinfo(subject,fkProductId) values(?,?)";Object[] subjectProductId = {"Java面向对象-程序开发及实战",1,"Java高级特性-编程及实战",1,"Java Web-应用设计及实战",1,"SSM轻量级框架-应用实战",1,"MySQL数据库-应用技术及实战",1,"Python-开发基础",1,"Hadoop-应用开发基础",1,"基于Hadoop与Spark-的大数据开发", 1,"微服务实战-Dubbox+SpringBoot+Docker",1,//云计算 教材..."云计算部署-实战",2,"数据库-应用",2,"云计算与网络安全",2,"Web服务器群集",2,"Web开发-实战",2,"Linux网络服务与Shell脚本攻略",2,"Python开发向导",2,"Linux系统管理",2,"大型网站架构与自动化运维",2,"网络原理与应用",2,"Docker容器与虚拟化技术",2,};BaseDao.addBatch(SQL,2,30,subjectProductId).getDate();}//大数据班 :11已毕业   ,12 java基础,oop,高级特性有成绩    13 新开班无成绩   云计算班:  ky 08 09 已毕业 ky10已经完成前5本书public void mkClass(){final String SQL = "insert into classinfo(className,fkProductId) values(?,?)";Object[] args = {"KB11",1,"KB12",1,"KB13",1,"KY08",2,"KY09",2,"KY10",2};BaseDao.addBatch(SQL,2,30,args).getDate();}public void mkRelation_class_emp(){final String SQL = "insert into relation_class_emp(fkEmpId,fkClassId) values(?,?)";Object[] args = {27,1,14,1,29,1,25,1,27,2,18,2,39,4,30,4,31,4,34,4,23,5,10,5,9,5,36,5,12,6,6,6};//Object[] args = {36,5};BaseDao.addBatch(SQL,2,30,args).getDate();}public void mkStudent(){String names = "犹曼云苟曼丽房华茂关安歌遇凌晓占夏瑶饶晶辉厍成业台琪睿睢璞玉拜山雁謇孟君双雅容系理全华尔蝶坚楠楠但平彤栋翰藻承怀曼贵采白漆雁兰练绮烟郁雨琴苗丽泽祈雅洁居悠雅力阳旭逮初柔普秋蝶盘依白裘幻珊旁箫笛江思菱尤红叶官傲之仵玉泉德沛文仰芷珊莘飞翮蔡芊丽闵文乐隋德庸秋谷之嬴夏兰解冷雁绳涵易势阳羽伊桂芝隐惠然刘醉柳惠忆安濮鹤骞老芸静巴春绿刚飞昂艾香桃腾晓兰脱半双独香天紫耘涛箕莺语支浩气竺念露姒红叶辛琴雪律曼雁黎初之向之桃实轩秀梅飞驰塔飞掣红寄南单玉轩酆贞静麦幼荷时古韵葛忆雪书田田祖映颖禹鸿光危修贤玄德容同舒怀庞梦蕊善玲珑宾雪容家巧云泥嘉誉么永逸方浦和汉芳茵波晨菲种孤萍檀琪华衣鸿远靖彦珺由真洁度清妙柔青梦贡采白代柔谨朱淑兰暴冰双在书桃叶含海穰乐音笪朝雨屠子童忻夏容薄幻竹祁半烟硕兴业崇香巧塞璇珠星和玉姜昆谊元迎海和望舒伯运华于天翰少昊空戚月天梁沛柔熊靖儿驹金鑫左恨竹板萧玉从俊侠伏寻桃谭合瑞风北嘉仇玮奇环梓欣楼文景建弘量昌思雅凤新柔昔子舒骆淑华说浩阔扶凝心堂映冬茆雅韶滕浩岚汲向明毋英睿丰半芹淦宛畅养飞英亢琳瑜府沛凝接秋双僧绮波钮山彤卞靖易乐孟阳寻梦山威涵蕾邓丝萝鄢问梅生恬默皮德润乘新颖池嘉荣藤雨灵况梓涵泉小雨士翊君叔阳飙綦青枫菅涵煦裔书云弭翠琴磨涵菡奕正祥载妙颜伟安双贝曼妮崔涵涵白曲文麴英范韶傲柔丛绮南稽悦欣顿问筠尚安宁毕皓轩水明旭郎蕴涵厉怀梦频曼容翠佳思禚燕楠卯念文修承福张雅丽抄亦玉阿白曼宿半烟盈以晴野如云化映波邝念双所初晴钱南莲员平灵税孤晴咸雅美迟寒烟才晨蓓郁艳娇来雅懿钭韫玉皇韶阳曲子楠花柔丽相雁梅守远悦睦傲易蒉飞烟孙小凝焉问儿青灵寒佘幻翠丘晴虹侍沛容过雪萍姬盼盼昂亦巧南笑雯拱怀芹宝冠玉巫梅青扬元彤甄颐真奚晓燕隗子亦洪丹彤诺志泽门长旭荣代梅荤秀媚繁梦泽尔秋玉伦静慧集碧曼虎翠柏锁玉英牵宏逸蒋思洁盛秀婉检瀚漠祭彭彭任雪卉余书易似雁蓉戎立轩铎秀隽裴鸿祯松姗姗须耘志让冬萱银映寒宇慧云经从霜友昂然宰逸丽沃启颜殷齐敏浦云淡祢又香蹇怀桃矫幻枫望雅琴臧哲茂毛静白国月明匡迎夏展觅露魏睿姿邱芷容勾蕴秀寿迎天旗恨蕊令嘉运蔺蓉城黄芳华召新立洛白秋武云水牧宇达赖友槐犁浩初咎迎秋杭雅安仍念巧摩琼怡卫春蕾受语海有童彤";final int N = names.length()/3;Object[] args = new Object[N*4];String[] genders = {"男","女"};for (int i = 0,j=0; i < args.length;j++ ) {args[i++] = names.substring(j*3,(j+1)*3 );args[i++] = 22+rand.nextInt(14);args[i++] = genders[rand.nextInt(2)];args[i++] = j/50+1;}final  String SQL = "insert into studentinfo(stuName,stuage,stuGender,fkClassId) values(?,?,?,?)";BaseDao.addBatch(SQL,4,30,args).getDate();}public void mktestinfo() throws ParseException {final String SQL = "insert into testinfo(fkClassId,fkSubjId,testDate) values(?,?,?)";//Object[] args = new Object[3*9*3+3*11*3];int index = 0;Calendar c = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date parse = sdf.parse("2021-2-8 9:00:00");for (int i = 0; i < 6; i++) {if(i<3){c.setTime(parse);c.add(Calendar.DATE,40*i);if(i==0){for (int j = 0; j < 9; j++) {args[index++]=i+1;args[index++] = j+1;c.add(Calendar.DATE,20);args[index++] = c.getTime();//System.out.println(index);}}else if(i==1){for (int j = 0; j < 9; j++) {args[index++]=i+1;args[index++] = j+1;if(j<2){c.add(Calendar.DATE,20);args[index++] = c.getTime();}else {args[index++] = null;}}}else{for (int j = 0; j < 9; j++) {args[index++]=i+1;args[index++] = j+1;args[index++] = null;}}}else{c.setTime(parse);c.add(Calendar.DATE,40*(i-3));for (int j = 0; j < 11; j++) {if(i==5 && j>5 ){args[index++]=i+1;args[index++] = j+1;args[index++] = null;}else {args[index++]=i+1;args[index++] = j+1;c.add(Calendar.DATE,20);args[index++] = c.getTime();}}}}BaseDao.addBatch(SQL,3,30, args).getDate();}public void mkscoreinfo(){final String SQL = "insert into scoreinfo(fkStuId,fkTestId,score) values(?,?,?)";Object[] args = new Object[150*9*3+150*11*3];int index = 0;for (int i = 0; i < 9; i++) {for (int j = 0; j < 150; j++) {args[index++] = j+1;args[index++] = i+1;if(j>=100){args[index++] = null;}else if(j<50){args[index++] = 20+rand.nextInt(81);}else {if(i<2){args[index++] = 20+rand.nextInt(81);}else{args[index++] = null;}}}}for (int i = 0; i < 11; i++) {for (int j = 0; j < 150; j++) {args[index++] = 150+j+1;args[index++] = 9+i+1;if(j<100){args[index++] = 20+rand.nextInt(81);}else{if(i<5){args[index++] = 20+rand.nextInt(81);}else{args[index++] = null;}}}}BaseDao.addBatch(SQL,3,30, args).getDate();}public void mkjobinfo() throws ParseException {final String SQL = "insert into jobinfo(fkStuId,company,salary,jobDate) values(?,?,?,?)";int index = 0;Object[] args = new Object[300*4];Calendar c = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date parse = sdf.parse("2021-2-8 9:00:00");for (int i = 0; i < 300; i++) {if(i<50){args[index++] = i+1;args[index++] = "公司"+i;args[index++] = 12000+rand.nextInt(28001);c.setTime(parse);c.add(Calendar.DATE,rand.nextInt(20));args[index++] = c.getTime();}else if(i<100){args[index++] = i+1;args[index++] = null;args[index++] = null;args[index++] = null;}else if(i<150){args[index++] = i+1;args[index++] = null;args[index++] = null;args[index++] = null;}else if(i<200){args[index++] = i+1;args[index++] = "公司"+i;args[index++] = 12000+rand.nextInt(28001);c.setTime(parse);c.add(Calendar.DATE,rand.nextInt(20));args[index++] = c.getTime();}else if(i<250){args[index++] = i+1;args[index++] = "公司"+i;args[index++] = 12000+rand.nextInt(28001);c.setTime(parse);c.add(Calendar.DATE,40);c.add(Calendar.DATE,rand.nextInt(20));args[index++] = c.getTime();}else if(i<300) {args[index++] = i+1;args[index++] = null;args[index++] = null;args[index++] = null;}}BaseDao.addBatch(SQL,4,30,args).getDate();}public static void main(String[] args) throws ParseException {/*Calendar c = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date parse = sdf.parse("2021-2-8 9:00:00");c.setTime(parse);Random rand = new Random();System.out.println(rand.nextInt(20));//c.add(Calendar.DATE,20);//Date date = c.add(Calendar.DATE,rand.nextInt(25));System.out.println(sdf.format(c.getTime()));*/DataMaker dk = new DataMaker();
//        dk.mkEmployee();
//        dk.mkProduct();
//        dk.mkSubject();
//        dk.mkClass();//dk.mkRelation_class_emp();
//        dk.mkStudent();
//        dk.mktestinfo();
//        dk.mkscoreinfo();dk.mkjobinfo();

写底层 jdbc 实现mysql数据库增删改的 合并方法 的类 继承ConnectionFactory 实现DaoMessage接口: 并批量添加数据相关推荐

  1. mfc连接mysql增删改查_java实现mysql数据库增删改查

    1.连接数据库: import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { stat ...

  2. MYSQL数据库 增删改查基础语句

    MYSQL数据库 增删改查基础语句 **********************DDL 语句 *********************   ( DDL 是数据定义语言的缩写,简单的说,就是对数据库内 ...

  3. Java连接Mysql数据库增删改查实现

    Java连接Mysql数据库增删改查实现 时间比较赶,我这里只实现查询,有时间再添加另外两个 难度 : ⭐⭐⭐(全星5颗星的情况下) 新建一个动态的网站工程, 把jar包全部复制进去,主要要那个mys ...

  4. MySQL数据库增删改查常用语句详解

    MySQL数据库增删改查常用语句详解 一 MySQL数据库表结构 1.1 常见数据类型 1.2 常用约束类型 1.3 MySQL存储引擎 二 DDL语句:数据定义语句 2.1 修改数据库密码 2.1. ...

  5. go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

    go语言学习第八天==>mysql数据库增删改查.用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求 引包 import的 ...

  6. Mysql (一)Mysql 数据库增删改查

    mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...

  7. mysql 编辑数据库内容_详解mysql数据库增删改操作

    插入数据 insert into 表名(列名1,列名2,列名3) values(值1,值2,值3); insert into user(user_id,name,age) values(1,'nice ...

  8. python操作Oracle、PostgreSQL,MySql数据库增删改查

    python操作Oracle.PostgreSQL,MySql数据库增删改查,工作中可运行案例,直接上代码,供大家参考. # _*_ coding:UTF-8 _*_#import ServerCon ...

  9. mysql数据库增删改查关键字_MySQL数据库(增删改查语句)

    MySQL数据库(增删改查语句) 一.登录数据库:---->  mysql -uroot -proot;(对应用户名和密码) 二.SQL语句: 数据定义语言DDL  用来定义数据库.表.列,关键 ...

最新文章

  1. windows 2003 r2 cdkey
  2. fedora17下配置tftp服务器
  3. tcp当主动发出syn_(二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上)
  4. RUP,XP,敏捷原理
  5. 华容道与数据结构 (续 3)
  6. linux 常用命令系列—cp 复制文件与文件夹
  7. 测试用例--因果图、判定表法
  8. ElasticSearch6.8.1集群搭建及Java客户端编写
  9. solr suggest+autocomplete实现自动提示
  10. 解决Eclipse开发工具Debug调试JDK源码无法查看变量值
  11. 显卡坏,导致机器无法启动
  12. linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]
  13. 使用Wineskin 重新打包《三国志 12 威力增强版 For Mac》
  14. 旅游网站php源码,基于ThinkPHP框架开发的青春旅行旅游门户整站PHP源码
  15. 导出oracle数据库日志文件,Oracle数据库导出还原的两种基本方法imp/impdp
  16. docker学习(十三)docker安装dejavu
  17. 教你来使用雪碧图(CSS sprite)
  18. 求助,电脑关闭游戏后自动弹出dptf
  19. cifs挂载 mount ubuntu_如何挂载CIFS共享?
  20. matlab 梯度图像,快速计算matlab中图像的梯度

热门文章

  1. 【Hive】Hive入门解析(一)
  2. centos7 Kubeadm安装配置K8S 及Dashboard外部服务
  3. spring cloud eureka 样式没有了,wro.css wro.js 404
  4. 2020-11-05 Win10自带虚拟机 Hyper-V使用方法
  5. 2.x终于照着教程,成功使用OpenGL ES 绘制纹理贴图,增加了灰度图
  6. centos7 挂载云盘
  7. 阿里云ECS服务器+WordPress快速搭建个人博客
  8. vuex module总结
  9. 将一个文件复制到另外一个文件中
  10. Node* create()的含义