jdbc-mysql基础 增删查改 简单示例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdbc-mysql基础 增删查改 简单示例相关的知识,希望对你有一定的参考价值。
礼悟:
好好学习多思考,尊师重道存感恩。叶见寻根三二一,江河湖海同一体。
虚怀若谷良心主,愿行无悔给最苦。读书锻炼强身心,诚劝且行且珍惜。
数据、数据,命根就在数据。云计算、AI等技术,都是以数据为基础。操作数据库一定要谨慎小心。给最苦 这里的代码,看看就好,要有自己的判断。遇到抉择,要不耻上下问。
javaSE:8
mysql:5.7.14
mysql-connector-java:5.1.44
os:windows7 x64
ide:MyEclipse 2017
项目结构
下面是各个包下的各个类的代码展示
com.jizuiku.jdbc
- JDBCUtils
package com.jizuiku.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.jizuiku.jdbc.dao.DaoException; /** * * * @author 给最苦 * @version V17.11.07 */ public final class JDBCUtils { /** * url格式 -> jdbc:子协议:子名称//主机名:端口号/数据库的名字?属性名=属性值&属性名=属性值 * configString变量中有多个参数,需要深入地去研究它们的具体含义 */ private static String configString = "?useUnicode=true&characterEncoding=utf8&useSSL=true"; private static String url = "jdbc:mysql://localhost:3306/jdbcforjava" + configString; // 本地的mysql数据库(无子名称) 端口号3306 数据库jdbcforjava private static String user = "root"; private static String password = ""; // 工具类,直接使用,不可生对象 private JDBCUtils() { } // 把注册驱动放到静态代码块中,因为 静态代码块只执行一次 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block // 异常要抛出去 throw new ExceptionInInitializerError(e); } } /** * 获取与指定数据库的链接 * */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } /** * 释放三种资源ResultSet Statement Connection * */ public static void free(ResultSet rs, PreparedStatement ps, Connection con) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block throw new DaoException(e); } finally { try { if (ps != null) { ps.close(); } } catch (SQLException e) { // TODO Auto-generated catch block throw new DaoException(e); } finally { try { if (con != null) { con.close(); } } catch (SQLException e) { // TODO Auto-generated catch block throw new DaoException(e); } } } } }
com.jizuiku.jdbc.dao
- BookDao
package com.jizuiku.jdbc.dao; import com.jizuiku.jdbc.domain.Book; /** * 这个接口可以将 业务逻辑层与数据访问层 分割开来的,是一种很强的思想。 * * @author 博客园-给最苦 * @version V17.11.08 */ public interface BookDao { /** * 添加新的书籍 * */ public void addBook(Book book); /** * 根据id来查询相关书籍的信息,因为id是唯一的 * */ public Book getBook(int id); /** * 更新数据库中的书籍 * * */ public void updateBook(Book book); /** * 删除数据库中的指定书籍 * * */ public void deleteBook(Book book); }
- DaoException
package com.jizuiku.jdbc.dao; /** * 这个类很重要,即完成了抛异常的动作、通过编译,又可以使数据逻辑层的接口保持简洁。 * * @author 博客园-给最苦 * @version V17.11.08 */ public class DaoException extends RuntimeException { /** * */ private static final long serialVersionUID = 1L; public DaoException() { // TODO Auto-generated constructor stub } public DaoException(String message) { super(message); // TODO Auto-generated constructor stub } public DaoException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } public DaoException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } public DaoException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } }
- DaoFactory
package com.jizuiku.jdbc.dao; import java.io.InputStream; import java.util.Properties; /** * 工厂类-单例模式 * * @author 博客园-给最苦 * @version V17.11.08 */ public class DaoFactory { /* * 这里有个大坑:只要把这两句话,调换一下位置。那么返回的bookDao总是null * 为什么? * 因为想想初始化的顺序,new DaoFactory()经过千辛万苦 把bookDao弄好了, * 紧接着 BookDao bookDao = null;...前功尽弃 * */ private static BookDao bookDao = null; private static DaoFactory instance = new DaoFactory(); /** * Properties + 反射 ->初始化 * 这样的话,以后 给最苦 把接口从新实现了一下,生出了一个新的类。那么 只需要改配置文件就OK了 * 天呀,这是哪位前辈想到的。。。 * * */ private DaoFactory() { // TODO Auto-generated constructor stub // 这里使用Properties读取配置文件 // 也可以使用xml Properties prop = new Properties(); InputStream inputStream = null; try { // 这个写的,很强! inputStream = DaoFactory.class.getClassLoader().getResourceAsStream("bookDao.properties"); // 通过流加载配置文件 prop.load(inputStream); /* * bookDao=com.jizuiku.jdbc.dao.impl.BookDaoJDBCImpl * key:bookDao * value:com.jizuiku.jdbc.dao.impl.BookDaoJDBCImpl * value刚好是bookDao接口的实现类 */ String bookDaoImplClassPath = prop.getProperty("bookDao"); // 有了bookDaoImplClassPath,就可以应用反射来构造这个类 bookDao = (BookDao)Class.forName(bookDaoImplClassPath).newInstance(); } catch (Exception e) { // try中所有的代码都是初始化的过程,所以 一旦有错误,那么直接报错! throw new ExceptionInInitializerError(e); } } public static DaoFactory getInstance() { return instance; } public BookDao getBookDao() { return bookDao; } }
com.jizuiku.jdbc.dao.impl
- BookDaoJDBCImpl
package com.jizuiku.jdbc.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.jizuiku.jdbc.JDBCUtils; import com.jizuiku.jdbc.dao.BookDao; import com.jizuiku.jdbc.dao.DaoException; import com.jizuiku.jdbc.domain.Book; /** * * * @author 博客园-给最苦 * @version V17.11.08 */ public class BookDaoJDBCImpl implements BookDao { /** * 增加操作 * * */ @Override public void addBook(Book book) { // TODO Auto-generated method stub Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { // 注册驱动并建立连接 con = JDBCUtils.getConnection(); // 创建语句 并 对sql语句进行一些预处理 String sql = "insert into book(name,quantity,time,price) values(?,?,?,?)"; // 注明要返回主键 ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); // 向sql语句中传入值 ps.setString(1, book.getName()); ps.setInt(2, book.getQuantity()); ps.setDate(3, new java.sql.Date(book.getTime().getTime())); ps.setBigDecimal(4, book.getPrice()); // 执行sql语句 ps.executeUpdate(); // 得到的主键 // 因为主键就一个,而且是Int类型的 int id = 0; rs = ps.getGeneratedKeys(); if(rs.next()){ // 该对象成功插入数据库,把得到的主键给这个book对象 id = rs.getInt(1); book.setId(id); } } catch (SQLException e) { // TODO Auto-generated catch block // 这里针对异常的处理,蕴含着智慧,十分关键! throw new DaoException(e.getMessage(), e); } finally { // 释放资源 JDBCUtils.free(rs, ps, con); } } /** * 查询操作 * */ @Override public Book getBook(int id) { // TODO Auto-generated method stub Connection con = null; PreparedStatement ps = null; ResultSet rs = null; Book book = null; try { // 注册驱动并建立连接 con = JDBCUtils.getConnection(); // 创建语句 String sql = "select id,name,quantity,time,price from book where id=?"; ps = con.prepareStatement(sql); ps.setInt(1, id); // 执行语句 rs = ps.executeQuery(); // 处理结果 if (rs.next()) { // 有查询到,那么创建一个对象s book = mappingBook(rs); } } catch (SQLException e) { // TODO Auto-generated catch block // 这里针对异常的处理,蕴含着智慧,十分关键! throw new DaoException(e.getMessage(), e); } finally { // 释放资源 JDBCUtils.free(rs, ps, con); } return book; } /** * 修改操作 * * */ @Override public void updateBook(Book book) { // TODO Auto-generated method stub Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { // 注册驱动并建立连接 con = JDBCUtils.getConnection(); // 创建语句 String sql = "update book set name=?,quantity=?,time=?,price=? where id=?"; ps = con.prepareStatement(sql); // 向sql语句中传入值 ps.setString(1, book.getName()); ps.setInt(2, book.getQuantity()); // 进行转换 从util包下的date转为 sql包下的date ps.setDate(3, new java.sql.Date(book.getTime().getTime())); ps.setBigDecimal(4, book.getPrice()); ps.setInt(5, book.getId()); // 执行语句 ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block // 这里针对异常的处理,蕴含着智慧,十分关键! throw new DaoException(e.getMessage(), e); } finally { // 释放资源 JDBCUtils.free(rs, ps, con); } } /** * 删除操作 * * */ @Override public void deleteBook(Book book) { // TODO Auto-generated method stub Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { // 注册驱动并建立连接 con = JDBCUtils.getConnection(); // 创建语句 String sql = "delete from book where id=?"; ps = con.prepareStatement(sql); ps.setInt(1, book.getId()); // 执行语句 ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block // 这里针对异常的处理,蕴含着智慧,十分关键! throw new DaoException(e.getMessage(), e); } finally { // 释放资源 JDBCUtils.free(rs, ps, con); } } /** * 根据查询结果对Book对象进行赋值,并返回一个赋值好的对象 * */ private Book mappingBook(ResultSet rs) throws SQLException { // 这样做的好处是:减少代码重复使用 // 便于以后的优化 Book book = new Book(); book.setId(rs.getInt("id")); book.setName(rs.getString("name")); book.setQuantity(rs.getInt("quantity")); book.setTime(rs.getTimestamp("time")); book.setPrice(rs.getBigDecimal("price")); return book; } }
com.jizuiku.jdbc.domain
- Book
package com.jizuiku.jdbc.domain; import java.math.BigDecimal; /** * Book对象与数据库的表示对应的 * * @author 博客园-给最苦 * @version V17.11.08 */ public class Book { private int id; private String name; private int quantity; private java.util.Date time; private BigDecimal price; 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 int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } public java.util.Date getTime() { return time; } public void setTime(java.util.Date time) { this.time = time; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((price == null) ? 0 : price.hashCode()); result = prime * result + quantity; result = prime * result + ((time == null) ? 0 : time.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Book other = (Book) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (price == null) { if (other.price != null) return false; } else if (!price.equals(other.price)) return false; if (quantity != other.quantity) return false; if (time == null) { if (other.time != null) return false; } else if (!time.equals(other.time)) return false; return true; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", quantity=" + quantity + ", time=" + time + ", price=" + price + "]"; } }
数据库中的数据
下面进行 增删查改 的测试!
com.jizuiku.jdbc.demo
- Demo
删除测试
package com.jizuiku.jdbc.demo; import java.math.BigDecimal; import java.util.Date; import com.jizuiku.jdbc.dao.BookDao; import com.jizuiku.jdbc.dao.DaoFactory; import com.jizuiku.jdbc.domain.Book; /** * 测试类 * * @author 博客园-给最苦 * @version V17.11.08 */ public class Demo { public static void main(String[] args) { // 使用工厂类,扩展性变得更强! BookDao bookDao = DaoFactory.getInstance().getBookDao(); Book book = new Book(); book.setId(15); // 删除测试 // 删除id=15的那条记录 bookDao.deleteBook(book); System.out.println(book.toString()); } }
运行代码前数据库的状态
运行代码,控制台的输出是
数据库中的数据发生变动
增加测试
package com.jizuiku.jdbc.demo; import java.math.BigDecimal; import java.util.Date; import com.jizuiku.jdbc.dao.BookDao; import com.jizuiku.jdbc.dao.DaoFactory; import com.jizuiku.jdbc.domain.Book; /** * 测试类 * * @author 博客园-给最苦 * @version V17.11.08 */ public class Demo { public static void main(String[] args) { // 使用工厂类,扩展性变得更强! BookDao bookDao = DaoFactory.getInstance().getBookDao(); Book book = new Book(); book.setName("孟子"); book.setQuantity(40); book.setTime(new Date()); book.setPrice(new BigDecimal(Double.toString(99.99))); // 增加测试完成! bookDao.addBook(book); System.out.println(book.toString()); } }
运行代码前数据库的状态
运行代码,控制台的输出是
数据库中的数据发生变动
查找测试
package com.jizuiku.jdbc.demo; import java.math.BigDecimal; import java.util.Date; import com.jizuiku.jdbc.dao.BookDao; import com.jizuiku.jdbc.dao.DaoFactory; import com.jizuiku.jdbc.domain.Book; /** * 测试类 * * @author 博客园-给最苦 * @version V17.11.08 */ public class Demo { public static void main(String[] args) { // 使用工厂类,扩展性变得更强! BookDao bookDao = DaoFactory.getInstance().getBookDao(); Book book = new Book(); // 查找测试完成! book = bookDao.getBook(5); System.out.println(book.toString()); } }
数据库中存储的数据
运行代码后,控制台输出的结果
注:给最苦 所做的这个查询是按照 id值来查询的,结果唯一。给最苦 没有实现结果不唯一的查询。
修改测试
package com.jizuiku.jdbc.demo; import java.math.BigDecimal; import java.util.Date; import com.jizuiku.jdbc.dao.BookDao; import com.jizuiku.jdbc.dao.DaoFactory; import com.jizuiku.jdbc.domain.Book; /** * 测试类 * * @author 博客园-给最苦 * @version V17.11.08 */ public class Demo { public static void main(String[] args) { // 使用工厂类,扩展性变得更强! BookDao bookDao = DaoFactory.getInstance().getBookDao(); Book book = new Book(); book.setId(6); book.setName("孟子"); book.setQuantity(40); book.setTime(new Date()); book.setPrice(new BigDecimal(Double.toString(99.99))); // 更改测试完成! // 是根据Id值来更改的 bookDao.updateBook(book); System.out.println(book.toString()); } }
执行代码前,数据库的内容
执行代码后,控制台的输出
数据库的变动
好,博文到这里就结束了。。。终于结束了。给最苦 都写累了。
那个《金刚经》上讲:“以无我无人无众生无寿者。修一切善法。”,所以 给最苦 在这里就不讨要个 感恩的心了。但是,还是讲如果有心的话,在心里说声谢谢呗。虽然 给最苦 的技术很差,这篇博文的水平也只能用来参考。但是,这份坚持把 给最苦 都感动坏了。
还是博文开头的那句话:
数据、数据,命根就在数据。云计算、AI等技术,都是以数据为基础。操作数据库一定要谨慎小心。给最苦 这里的代码,看看就好,要有自己的判断。遇到抉择,要不耻上下问。
加油!
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。
以上是关于jdbc-mysql基础 增删查改 简单示例的主要内容,如果未能解决你的问题,请参考以下文章