JAVA程序与MySQL数据库链接的基本操作详细演示与说明

这篇文章主要记录利用MySQL在本地数据库建立如下表之后,在JAVA程序中进行数据库链接数据库查找数据插入等相关基本操作
示例表
表中存储的基本信息为假定为“学生信息”,包括学号(ID)、姓名(NAME)、性别(SEX)、年龄(AGE)等信息。

  1. 在JAVA工程中首先建立名为Student的类
    代码如下:
//Student.java
public class Student {
	private int id;
	private String name;
	private String sex;
	private int age;
	
	public Student(){
		this.id=0;
		this.name=null;
		this.sex=null;
		this.age=0;
		
	}
	public void setId(int id) {
		this.id=id;
	}
	public int getId() {
		return(id);
	}
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return(name);
	}
	public void setSex(String sex) {
		this.sex=sex;
	}
	public String getSex() {
		return(sex);
	}
	public void setAge(int age) {
		this.age=age;
	}
	public int getAge() {
		return(age);
	}
}

  1. 链接数据库的类我们一般命名为DBManager
    首先我们在DBManager类中定义四个数据库链接关键变量
//加载驱动器
private String driver = "java.sql.Driver";
private String url = "jdbc:mysql://localhost:3306/zijeak";
//数据库链接方式:jtbc方式,3306为端口号,最后一项为数据库名称
private String uname = "root";
private String password = "root";

这里需要注意,在加载驱动器之前,需要将驱动器Jar包复制到工程目录内,并通过“右键-BuildPath-Add to BuildPath”来进行导入

然后在添加其他数据域

private Connection con = null;//数据库链接对象
private Statement sta = null;//数据库命令语句对象

private ResultSet rs = null;//数据库返回的结果集对象

以上3个对象分别在
java.sql.Connection
java.sql.Statement
java.sql.ResultSet

包内

  1. 写构造方法
    在构造方法内实现对数据库的驱动加载和链接
    代码如下:
public DBManager(){
		try {
			Class.forName(driver);//驱动器加载语句
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("驱动加载异常");
		}
		try{
			con = DriverManager.getConnection(url, uname, password);
			System.out.println("数据库链接成功");
		}catch(SQLException e){
			e.printStackTrace();
			System.out.println("数据库链接异常");
		}
	}

该段代码将会在控制台显示数据库链接情况,若链接成功,打印“数据库连接成功”

  1. 查看数据库表
public void selectTable() {
	    String sql = "select * from table01";
		try {
			sta = con.createStatement();//利用连接器创建语句
			rs = sta.executeQuery(sql);
			//将语句发送到数据库,返回数据,rs相当于游标指针,可用next()方法访问下一条数据,若有数据返回ture,若无数据返回false
			while(rs.next()) {
				Student stu = new Student();
				int id = rs.getInt("ID");
				String name = rs.getString("NAME");
				String sex = rs.getString("SEX");
				int age = rs.getInt("AGE");
				
				//存储到对象
				stu.setId(id);
				stu.setName(name);
				stu.setSex(sex);
				stu.setAge(age);
				
				System.out.println("学号:"+id+"  姓名:"+name+"  性别:"+sex+"  年龄:"+age);
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

控制台运行结果如图
运行结果

  1. 修改表
    和【4.查看数据表】类似,在方法内写好一个命令语句,并传递给数据库。
    此种方法不可重用,仅做以演示,在本文后半部分将对此方法进行修改。
    以将ID=20的记录的NAME改为“张有忌”为例,代码如下:
public boolean updateTable() {
		String sql = "update table01 set NAME='张有忌' where ID=20";
		boolean boo = false;
		try {
			sta = con.createStatement();
			sta.executeUpdate(sql);//将语句发送到数据库,返回数据集
			boo = true;
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if(boo) {
			System.out.println("操作成功");
		}
		return boo;
	}

查看数据表,可以看到已成功修改
修改成功

  1. 主函数内容和完整代码
public static void main(String[] args) {
		DBManager db = new DBManager();
		db.updateTable();//(sqlu,vctu);
		db.selectTable();
	}

完整代码如下

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

public class DBManager {
	//四个关键参数
	private String driver = "java.sql.Driver";
	private String url = "jdbc:mysql://localhost:3306/zijeak";//数据库链接方式:jtbc方式,3306为端口号,最后一项为数据库名称
	private String uname = "root";
	private String password = "root";
    private Connection con = null;//数据库链接对象
    private Statement sta = null;
    private ResultSet rs = null;
	
	//构造方法:打通数据库与程序之间的通道
	public DBManager(){
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("驱动加载异常");
		}
		try{
			con = DriverManager.getConnection(url, uname, password);
			System.out.println("数据库链接成功");
		}catch(SQLException e){
			e.printStackTrace();
			System.out.println("数据库链接异常");
		}
	}
	
	public void selectTable() {
	    String sql = "select * from table01";
		try {
			sta = con.createStatement();
			rs = sta.executeQuery(sql);
			//将语句发送到数据库,返回数据,rs相当于游标指针,可用next()方法访问下一条数据,若有数据返回ture,若无数据返回false
			while(rs.next()) {
				Student stu = new Student();
				int id = rs.getInt("ID");
				String name = rs.getString("NAME");
				String sex = rs.getString("SEX");
				int age = rs.getInt("AGE");
				
				stu.setId(id);
				stu.setName(name);
				stu.setSex(sex);
				stu.setAge(age);
				
				System.out.println("学号:"+id+"  姓名:"+name+"  性别:"+sex+"  年龄:"+age);
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public boolean updateTable() {{
		String sql = "update table01 set NAME='张有忌' where ID=20";
		boolean boo = false;
		try {
			sta = con.createStatement();
			cos = sta.executeUpdate(sql);
			boo = true;
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if(boo) {
			System.out.println("操作成功");
		}
		return boo;
	}
	public static void main(String[] args) {
		DBManager db = new DBManager();
		db.updateTable();
		db.selectTable();
	}
}

  1. 代码改进
    在上述代码中,我将数据库命令语句放置在了方法内部,导致代码重用性降低,故在此为代码进行如下修改:
    Java提供了 StatementPreparedStatementCallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。
    PreparedStatementjava.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快
    故此,我们使用PreparedStatement来替换Statement

首先需要导入***java.sql.PreparedStatement***包
在数据域添加如下参数

先修改***更新函数(updateTable)***

private PreparedStatement psta = null;

由于需要参数化查询,故需要main方法里添加如下代码

String sqlu = "update table01 set name=? where id= ?";//半成品语句
Vector<Object> vctu = new Vector<Object>();
vctu.add("张来娣");
vctu.add(12);
db.updateTable(sqlu,vctu);//函数有两个参数

修改方法代码如下:

public boolean updateTable(String sqlu,Vector<Object> vctu) {
		boolean boo = false;
		int cos = -1;
		try {
			psta = con.prepareStatement(sqlu);
			if(vctu!=null) {
			    //补全语句
				for(int i=0;i<vctu.size();i++) {
					psta.setObject(i+1,vctu.get(i));
				}
			}
			cos = psta.executeUpdate();//注意此句括号内不要加入sqlu
			boo = true;
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if(cos>0) {
			System.out.println("操作成功");
		}
		return boo;
	}

运行结果如图所示:
运行结果

再修改***查看函数(selectTable)***

同上,给主函数中添加代码如下

String sql = "select * from table01 where id=?";//半成品SQL语句
Vector<Object> vct = new Vector<Object>();
vct.add(11);
db.selectTable(sql,vct);

修改函数如下

public void selectTable(String sql,Vector<Object> vct) {
		try {
			psta = con.prepareStatement(sql);
			if(vct!=null) {
				for(int i=0;i<vct.size();i++) {
					psta.setObject(i+1,vct.get(i));
				}
			}
			rs = psta.executeQuery();
			//将语句发送到数据库,返回数据,rs相当于游标指针,可用next()方法访问下一条数据,若有数据返回ture,若无数据返回false
			while(rs.next()) {
				Student stu = new Student();
				int id = rs.getInt("ID");
				String name = rs.getString("NAME");
				String sex = rs.getString("SEX");
				int age = rs.getInt("AGE");
				
				stu.setId(id);
				stu.setName(name);
				stu.setSex(sex);
				stu.setAge(age);
				
				System.out.println("学号:"+id+"  姓名:"+name+"  性别:"+sex+"  年龄:"+age);
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

运行结果如下:
运行结果

另外,为节约资源,给程序加上close方法如下

public void MyClose(){
		try {
			if(con!=null){
				con.close();
			}
			if(psta!=null){
				psta.close();
			}
			if(rs!=null){
				rs.close();
			}
			
		} catch (Exception e) {
		}
	}

下面给出完整代码:

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import java.sql.Connection;

public class DBManager {
	//四个关键参数
	private String driver = "java.sql.Driver";
	private String url = "jdbc:mysql://localhost:3306/zijeak";//数据库链接方式:jtbc方式,3306为端口号,最后一项为数据库名称
	private String uname = "root";
	private String password = "root";
    private Connection con = null;//数据库链接对象
    private Statement sta = null;
    private PreparedStatement psta = null;
    private ResultSet rs = null;
	
	//构造方法:打通数据库与程序之间的通道
	public DBManager(){
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("驱动加载异常");
		}
		try{
			con = DriverManager.getConnection(url, uname, password);
			System.out.println("数据库链接成功");
		}catch(SQLException e){
			e.printStackTrace();
			System.out.println("数据库链接异常");
		}
	}
	public void selectTable(String sql,Vector<Object> vct) {
		try {
			psta = con.prepareStatement(sql);
			if(vct!=null) {
				for(int i=0;i<vct.size();i++) {
					psta.setObject(i+1,vct.get(i));
				}
			}
			rs = psta.executeQuery();
			//将语句发送到数据库,返回数据,rs相当于游标指针,可用next()方法访问下一条数据,若有数据返回ture,若无数据返回false
			while(rs.next()) {
				Student stu = new Student();
				int id = rs.getInt("ID");
				String name = rs.getString("NAME");
				String sex = rs.getString("SEX");
				int age = rs.getInt("AGE");
				
				stu.setId(id);
				stu.setName(name);
				stu.setSex(sex);
				stu.setAge(age);
				
				System.out.println("学号:"+id+"  姓名:"+name+"  性别:"+sex+"  年龄:"+age);
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public boolean updateTable(String sqlu,Vector<Object> vctu) {
		boolean boo = false;
		int cos = -1;
		try {
			psta = con.prepareStatement(sqlu);
			if(vctu!=null) {
			    //补全语句
				for(int i=0;i<vctu.size();i++) {
					psta.setObject(i+1,vctu.get(i));
				}
			}
			cos = psta.executeUpdate();//注意此句括号内不要加入sqlu
			boo = true;
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if(cos>0) {
			System.out.println("操作成功");
		}
		return boo;
	}
	public void MyClose(){
		try {
			if(con!=null){
				con.close();
			}
			if(psta!=null){
				psta.close();
			}
			if(rs!=null){
				rs.close();
			}
			
		} catch (Exception e) {
		}
	}
	public static void main(String[] args) {
		DBManager db = new DBManager();
		String sqlu = "UPDATE table01 SET NAME=? where ID=?";
		Vector<Object> vctu = new Vector<Object>();
		vctu.add("张来娣");
		vctu.add(12);
		db.updateTable(sqlu,vctu);
		String sql = "select * from table01 where id=?";//半成品SQL语句
		Vector<Object> vct = new Vector<Object>();
		vct.add(11);
		db.selectTable(sql,vct);
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值