使用JDBC,完成对如下表的增删改查操作

增加操作
使用循环和随机数技巧,增加1000个数据。要求积分在0-200,注册时间均匀分布在2018年各个月份。从26个字母中随机取出3个字母作为昵称,昵称不能一样。ID自增;
删除操作
根据用户id进行删除操作;
修改操作
可以修改指定用户的积分;
查询操作
1.可以查出指定月份注册的用户;
2.根据ID查出指定用户的信息;
3.查出积分大于某个值的用户信息;

千万别忘了导入数据库驱动包


一、建立VIP表并插入上述三条数据;


create table vip(id int PRIMARY key auto_increment, name VARCHAR(30) unique, entry_date date ,point int , sex varchar(10) )
insert into vip values(1001,'tom',str_to_date('2018.3.14 13:00:00' ,'%Y.%m.%d %H:%i:%s' ),20,'男')
insert into vip values(1002,'seo',str_to_date('2018.4.2 23:21:20' ,'%Y.%m.%d %H:%i:%s' ),90,'女')
insert into vip values(1003,'ase',str_to_date('2018.5.1 21:10:05' ,'%Y.%m.%d %H:%i:%s' ),100,'男')

表效果:

select * from vip


二、分层:持久层(dao包),工具层(commons包),模型层(pojo包),业务层(serivce 包),测试层(test包);


1.在pojo包下创建实体类Vip

package com.bjsxt.pojo;public class Vip {private int id;private String name;private String entry_date;private int point;private String sex;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEntry_date() {return entry_date;}public void setEntry_date(String entry_date) {this.entry_date = entry_date;}public int getPoint() {return point;}public void setPoint(int point) {this.point = point;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}

2.创建jdbc.properties文件

driver = com.mysql.jdbc.Driver
jdbcUrl = jdbc:mysql://localhost:3306/bjsxt?useUnicode=true&characterEncoding=utf-8
username = root
userpassword = mysql

3.在commons包下创建工具类;

package com.bjsxt.commons;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;import com.bjsxt.pojo.Vip;public class JdbcUtil {private static String driver;private static String jdbcUrl;private static String username;private static String userpassword;//读取properties文件static {ResourceBundle bundle = ResourceBundle.getBundle("jdbc");driver = bundle.getString("driver");jdbcUrl = bundle.getString("jdbcUrl");username = bundle.getString("username");userpassword = bundle.getString("userpassword");try {//驱动注册Class.forName(driver);//通过jdk反射机制将数据库驱动类实例化} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//获取Connection对象public static Connection getConnection() {Connection conn = null;try {conn = DriverManager.getConnection(jdbcUrl, username, userpassword);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}//关闭Statementpublic static void closeStatement(Statement state) {if(state!=null) {try {state.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//关闭Connectionpublic static void closeConnection(Connection conn) {if(conn!=null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//关闭ResultSetpublic static void closeResultSet(ResultSet rs) {if(rs!=null) {try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//关闭所有资源public static void closeResource(Statement state, Connection conn, ResultSet rs) {closeStatement(state);closeConnection(conn);closeResultSet(rs);}//事务回滚public static void rollback(Connection conn) {if(conn!=null) {try {conn.rollback();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}// 随机性别public static String RdSex(){String s = null;for(int i=0;i<=10;i++) {int x = (int)(2*Math.random());if(x == 1) {s = "男";}else {s = "女";}       }return s;}
//  随机日期public static String RdDate() {int m = (int)(12*Math.random())+1;int d = 0;if(m==2) {d = (int)(28*Math.random()+1);}else if(m==4||m==6||m==9||m==11) {d = (int)(30*Math.random()+1);}else {d = (int)(31*Math.random()+1);}return 2018+"-"+m+"-"+d;}//无重复随机姓名public static List<String> RdName(int num) {List<String> list = new ArrayList<>();while(true) {char n1 =(char) ('a'+((int)(26*Math.random())));char n2 =(char) ('a'+((int)(26*Math.random())));char n3 =(char) ('a'+((int)(26*Math.random())));String name = ""+n1+n2+n3;if(!list.contains(name)) {list.add(name);}if(list.size()==num) {break;}}return list;}//遍历public static void ergodic(List<Vip> list) {for(Vip v : list) {System.out.println(v.getId()+"\t"+v.getName()+"\t"+v.getEntry_date()+"\t"+v.getPoint()+"\t"+v.getSex());}}
//  随机积分public static int RdPoint() {int p = (int) (201*Math.random());return p;}
}

4.在dao包下建立BaseDao接口和VipDao接口

BaseDao接口

package com.bjsxt.dao;import java.util.List;public interface BaseDao {//创建通用的批量修改,添加的抽象方法public int executeUpdate(String sql, Object[] param);//  创建通用的查询方法public <T> List<T> find(String sql , Object[] param , Class<T> clazz);
}

VipDao接口

package com.bjsxt.dao;import java.util.List;import com.bjsxt.pojo.Vip;public interface VipDao extends BaseDao{//创建批量添加对象的抽象方法public void insertAnyVip(List<Vip> vip);//创建批量更新姓名的抽象方法public void updateAnyNameVip(List<String> vipName);//创建根据id进行删除的抽象方法public int deleteById(int vipId);//  创建根据月份进行查询的抽象方法public List<Vip> selectByMonth(int month); //  创建根据id进行查询的抽象方法public List<Vip> selectById(int vipId); // 创建根据积分大于某个值查询的抽象方法public List<Vip> selectByPointGt(int num);}

5.在dao包下建立实现类包Impl,并在其中创建BaseDao接口与VipDao接口的实现类

BaseDao接口的实现类

package com.bjsxt.dao.Impl;import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;import org.apache.commons.beanutils.BeanUtils;import com.bjsxt.commons.JdbcUtil;
import com.bjsxt.dao.BaseDao;public class BaseDaoImpl implements BaseDao {//  封装通用的DML语句;//批量修改,添加
//  实现通用的批量修改,添加的抽象方法@Overridepublic int executeUpdate(String sql, Object[] param) {Connection conn = null;PreparedStatement ps = null;int rows = 0;try {conn = JdbcUtil.getConnection();conn.setAutoCommit(false);ps = conn.prepareStatement(sql);
//              得到参数的个数ParameterMetaData pm = ps.getParameterMetaData();
//              绑定参数for(int i=0;i<pm.getParameterCount();i++) {   ps.setObject(i+1, param[i]);//批量处理}rows = ps.executeUpdate();conn.commit();}catch (Exception e) {JdbcUtil.rollback(conn);e.printStackTrace();}finally {JdbcUtil.closeResource(ps, conn, null);}return rows;}
// 实现通用的查询方法@Overridepublic <T> List<T> find(String sql, Object[] param, Class<T> clazz) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;List<T> list = new ArrayList<T>();try {conn = JdbcUtil.getConnection();ps = conn.prepareStatement(sql);
//          得到参数的个数ParameterMetaData pmd = ps.getParameterMetaData();
//          绑定参数for(int i=0;i<pmd.getParameterCount();i++) {ps.setObject(i+1, param[i]);}
//          处理结果集rs = ps.executeQuery();
//          获得结果集的信息ResultSetMetaData rsmd = rs.getMetaData();while(rs.next()) {//              完成ORM(对象关系映射)处理:通过jdk的反射T bean = clazz.newInstance();//通过反射创建该类的对象for(int i=0;i<rsmd.getColumnCount();i++) {//                  得到列名String columnName = rsmd.getColumnName(i+1);
//                  获取列的值Object values = rs.getObject(columnName);
//                  通过BeanUnil工具类将值放入对象中BeanUtils.setProperty(bean, columnName, values);}list.add(bean);}}catch (Exception e) {e.printStackTrace();}finally {JdbcUtil.closeResource(ps, conn, rs);}return list;}}

VipDao接口的实现类

package com.bjsxt.dao.Impl;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.List;import com.bjsxt.commons.JdbcUtil;
import com.bjsxt.dao.VipDao;
import com.bjsxt.pojo.Vip;
/*** VipDao接口的实现类* * */
public class VipDaoImpl extends BaseDaoImpl implements VipDao {//实现批量添加对象的抽象方法@Overridepublic void insertAnyVip(List<Vip> vip) {Connection conn = null;PreparedStatement ps = null;try {conn = JdbcUtil.getConnection();conn.setAutoCommit(false);ps = conn.prepareStatement("insert into vip values(?,?,?,?,?)");for(int i=0;i<vip.size();i++) {    ps.setInt(1, vip.get(i).getId());ps.setString(2, vip.get(i).getName());ps.setString(3, vip.get(i).getEntry_date());ps.setInt(4, vip.get(i).getPoint());ps.setString(5,vip.get(i).getSex());//批量处理ps.addBatch();}int[] arr = ps.executeBatch();conn.commit();if(arr.length>0) {System.out.println("批量成功添加元素");}else {System.out.println("添加添加元素,失败");}}catch (Exception e) {JdbcUtil.rollback(conn);e.printStackTrace();}finally {JdbcUtil.closeResource(ps, conn, null);}}
//  实现批量更新姓名的抽象方法@Overridepublic void updateAnyNameVip(List<String> list) {Connection conn = null;PreparedStatement ps = null;try {conn = JdbcUtil.getConnection();conn.setAutoCommit(false);ps = conn.prepareStatement("update vip set name=? where id = ?");for(int i=0;i<list.size();i++) {ps.setString(1, list.get(i));ps.setInt(2, i+1001);ps.addBatch();}int[] a = ps.executeBatch();conn.commit();if(a.length>0) {System.out.println("批量修改姓名成功");}else {System.out.println("批量修改姓名失败");}}catch (Exception e) {JdbcUtil.rollback(conn);e.printStackTrace();}finally {JdbcUtil.closeResource(ps, conn, null);}}
//  实现根据id进行删除的抽象方法@Overridepublic int deleteById(int vipId) {String sql = "delete from vip where id = ?";Object[] param = new Object[] {vipId};return this.executeUpdate(sql, param);}
//  实现根据月份进行查询的抽象方法@Overridepublic List<Vip> selectByMonth(int month) {String sql = "select * from vip where Month(entry_date) = ?";Object[] param = new Object[] {month};Class<Vip> clazz = Vip.class;return this.find(sql, param, clazz);}
//  实现根据id进行查询的抽象方法@Overridepublic List<Vip> selectById(int vipId) {String sql = "select * from vip where id = ?";Object[] param = new Object[] {vipId};Class<Vip> clazz = Vip.class;return this.find(sql, param, clazz);}
//  实现根据积分大于某个值查询的抽象方法@Overridepublic List<Vip> selectByPointGt(int num) {String sql = "select * from vip where point > ?";Object[] param = new Object[] {num};Class<Vip> clazz = Vip.class;return this.find(sql, param, clazz);}}

6.在serivce包下建立VipSerivce接口

package com.bjsxt.serivce;import java.util.List;import com.bjsxt.pojo.Vip;public interface VipSerivce {//    创建向vip表中添加大量数据的抽象方法public void addBatchVip(List<Vip> vip );//     创建大量修改vip表中的姓名的抽象方法;public void modifyNameBatchVip(List<String> vip);//    创建根据用户id删除vip表信息的抽象方法;public int dropByVipId(int VipId);//   创建根据注册月份查询vip表的方法public List<Vip> findByVipMon(int month); // 创建根据用户id查询vip表的方法public List<Vip> findByVipId(int vipId);//   创建根据积分大于某个值查询vip表的抽象方法public List<Vip> findByPointGt(int num);}

7.在serivce包下建立实现类包Impl,并创建serivce接口的实现类;

package com.bjsxt.serivce.Impl;import java.util.List;import com.bjsxt.dao.VipDao;
import com.bjsxt.dao.Impl.VipDaoImpl;
import com.bjsxt.pojo.Vip;
import com.bjsxt.serivce.VipSerivce;
/*** VipSerivce接口的实现类* * */
public class VipSerivceImpl implements VipSerivce{//    实现向vip表中添加大量数据的抽象方法@Overridepublic void addBatchVip(List<Vip> vip) {VipDao vd = new VipDaoImpl();vd.insertAnyVip(vip);}
// 实现大量修改vip表中的姓名的抽象方法;@Overridepublic void modifyNameBatchVip(List<String> vip) {VipDao vd = new VipDaoImpl();vd.updateAnyNameVip(vip);}
//  实现根据用户id删除vip表信息的抽象方法;@Overridepublic int dropByVipId(int vipId) {VipDao vd = new VipDaoImpl();return vd.deleteById(vipId);}
//  实现根据注册月份查询vip表的方法@Overridepublic List<Vip> findByVipMon(int month) {VipDao vd = new VipDaoImpl();return vd.selectByMonth(month);}
//  实现根据用户id查询vip表的方法@Overridepublic List<Vip> findByVipId(int vipId) {VipDao vd = new VipDaoImpl();return vd.selectById(vipId);}
//  实现根据积分大于某个值查询vip表的抽象方法@Overridepublic List<Vip> findByPointGt(int num) {VipDao vd = new VipDaoImpl();return vd.selectByPointGt(num);}}

8.在test包下建立,测试类Test

public static void main(String[] args) {List<Vip> list = new ArrayList<Vip>();for(int i=1;i<=1000;i++) {Vip v = new Vip();v.setId(1000+i);v.setName("a"+i);v.setEntry_date(JdbcUtil.RdDate());v.setPoint(JdbcUtil.RdPoint());v.setSex(JdbcUtil.RdSex());list.add(v);}VipSerivce vs = new VipSerivceImpl();
//          向vip表格中添加1000条数据vs.addBatchVip(list);//         修改vip表中上述数据中名字为1000个三个字母组成不重复的名字;vs.modifyNameBatchVip(JdbcUtil.RdName(1000));//         删除id为1002的用户vs.dropByVipId(1002);//         查询七月份注册的用户List<Vip> list4 = vs.findByVipMon(7);JdbcUtil.ergodic(list4);//            查询id为1034的用户信息List<Vip> list5 = vs.findByVipId(1034);JdbcUtil.ergodic(list5);//          查询积分大于199的用户信息List<Vip> list6 = vs.findByPointGt(199);JdbcUtil.ergodic(list6);}  }

终于写完了!如果能帮到您,请留个赞吧!

使用JDBC,完成对如下表的增删改查操作相关推荐

  1. JDBC——商品品牌数据的增删改查操作

    JDBC练习--完成商品品牌数据的增删改查操作 一.准备环境 1.数据库表tb_brand 2.实体类Brand /*** 品牌* alt+鼠标左键,整列编辑* 在实体类中,基本数据类型建议使用其对应 ...

  2. mysql增删改查 dao_MYSQL 之 JDBC(七):增删改查(五) DAO设计模式

    Data Access Object,数据访问对象 what:访问数据信息的类.包含了对数据的CRUD(create.read.update.delete,增删改查)操作,而不包含任何业务相关的信息. ...

  3. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  4. DAO模式设计-JDBC连接Mysql数据库实现增删改查及JunitTest单元测试

     概念介绍 JDBC JDBC(Java数据库连接,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC ...

  5. JDBC中用控制台简单对数据库进行增删改查操作(IDEA.2023)

    文章目录 前言 一.首先是每个操作共用的操作大纲 1.注册驱动 2.创建连接 3.编写SQL语句结果,动态值的部分使用?代替 4.创建prepareStatement,并且传入SQL语句的结果 5.占 ...

  6. (Java/JDBC)对MySQL数据库实现基础的增删改查操作(含源码)

    文章目录 前言 注(常用PreparedStatement方法) 源码展示 前言 实现数据库连接 → Java连接MySQL数据库(含源码) (实现简单的增删查改更改正确的SQL语句即可) 增:ins ...

  7. JDBC练习-完成商品品牌数据的增删改查操作

    准备环境 数据库表tb_brand -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand ...

  8. 学生信息管理系统(连接数据库,面向对象的方法实现学生信息的增删改查操作)...

    ---------------------------------------------------------------------------------------------------- ...

  9. java调用oracle删除,使用IDEA对Oracle数据库进行简单增删改查操作

    1.1 java中的数据存储技术 在java中,数据库存取技术可分为如下几类: 1.jdbc直接访问数据库 2.jdo(java data object)是java对象持久化的新的规范,也是一个用于存 ...

最新文章

  1. MOS管好坏的判别方法
  2. Citrix WebInterface 配置向导
  3. 第三次学JAVA再学不好就吃翔(part7)--基础语法之运算符
  4. SAP S/4HANA是如何通过SADL框架加CDS view读取销售订单数据的
  5. win7家庭版远程桌面补丁_无需惊慌!微软漏洞数月后再被“预警”打补丁即可防御...
  6. 宇轩网络面试题目PHP,二十道接地气的php面试题,让你直接通过面试!就此奉上~...
  7. destoon b2b 360网站智能摘要标签配置
  8. linux系统用户管理
  9. Gulp介绍与入门实践
  10. css盒模型(附图解)
  11. Java平台划分-J2EE,J2SE,J2ME
  12. 【渝粤题库】广东开放大学 大学生创业基础 形成性考核
  13. 手机号码相关信息整理
  14. 很多人知道外包的种种不好,但还是选择去外包,这是为什么呢?
  15. Ubuntu 14.04重装mysql
  16. 第5节 树形计算亚式期权价格
  17. PhD Debate-8 | 迈向常识知识的高级语义理解
  18. 广东迅视 第九届“五洲工业发展论坛”在深圳举办
  19. 面试官:来考考你几道常见的MySQL题目吧
  20. 人工智能洗衣机模糊推理系统实验(课本实验)

热门文章

  1. 将js进行到底:node学习10
  2. UVa10795 - A Different Task(递归)
  3. USACO 2.1 健康的好斯坦奶牛 (DFS)
  4. 【转】 指针函数与函数指针的区别
  5. 操作系统-命令解释程序(实验一)
  6. size/resize与 capacity/reserve
  7. ESP32 OTA 策略的优点与可能的问题
  8. ESP32 OTA升级框架
  9. 区块链BaaS云服务(32)同盾科技 IASC平台
  10. 现代密码学2.1--完美安全和完美不可区分/Perfectly secret, Perfectly indistinguishable