MySQL数据库入门学习(二)——使用JDBC实现对数据库的删查改功能

发布于 2020-10-31  302 次阅读


MySQL数据库入门学习(二)——使用JDBC实现对数据库的删查改功能

1.前言

在上篇文章中已经建立了数据库和表,并且使用JDBC连接了数据库实现了向数据库中插入数据的功能:详情请看:MySQL数据库入门学习(一)——创建数据库并Java实现JDBC连接数据库后添加数据

2.MySQL的增删除该

常用的Statement方法:
1,boolean execute 允许执行查询语句、更新语句、DDL语句
返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句。
2,getUpdateCount方法 获取更新的记录数量。
3,int executeUpdate(String sql)执行给定 SQL 语句
该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
4,ResultSet executeQuery(String sql) 执行给定的 SQL 语句
该语句返回单个 ResultSet 对象。返回值是更新的记录数量。
事实上,MySQL的 “增删查改”其实就是分为两类,一类是更新操作:int executeUpdate(String sql)包括了插入(insert),更新(update),删除(delete);另外一类是查询操作(select),由ResultSet executeQuery(String sql) 实现。

3.使用jdbc实现对数据库数据的更新,删除,查找功能。

我们知道使用Statement和PreparedStatement都能对数据库进行操作,但是在我们在具体的生产环境中总是普遍使用PreparedStatement进行对数据库操作,防止SQL注入的风险。因此以下代码均使用PreparedStatement进行操作数据库。

3.1更新操作,删除操作

 /**
     * 更新book
     * @param newBook
     * @return 返回受影响的行数
     */
    public int updateBookByPreparedStatement(Book newBook) {
    	
    	//拼接需要执行的更新sql语句
    	String sql = "update  book  set name=?,price = ?,status = ?,discount = ?,isBorrowed = ?,createTime = ? where id = ?";
    	int result = 0;
    	try {
    		//获取创建连接
			Connection connection = JDBCUtil.getConnection();
			//创建预处理对象
			PreparedStatement preparedStatement = connection.prepareStatement(sql);
			//设置name占位符对应的值
			preparedStatement.setString(1, newBook.getName());
			//设置price占位符对应的值
			preparedStatement.setDouble(2, newBook.getPrice());
			//设置status占位符对应的值
			preparedStatement.setByte(3, newBook.getStatus());
			//设置discount占位符对应的值
			preparedStatement.setFloat(4, newBook.getDiscount());
			//设置isBorrowed对应占位符的值
			preparedStatement.setBoolean(5, newBook.isBorrowed());
			//设置createTime占位符对应的值,需要将 java.Util.Date 转化为 java.sql.Date才可以
			preparedStatement.setDate(6,new Date(newBook.getCreateTime().getTime()));
			//设置id占位符对应的值
			preparedStatement.setInt(7, newBook.getId());
			//开始执行更新,并返回影响的行数
			result = preparedStatement.executeUpdate();
			//释放资源,先开启的后释放
			preparedStatement.close();
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	
		return result;
    	
    }
    /**
     * 删除book
     * @param id 需要删除书籍的ID
     * @return 返回受影响的行数
     */
    public int deleteBookById(int id) {
    	
    	//拼接需要执行的删除的sql语句
    	String sql = "delete from book  where id = ?";
    	int result = 0;
    	
    	try {
    		//获取创建连接
			Connection connection = JDBCUtil.getConnection();
			//创建预处理对象
			PreparedStatement preparedStatement = connection.prepareStatement(sql);
			//设置id占位符对应的值
			preparedStatement.setInt(1, id);
			//开始执行更新,并返回影响的行数
			result = preparedStatement.executeUpdate();
			//释放资源,先开启的后释放
			preparedStatement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
    	
    }
    

3.2查询操作:查询单个,查询所有

3.2.1ResultSet简介

结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,它同时还具有操纵数据的功能,可能完成对数据的更新等.。
结果集读取数据的方法主要是getXXX(),它的参数可以是整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列 是空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false.使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有: 基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日 期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型 (BigDecimal和BigInteger等)等。还可以使用getArray(intcolindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用 getAsciiStream(intcolindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。
结果集从其使用的特点上 可以分为四类,这四类的结果集的所具备的特点都是和Statement(或者Statement的子类)语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以 说,结果集具备何种特点,完全决定于Statement。
本文只简单介绍其中最基本的一种用法:
之所以说是最基本的ResultSet是因为这个ResultSet它起到的作用就是完成了查询结果的存储功能,而且只能读取一次,不能够来回的滚动读取。这种结果集的创建方式如下:

Statement st = conn.CreateStatement()
ResultSet rs = Statement.excuteQuery(sqlStr);

由于这种结果集不支持滚动的读取功能,所以如果获得这样一个结果集,只能使用它里面的next()方法,逐个的读去数据.。注意,在读取ResultSet 的数据前,一定要先使用resultSet.next()首先判定有没有数据并且移动游标到第一个记录的位置。这是因为:
开始指针位置位于第一行之前,也就是说,第一次调用next()方法后才能开始获取数据。这种做法的好处在于可以方便地配合while进行遍历,而不用担心取不到第一行。

while(resultSet.next()){
    //resultSet.getXXX()
}
  1. 指针移动到最后一行之后返回false,可以用作循环结束的条件。在两种情况下:遍历到最后一行之后;或者当 ResultSet 中没有元素、行数为0时,返回false退出循环

3.2.2 如想更加深入了解ResultSet 的其它用法,请自行百度。

3.2.3具体代码实现

 /**
     * 通过ID查询book
     * @param id 要查询的book的ID
     * @return 返回ID对应的book
     */
    public Book findBookById(int id) {
    	//拼接需要执行的查找的sql语句
    	String sql = "select * from book  where id = ?";
    	//结果集
    	ResultSet resultSet = null;
    	Book book = null;
    	try {
    		//获取创建连接
			Connection connection = JDBCUtil.getConnection();
			//创建预处理对象
			PreparedStatement preparedStatement = connection.prepareStatement(sql);
			//设置id占位符对应的值
			preparedStatement.setInt(1, id);
			//开始执行查询语句,并返回查询的结果集
			resultSet = preparedStatement.executeQuery();
			//如果查询到结果不为空而是有记录
			if(resultSet.next()) {
			//获取book的name
			String name = resultSet.getString("name");
			//获取book的status
			byte status = resultSet.getByte("status");
			//获取book的price
			double price = resultSet.getDouble("price");
			//获取book的discount
			float discount = resultSet.getFloat("discount");
			//获取book的isBorrowed
			boolean isBorrowed = resultSet.getBoolean("isBorrowed");
			//获取book的createTime
			Date date = resultSet.getDate("createTime");
			book = new Book();
			book.setBorrowed(isBorrowed);
			book.setDiscount(discount);
			book.setId(id);
			book.setPrice(price);
			book.setName(name);
			book.setStatus(status);
			book.setCreateTime(date);
			}
			//释放资源,先开启的后释放
			resultSet.close();
			preparedStatement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
			book = null;
		}
    	
    	
		return book;
    	
    }
    /**
     * 查询所有图书
     * @return 返回List<book>
     */
    public List<Book> findAllBook() {
    	//拼接需要执行的查找的sql语句
    	String sql = "select * from book ";
    	//结果集
    	ResultSet resultSet = null;
    	List<Book> bookList = null;
    	try {
    		//获取创建连接
			Connection connection = JDBCUtil.getConnection();
			//创建预处理对象
			PreparedStatement preparedStatement = connection.prepareStatement(sql);
			//开始执行查询语句,并返回查询的结果集
			resultSet = preparedStatement.executeQuery();
			bookList = new ArrayList<>();
			//如果查询到结果不为空而是有记录
			while(resultSet.next()) {
			//获取book的ID
			int id = resultSet.getInt("id");
			//获取book的name
			String name = resultSet.getString("name");
			//获取book的status
			byte status = resultSet.getByte("status");
			//获取book的price
			double price = resultSet.getDouble("price");
			//获取book的discount
			float discount = resultSet.getFloat("discount");
			//获取book的isBorrowed
			boolean isBorrowed = resultSet.getBoolean("isBorrowed");
			//获取book的createTime
			Date date = resultSet.getDate("createTime");
			Book book = new Book();
			book.setBorrowed(isBorrowed);
			book.setDiscount(discount);
			book.setId(id);
			book.setPrice(price);
			book.setName(name);
			book.setStatus(status);
			book.setCreateTime(date);
			bookList.add(book);
			}
			
			//释放资源,先开启的后释放
			resultSet.close();
			preparedStatement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
			bookList = null;
		}
    	
    	
		return bookList;
    	
    }

4.测试代码

@Test
    void testUpdateBook() {
        Book newBook = new Book();
        newBook.setId(1);
        newBook.setName("红楼梦");
        newBook.setCreateTime(new Date());
        newBook.setBorrowed(Book.isBorrowed_FALSE);
        newBook.setPrice(60.5);
        newBook.setStatus(Book.STATUS_NORMAL);
        BookDao bookDao = new BookDao();
        int result = bookDao.updateBookByPreparedStatement(newBook);
        if(result == 1) {
            System.out.println("更新书籍成功!");
        }else {
            System.out.println("更新书籍失败!");
        }

    }
    @Test
    void testdeleteBookById() {
        BookDao bookDao = new BookDao();
        int result = bookDao.deleteBookById(2);
        if(result == 1) {
            System.out.println("删除书成功!");
        }else {
            System.out.println("删除书失败!");
        }

    }
    @Test
    void testFindBookById() {
        BookDao bookDao = new BookDao();
        Book book = bookDao.findBookById(3);
        if(book != null) {
          System.out.println("查找书籍成功:"+ book);
        }else {
            System.out.println("数据库中不存在该书籍!");
        }

    }
    @Test
    void testFindAllBook() {
        BookDao bookDao = new BookDao();
        List<Book> bookList = bookDao.findAllBook();
        if(bookList == null || bookList.size() == 0) {
            System.out.println("书籍为空!");
        }else {
            for(Book book : bookList) {
                System.out.println(book);
            }
        }


    }

之后使用JUnit单元测试的方法进行测试即可。

5.本项目源代码下载(eclipse2019,JDK1.8,MySQL8.0):


繁华落尽,雪花漫天飞舞。