使用JDBC,完成对如下表的增删改查操作
生活随笔
收集整理的這篇文章主要介紹了
使用JDBC,完成对如下表的增删改查操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用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 = mysql3.在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,完成对如下表的增删改查操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有趣的高频面试题
- 下一篇: java面向对象知识汇总的思维导图