JDBC的学习(第三节:使用Statement接口实现增、删、改操作)

本次的学习主要分为九个部分

第一节:JDBC的概述

第二节:JDBC连接数据库

第三节:使用Statement接口实现增、删、改操作

第四节:使用PreparedStatement接口实现增、删、改的操作

第五节:Resultset结果集

第六节:处理大数据对象

第七节:使用CallableStatement接口调用存储过程

第八节:使用元数据分析数据库

第九节:JDBC的事务处理事务

下面是第三部分,其他部分可以通过上面的链接访问

3.使用Statement接口实现增、删、改操作

  1. Statement 接口引入
    作用:用于执行静态 SQL 语句并返回它所生成结果的对象。 int executeUpdate(String sql) 执行给定 SQL
    语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或 者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
    void close() 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
  2. 使用 Statement 接口实现添加数据操作
  3. 使用 Statement 接口实现更新数据操作
  4. 第四节 :使用 Statement 接口实现删除数据操作

首先看到的是jdk开发文档中的statement中executeUpdate方法,因为这个方法的作用就是执行sql语句,方法下面介绍了,这可能是插入、修改或者删除
在这里插入图片描述打开这个方法,看一下具体是怎么用的
在这里插入图片描述差不多理解这个方法是怎么用的了,然后就用Java代码来实现吧
但是在实现之前,我们得创建一个表,一开始我已经把数据库创建好了,但是数据库是空的,现在在数据库中加入第一个表。如下:

首先是创建表,注意几个关键的地方,字符集错了会导致没法把汉字写进去,没有自增的话,回导致eclipse中用Java写插入的sql语句的时候,出现数据没法插入的情况(吃过亏的,都是泪,,,)
在这里插入图片描述然后保存之后就能插入我的第一条数据了,这是我插入的第一条数据,没有报错和乱码的情况,
这里的插入可以用SQL语句插入,也可以直接对表进行操作
在这里插入图片描述

一切准备好了,现在就可以在eclipse中来对这个数据库进行操作了!!!
为了方便使用,我把第二节写的那个类封装在一个package里面了,然后对这个类做了适当的调整。

先看图,封装的
在这里插入图片描述
下面看代码

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbUtil {
	//有点像网址,其实这就是MySQL的数据库地址
		private static String dbUrl="jdbc:mysql://localhost:3306/db_jdbcstudy?useUnicode=true&characterEncoding=utf-8";
		//用户名
		private static String dbUserName="root";
		//密码(我把我的换成X了,密码你用自己的)
		private static String dbUserPassage="XXXXXXXXXXXX";	
		//驱动
		private static String jdbcName="com.mysql.jdbc.Driver";
		
		/**
		 * 获取的数据库的连接
		 * @return
		 * @throws Exception
		 */
		public Connection getCon()throws Exception{
			Class.forName(jdbcName);
			Connection con=null;
			con=DriverManager.getConnection(dbUrl,dbUserName,dbUserPassage);
			return con;
		}
		/**
		 * 关闭数据库连接
		 * @param con
		 * @throws Exception
		 */
		public void close(Connection con) throws Exception{
			if(con!=null){
				con.close();
			}
		}
}

细心的可以发现我把获得con连接和关闭con换成了两个函数 但是,有个地方,就是上面的获取数据库地址那里,遭罪过!!!
在这里插入图片描述这句话的作用是把Java上写的数据,插入到数据库的时候,以UTF-8的格式进行插入,因为我们的eclipse的格式可以改变的,我自己不知道啥时候改成GBK的格式了,所以出现了很严重的问题。

看一下出现的问题
在这里插入图片描述问号是我第一次执行的时候出现的效果,这时候是没有那句话的,所以出现了乱码,下面的是我加上了之后执行的效果,很完美的插进去了。
具体的代码在这里

package chap3_sec02;

import java.sql.Connection;
import java.sql.Statement;

import util.DbUtil;

public class Demo1 {
	public static void main(String[] args) throws Exception {
		DbUtil dbUtil=new DbUtil();
		//数据库的插入语句
		String sql="insert into t_book values(null,'疯狂JAVA讲义',100,'李四',2)";
		Connection con=dbUtil.getCon();//获取数据库连接
		Statement stmt=con.createStatement();//获取Statement
		//返回值是影响的数据库中的数据的条数
		int result=stmt.executeUpdate(sql);
		System.out.println("通过上面的插入语句,影响的数据的个数为:"+result);
		stmt.close();//关闭Statement
		con.close();//关闭连接
		/*
		 * 注意:上面关的也是有顺序的
		 * 比如:我回家里的卧室
		 * 先打开的是房子的门,再打开寝室的门
		 * 所以出来的时候,应该先关寝室的门,再关房子的门
		 * 上面的con就像房子,stmt就是卧室
		 */
	}
	
}

这个代码就是用到了上面一开始讲的,在jdk文档中看到的函数的方法。
最后打印的效果是这样的
在这里插入图片描述

要改默认语言格式的,自己去这里改。。。不过不管怎么样,一定要加上那句话,不然,做出来的东西就是死死的,不一定每台机器上都用UTF-8的格式

在这里插入图片描述

上面的插入数据,每次数据的插入都是一样的,也就是说这里的数据是死的,现在将这个插入语句封装成一个函数。

 package chap3_sec02;

import java.sql.Connection;
import java.sql.Statement;

import util.DbUtil;

public class Demo2 {
	private static DbUtil dbUtil=new DbUtil();
	private static int addBook(String bookName,float price,String author,int booTypeId)
			throws Exception{
		Connection con=null;
		con=dbUtil.getCon();//获取连接
		String sql="insert into t_book values(null,'"+bookName+"',"+price+",'"+author+"',"+booTypeId+")";
		Statement stmt=con.createStatement();//创建statement
		int result = stmt.executeUpdate(sql);
		//把打开的两个都关掉,把这个关闭操作封装在一起
		dbUtil.close(stmt, con);//关闭statement和连接
		return result;
	}
	public static void main(String[] args) throws Exception {
		int result=addBook("javaWeb编程基础", 45, "王五", 4);
		if(result==1){
			System.out.println("本次的测试是成功的,添加了"+result+"本书的信息信息");
		}else{
			System.out.println("添加失败!");
		}
	}
}

这里的关闭数据库稍微做了下调整,把原本的关闭的函数改一下就行了,稍微提一下,单价是float类型的,我把表里面的int改成float了

/**
		 * 关闭数据库连接
		 * @param con
		 * @throws Exception
		 */
		public void close(Statement stmt,Connection con) throws Exception{
			if(stmt!=null){
				stmt.close();
				if(con!=null){
				con.close();
			}
		}

现在用面向对象的方法实现,新建一个Book实体,将t_book表中的属性都放在这个实体中

package model;

/**
 * 图书的实体,有图书的所有的属性
 * @author Administrator
 *
 */
public class Book {
	private int id;
	private String bookName;
	private float price;
	private String author;
	private int booTypeId;
	
	//构造方法(快捷键写的)
	public Book(String bookName, float price, String author, int booTypeId) {
		super();
		this.bookName = bookName;
		this.price = price;
		this.author = author;
		this.booTypeId = booTypeId;
	}
	//下面的所有的代码都是通过快捷键实现的
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getBooTypeId() {
		return booTypeId;
	}
	public void setBooTypeId(int booTypeId) {
		this.booTypeId = booTypeId;
	}
	
}

现在我们这样写,最终也是可以实现的,对比看一下改变在哪里

package chap3_sec02;

import java.sql.Connection;
import java.sql.Statement;

import model.Book;
import util.DbUtil;

public class Demo2 {
	private static DbUtil dbUtil=new DbUtil();
	private static int addBook(String bookName,float price,String author,int booTypeId)
			throws Exception{
		Connection con=null;
		con=dbUtil.getCon();//获取连接
		String sql="insert into t_book values(null,'"+bookName+"',"+price+",'"+author+"',"+booTypeId+")";
		Statement stmt=con.createStatement();//创建statement
		int result = stmt.executeUpdate(sql);
		//把打开的两个都关掉,把这个关闭操作封装在一起
		dbUtil.close(stmt, con);//关闭statement和连接
		return result;
	}
	
	/**
	 * 这个是上面的addBook的改良
	 * @param book
	 * @return
	 * @throws Exception
	 */
	private static int addBook2(Book book)throws Exception{
		Connection con=null;
		con=dbUtil.getCon();//获取连接
		String sql="insert into t_book values(null,'"+book.getBookName()+"',"+book.getPrice()+",'"+book.getAuthor()+"',"+book.getBooTypeId()+")";
		Statement stmt=con.createStatement();//创建statement
		int result = stmt.executeUpdate(sql);
		//把打开的两个都关掉,把这个关闭操作封装在一起
		dbUtil.close(stmt, con);//关闭statement和连接
		return result;
	}
	
	public static void main(String[] args) throws Exception {
		int result=addBook("javaWeb编程基础", 45, "王五", 4);
		if(result==1){
			System.out.println("本次的测试是成功的,添加了"+result+"本书的信息信息");
		}else{
			System.out.println("添加失败!");
		}
		
		//下面是用面向对象的思维
		Book book=new Book("javaWeb编程基础2", 45, "王五", 4);
		int result2= addBook2(book);
		if(result2==1){
			System.out.println("图书添加成功!");
		}else{
			System.out.println("图书添加失败!");
		}
		
	}
}

区别在于面向对象的额思维,我们把要传的参数,封装成一个实体了,然后用上了构造方法的思维,最后要使用这个对象的属性的时候,直接传这个对象就行了。

上面写的都是怎么把数据写进数据库(添加),下面写怎么改变数据库中已经有的数据,俗称数据库的更新(修改)操作

===========================================================================================================

package chap3_sec03;

import java.sql.Connection;
import java.sql.Statement;

import model.Book;
import util.DbUtil;

public class Demo1 {
	private static DbUtil dbUtil = new DbUtil();
	private static int updateBook(Book book)throws Exception{
		Connection con=null;
		con=dbUtil.getCon();//获取连接
		String sql = "update t_book set bookName='" + book.getBookName()
		+ "',price=" + book.getPrice() + ",author='" + book.getAuthor()
		+ "',bookTypeId=" + book.getBookTypeId() + " where id="
		+ book.getId();
		Statement stmt=con.createStatement();//创建statement
		int result = stmt.executeUpdate(sql);
		dbUtil.close(stmt, con);//关闭statement和连接
		return result;
	}
	
	public static void main(String[] args) throws Exception {
		Book book=new Book(2, "鸟哥的linux", 72, "鸟哥", 4);
		int result=updateBook(book);
		if(result==1){
			System.out.println("数据更新成功!");
		}else{
			System.out.println("更新失败!");
		}
		
	}
}

简单的说一下变动吧

  1. sql语句发生了改变,把插入语句换成了修改语句(写了几次,总有点毛病,sql语句那里容易马虎写错)
  2. 重载Book类中的构造方法,将以前的4个参数的构造方法保留,再重载一个5个参数的构造方法,多出来的这个是id,id是这个表的主键,主键是唯一的,所以我们修改数据的时候就是通过这个唯一性来修改一条数据!!!
    在这里插入图片描述

上面的更新写完了,下面是删除的学习

===========================================================================================================

删除和插入是我记的最牢的,当然这两个也是最简单的。。。

下面看删除部分的代码

package chap3_sec04;

import java.sql.Connection;
import java.sql.Statement;

import model.Book;
import util.DbUtil;

public class Demo1 {
	private static DbUtil dbUtil = new DbUtil();
	private static int deleteBook(int id)throws Exception{
		Connection con=null;
		con=dbUtil.getCon();//获取连接
		String sql = "delete from t_book where id="+id;
		Statement stmt=con.createStatement();//创建statement
		int result = stmt.executeUpdate(sql);
		dbUtil.close(stmt, con);//关闭statement和连接
		return result;
	}
	
	public static void main(String[] args) throws Exception {
		int result=deleteBook(6);
		if(result==1){
			System.out.println("删除成功!");
		}else{
			System.out.println("删除失败!");
		}
		
	}
}

效果就不截图了,就是控制台输出删除成功,然后到数据库中去刷新一下表,你会发现原本的id=6的这条数据不见了。。。

区别:

  1. 没有创建book对象,因为我们直接传id就行了,根本不需要这个对象的其他属性,并且sql语句中,也只用了这个实体的id.
  2. sql语句不一样
  3. 我们用的是id的传输,用id的理由是因为id是唯一的,我们在修改和删除的时候都需要id,添加不需要id是因为我在创建这个表的时候选择的是自增,也就是我们的id是不会重复的,直接传一个null的id就可以了。

需要学习的时候用到的数据库和所有的源代码,请去百度网盘提取
链接:https://pan.baidu.com/s/1wDL_aFCPQ9WAZ_vSy6UVdg
提取码:hime

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是四个问题,我会一一回答。 1、安装Mysql、图形化工具SQLYog: 首先,你需要下载安装Mysql数据库和SQLYog图形化工具。可以从Mysql官网下载安装包,也可以使用软件包管理工具进行安装。SQLYog可以从官网下载安装包,也可以使用其他类似的工具,比如Navicat等。 2、实现第一个JDBC程序: JDBCJava数据库连接的标准接口,可以用于连接各种关系型数据库。下面是一个简单的JDBC程序示例,可以连接到本地的Mysql数据库: ``` import java.sql.*; public class JdbcDemo { public static void main(String[] args) { try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // 执行SQL查询 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM user"); // 遍历查询结果 while (rs.next()) { System.out.println(rs.getInt("id") + ", " + rs.getString("name") + ", " + rs.getInt("age")); } // 释放资源 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 3、使用JDBC完成数据的查: 下面是一个简单的JDBC程序示例,可以用于执行数据的操作: ``` import java.sql.*; public class JdbcDemo { public static void main(String[] args) { try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // 执行SQL插入操作 String sql = "INSERT INTO user (name, age) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "张三"); pstmt.setInt(2, 20); pstmt.executeUpdate(); // 执行SQL更新操作 sql = "UPDATE user SET age = ? WHERE name = ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 25); pstmt.setString(2, "张三"); pstmt.executeUpdate(); // 执行SQL删除操作 sql = "DELETE FROM user WHERE age < ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 18); pstmt.executeUpdate(); // 执行SQL查询操作 sql = "SELECT * FROM user"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 遍历查询结果 while (rs.next()) { System.out.println(rs.getInt("id") + ", " + rs.getString("name") + ", " + rs.getInt("age")); } // 释放资源 rs.close(); stmt.close(); pstmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 4、使用JDBC实现用户的登录功能: 用户登录功能通常需要与数据库中的用户表进行交互。下面是一个简单的JDBC程序示例,可以用于实现用户登录功能: ``` import java.sql.*; public class JdbcDemo { public static void main(String[] args) { try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // 执行SQL查询操作 String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "admin"); pstmt.setString(2, "123456"); ResultSet rs = pstmt.executeQuery(); // 判断查询结果是否为空 if (rs.next()) { System.out.println("登录成功"); } else { System.out.println("登录失败"); } // 释放资源 rs.close(); pstmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上就是我对你的四个问题的回答,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值