这篇文章主要记录利用MySQL在本地数据库建立如下表之后,在JAVA程序中进行数据库链接、数据库查找、数据插入等相关基本操作
表中存储的基本信息为假定为“学生信息”,包括学号(ID)、姓名(NAME)、性别(SEX)、年龄(AGE)等信息。
- 在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);
}
}
- 链接数据库的类我们一般命名为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
包内
- 写构造方法
在构造方法内实现对数据库的驱动加载和链接
代码如下:
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();
}
}
控制台运行结果如图
- 修改表
和【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;
}
查看数据表,可以看到已成功修改
- 主函数内容和完整代码
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();
}
}
- 代码改进
在上述代码中,我将数据库命令语句放置在了方法内部,导致代码重用性降低,故在此为代码进行如下修改:
Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。
PreparedStatement是java.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);
}
}