1 . 连接数据库。
要对数据表中的数据进行操作,首先应该建立与数据库的连接。通过JDBC API中提供的各种类,可对数据表中的数据进行查找、添加、修改、删除等操作。
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Conn {
/*
在项目中创建类Conn,并创建getConnection()方法,获取与Mysql数据库的连接,在主方法中调用该方法。
*/
// 1 . 声明Connection对象。
Connection con;
// 2 . 建立返回值为Connection的方法。
public Connection getConnection(){
// 3 . 加载数据库驱动类。
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("数据库驱动加载成功。");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
// 4 . 通过访问数据库的URL,获取数据库连接对象。
try{
System.out.println("开始运作。");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root");
System.out.println("数据库连接成功。");
}catch (SQLException e){
e.printStackTrace();
}
// 5 . 按要求返回一个Connection对象。
return con;
}
public static void main(String[] args) {
// 6 . 创建本类对象。
Conn c = new Conn();
// 7 . 调用连接数据库的方法。
c.getConnection();
}
}
以下是代码块1:
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("数据库驱动加载成功。");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
通过java.lang包静态方法forName()来加载JDBC驱动程序,如果加载失败会抛出ClassNotFoundException异常。应该确定数据库驱动类是否成功加载到程序中。
以下是代码块2:
try{
System.out.println("开始运作。");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root");
System.out.println("数据库连接成功。");
}catch (SQLException e){
e.printStackTrace();
}
通过java.sql包中DriverManager类的静态方法getConnection(String url,String user,String password)建立数据库连接。该方法的三个参数一次指定预连接数据库的路径、用户名和密码。返回Connection对象,如果连接失败,抛出SQLException异常。
PS:本实例中将连接数据库作为单独的一个方法,并以Connection对象作为返回值。这样写的好处是在遇到对数据库执行操作的程序时可直接调用Conn类的getConnection()方法获取连接,增加了代码的重用性。
2 . 数据库顺序查询。
ResultSet类的next()方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false。下面的实例就算将数据表student中的全部信息显示在控制台上。
import java.sql.*;
import java.util.Stack;
public class Gradation {
/*
本实例在getConnection()方法中获取与数据库的连接,在主方法中将数据表tb_stu中的数据检索出来,
保存在遍历查询结果集ResultSet中,并遍历该结果集。
*/
// 1 . 声明Connection对象。
static Connection con;
// 2 . 声明Statement对象。
static Statement sql;
// 3 . 声明ResultSet对象。
static ResultSet res;
// 4 . 连接数据库方法。
public Connection getConnection(){
// 5 . 加载数据库驱动类。
try{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("数据库驱动加载成功。");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
// 6 . 通过访问数据库的URL,获取数据库连接对象。
try{
System.out.println("开始运作。");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
System.out.println("数据库连接成功。");
}catch (SQLException e){
e.printStackTrace();
}
// 7 . 按要求返回一个Connection对象。
return con;
}
public static void main(String[] args) {
// 8 . 创建本类对象。
Gradation c = new Gradation();
// 9 . 与数据库建立连接。
con = c.getConnection();
try{
// 10 . 实例化Statement对象。
sql = con.createStatement();
// 11 . 执行sql语句,返回结果集。
res = sql.executeQuery("select * from student");
// 12 . 如果当前不是最后一条,则进入循环。
while (res.next()){
// 13 . 获取列名是id的字段值。
String id = res.getString("id");
// 14 . 获取列名是name的字段值。
String name = res.getString("name");
// 15 . 获取列名是sex的字段值。
String sex = res.getString("sex");
// 16 . 获取列名是birthday的字段值。
String age = res.getString("age");
// 17 . 将列值输出。
System.out.println("编号: " + id);
System.out.println("姓名: " + name);
System.out.println("性别: " + sex);
System.out.println("年龄: " + age);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
若表单出现不存在等问题,可采纳下方链接的意见。
求解决:java.sql.SQLSyntaxErrorException: Unknown database 'wuzhiqing'-编程语言-优快云问答
可以通过列的序号来获取结果集中指定的列值。例如,获取结果集中id列的列值,可以写成getString("id")。由于id列是数据表中的第一列,所以也可以写成getString(1)来获取。结果集res的结构如下图所示:
用命令符进入mysql,若出现1046(3D000)nodatebase selected错误问题,可采纳下方链接意见。
MySql ERROR 1046(3D000): No Database Selected 怎么解决? - MySQL数据库 - 亿速云
3 . 数据库模糊查询 。
SQL语句中提供了LIKE操作符用于模糊查询,可使用“%”来代替0个或多个字符,使用下划线"_" 来代替一个字符。例如,在查询姓张的同学的信息时,可使用以下SQL语句:
select * from student where name like '张%'
import java.sql.*;
public class Train {
/*
本实例在getConnection()方法中获取与数据库的链接,在主方法中将数据表student中姓张的同学的信息检索出来,
保存在ResultSet结果集中,并遍历该集合。
*/
// 1 . 声明Connection对象。
static Connection con;
// 2 . 声明Statement对象。
static Statement sql;
// 3 . 声明ResultSet对象。
static ResultSet res;
// 4 . 连接数据库方法。
public Connection getConnection(){
// 5 . 加载数据库驱动类。
try{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("数据库驱动加载成功。");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
// 6 . 通过访问数据库的URL,获取数据库连接对象。
try{
System.out.println("开始运作。");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
System.out.println("数据库连接成功。");
}catch (SQLException e){
e.printStackTrace();
}
// 7 . 按要求返回一个Connection对象。
return con;
}
public static void main(String[] args) {
// 8 . 创建本类对象。
Train c = new Train();
// 9 . 获取与数据库的连接。
con = c.getConnection();
// 10 . try-catch语句块捕捉异常。
try{
// 11 . 实例化Statement对象。
sql = con.createStatement();
// 12 . 执行sql语句。
res = sql.executeQuery("select * from student where name like '张%'");
// 13 . 如果当前记录不是记过集中的最后一条,则进入循环体。
while (res.next()){
// 14 . 获取列名是id的字段值。
String id = res.getString("id");
// 15 . 获取列名是name的字段值。
String name = res.getString("name");
// 16 . 获取列名是sex的字段值。
String sex = res.getString("sex");
// 17 . 获取列名是birthday的字段值。
String age = res.getString("age");
// 18 . 将列值输出。
System.out.print("编号: " + id);
System.out.print(" 姓名: " + name);
System.out.print(" 性别: " + sex);
System.out.println(" 年龄: " + age);
}
}catch (Exception e){
// 19 . 输出异常信息。
e.printStackTrace();
}
}
}
4 . 预处理语句。
对于JDBC,可以通过Connection对象的preparedStatement(String sql)方法对SQL与教育进行预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement对象中。通过调用该对象的相应方法,可执行底层数据库命令。应用程序能针对链接的数据库,将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令。这样可以减轻数据库负担,提高访问数据库的速度。
对SQL进行预处理时可以使用通配符"?"来代替任何字段值,例如:
sql = con.prepareStatement("select * from student where id = ?");
在执行预处理语句前,必须用相应方法来设置通配符所表示的值。例如:
sql.setInt(1,2);
上述语句中的1表示从左向右的第1个通配符,2表示设置的通配符的值。将通配符的值设置为2后,功能等同于:
sql = con.prepareStatement("select * from student where id = 2");
书写两条语句看似麻烦了一些,但使用预处理语句可使应用程序动态地改变SQL语句中关于字段值条件的设定。
PS:通过setXXX()方法为SQL语句中的参数赋值时,建议使用与参数匹配的方法,也可以使用setObject()方法为各种类型的参数赋值,例如:
sql.setObject(2,'李莉');
import java.sql.*;
public class Prep {
/*
本实例预处理语句可动态地获取指定编号的同学信息。在此以查询编号为2019117004的同学信息为例子,介绍预处理语句的用法。
*/
// 1 . 声明Connection对象。
static Connection con;
// 2 . 声明预处理对象。
static PreparedStatement sql;
// 3 . 声明结果集对象。
static ResultSet res;
// 4 . 与数据库连接方法。
public Connection getConnection(){
// 5 . 加载数据库驱动类。
try{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("数据库驱动加载成功。");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
// 6 . 通过访问数据库的URL,获取数据库连接对象。
try{
System.out.println("开始运作。");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
System.out.println("数据库连接成功。");
}catch (SQLException e){
e.printStackTrace();
}
// 7 . 按要求返回一个Connection对象。
return con;
}
public static void main(String[] args) {
// 8 . 创建本类对象。
Prep c = new Prep();
// 9 . 获取与数据库的连接。
con = c.getConnection();
try{
// 10 . 实例化预处理对象。
sql = con.prepareStatement("select * from student where id = ?");
// 11 . 设置参数。
sql.setInt(1,2019117004);
// 12 . 执行预处理语句。
res = sql.executeQuery();
// 13 . 如果当前记录不是结果集中的最后一行,则进入循环体。
while (res.next()){
// 14 . 获取列名是id的字段值。
String id = res.getString("id");
// 15 . 获取列名是name的字段值。
String name = res.getString("name");
// 16 . 获取列名是sex的字段值。
String sex = res.getString("sex");
// 17 . 获取列名是birthday的字段值。
String age = res.getString("age");
// 18 . 将列值输出。
System.out.print("编号: " + id);
System.out.print(" 姓名: " + name);
System.out.print(" 性别: " + sex);
System.out.println(" 年龄: " + age);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
5 . 添加、修改、删除记录。
通过SQL语句可以对数据执行添加、修改和删除操作。可通过PreparedStatement类的指定参数,动态地对数据表中原有数据进行修改操作,并通过executeUpdate()方法执行更新语句操作。
import java.sql.*;
public class Renewal {
/*
本实例通过预处理语句动态地对数据表student中的数据执行添加、修改、删除操作,
并遍历数据操作之前与数据操作之后student表中的数据。
*/
// 1 . 声明Connection对象。
static Connection con;
// 2 . 声明PreparedStatement对象。
static PreparedStatement sql;
// 3 . 声明ResultSte对象。
static ResultSet res;
// 4 . 与数据库进行连接。
public Connection getConnection(){
// 5 . 加载数据库驱动类。
try{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("数据库驱动加载成功。");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
// 6 . 通过访问数据库的URL,获取数据库连接对象。
try{
System.out.println("开始运作。");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","root");
System.out.println("数据库连接成功。");
}catch (SQLException e){
e.printStackTrace();
}
// 7 . 按要求返回一个Connection对象。
return con;
}
public static void main(String[] args) {
// 8 . 创建本类对象。
Renewal c = new Renewal();
// 9 . 调用连接数据库的方法。
con = c.getConnection();
try {
// 10 . 查询数据库。
sql = con.prepareStatement("select * from student");
// 11 . 执行sql语句。
res = sql.executeQuery();
System.out.println("增删改查之前的数据信息:");
while (res.next()) {
// 12 . 遍历查询结果集。
String id = res.getString("id");
// 15 . 获取列名是name的字段值。
String name = res.getString("name");
// 16 . 获取列名是sex的字段值。
String sex = res.getString("sex");
// 17 . 获取列名是birthday的字段值。
String age = res.getString("age");
// 18 . 将列值输出。
System.out.print("编号: " + id);
System.out.print(" 姓名: " + name);
System.out.print(" 性别: " + sex);
System.out.println(" 年龄: " + age);
}
// 19 . 预处理添加数据。
sql = con.prepareStatement("insert into student" + " values (?,?,?,?)");
sql.setInt(1, 2019117007);
sql.setString(2, "文鸯");
sql.setString(3, "男");
sql.setInt(4, 21);
sql.executeUpdate();
// 20 . 更新数据。
sql = con.prepareStatement("update student set age " + "= ? WHERE id = (select MIN(id) from (SELECT id FROM student) a)");
sql.setInt(1, 23);
sql.executeUpdate();
/*// 21 . 删除数据。
System.out.println("开始删除。");
sql.executeUpdate("delete from student WHERE id = ?" + "(select MIN(id) from student)");
sql.setInt(1, 1);
sql.executeUpdate();
System.out.println("删除结束。");*/
// 22. 查询修改数据后student表中的数据。
sql = con.prepareStatement("select * from student");
// 23 . 执行SQL语句。
res = sql.executeQuery();
System.out.println("增删改查之后的数据信息:");
// 24. 遍历结果集。
while (res.next()) {
// 12 . 遍历查询结果集。
String id = res.getString("id");
// 15 . 获取列名是name的字段值。
String name = res.getString("name");
// 16 . 获取列名是sex的字段值。
String sex = res.getString("sex");
// 17 . 获取列名是birthday的字段值。
String age = res.getString("age");
// 18 . 将列值输出。
System.out.print("编号: " + id);
System.out.print(" 姓名: " + name);
System.out.print(" 性别: " + sex);
System.out.println(" 年龄: " + age);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
目前删除数据出现的报错暂时无法解决,所以暂时先注释掉了,能解决掉的大佬欢迎指正。