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基础 增删查改 简单示例的主要内容,如果未能解决你的问题,请参考以下文章

mybatis增删查改

单链表~增删查改(附代码)~简单实现

使用js基础实现增删查改

MERGE批量增删查改数据

mvc模式下dao中的增删查改

Mybatis之Oracle增删查改示例--转