欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java语言mysql数据库的访问步骤,一个简单的实例——使用DAO(数据库操作类 Data Access Object ) 实现对mysql数据库的增删改查

程序员文章站 2022-05-03 13:16:52
...

Java mysql数据库基本步骤&一个简单实例

基本步骤

  1. 准备工作 下载安装数据库、下载jdbc包、创建java project

    推荐去mysql官网下载社区版(community)
    附链接:mysql社区版下载
    jar包链接
    对于初学者推荐使用可视化的数据库管理工具如:Navicat 如何使用会在后面的文章介绍,这里不再赘述。
    下载完成后在IDE中创建project,至此准备工作完成。后续以Eclipse为例介绍整个流程。

  2. 导入jar包

    对于mysql的相关操作需要导入额外的jar包,在第一条中已经给出了jar包的下载。
    在Eclipse中选中你新建的工程 右键——properties(在最下方)——Java Build Path——Libraries——Add External JARs——找到你下载的jar包然后应用关闭即可。
    这里注意选择名字为*-bin.jar的jar包
    Java语言mysql数据库的访问步骤,一个简单的实例——使用DAO(数据库操作类 Data Access Object ) 实现对mysql数据库的增删改查

  3. 创建Student类、创建StudentDAO类、mysql创建Student表

这里以存入一个学生的信息为例介绍整个过程,假如他有学号,名字,成绩,年龄四个属性。

public class Student {
	public int id;
	public String name;
	public float grade;
	public int age;
	// get set方法
	}

随后我们创建一个StudentDAO类,在这个类中完成对数据库的增删改查。
给出导入的包:

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

import bean.Student;

我们需要在构造函数中加载我们导入的jar包。

	public StudentDAO() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

在对数据库进行相关操作之前我们需要在mysql数据库中创建一个Student表,来存储我们的信息。你可以在Navicat的可视化界面中创建表,也可以执行sql语句。

DROP TABLE IF EXISTS `student`;
 
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `grade` float DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. 生成connection对象

    Connection用于与mysql数据库建立连接,建立连接后才能执行后续的操作。

Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testjava?characterEncoding=UTF-8", "root", "lxz74123");

这里解释一下getConnection的参数
第一个参数:
127.0.0.1:3306 代表本机ip和端口号,如果你的数据库在服务器那么就是服务器的ip地址和端口号。
testjava是数据库的名字,mysql下面可以有很多数据库。这个数据库需要你自己在可视化界面中建立。
characterEncoding=UTF-8"是编码方式。
第二个参数:用户的名字
第三个参数:数据库的密码

  1. 生成Statement对象或Preparedstatement对象

    Statement对象用于准备和执行sql语句,他的实例化需要借助Connection对象。

Statement s = c.createStatement();

Statement 和 Preparedstatement对象的区别在于Preparestatement可以在sql语句中留空,使用?代替,在执行sql时可以用具体的数据填充?。一般在更新操作中会用到,后面再实例中可以进一步感受,这里不再赘述。

  1. 准备sql语句

    准备后面需要执行的sql语句,一般存储在一个字符串中。

String sql = "delete from student where id = " + id;

这个语句是查找表中id为“id”的数据

  1. 执行sql语句返回结果

    准备好sql语句后,需要使用Statement对象来执行sql语句,然后返回结果。

ResultSet rs = s.executeQuery(sql);

这里解释一下 ResultSet,用来接收结果,此对象中有多项,使用next()函数可以访问多项内容,每一项内容中都有很多列,例如这里的话有id,name,grade,age四列。

  1. 处理结果

    返回结果后,对ResultSet对象进行处理,得到自己想要的结果。
    这里实例化一个Student来接受对象。

if (rs.next()) {
	student = new Student();
	student.name = rs.getString(2);
	student.grade = rs.getFloat("grade");
	student.age = rs.getInt(4);
	student.id = id;
}

这里解释一下ResultSet对象的get函数,参数为数字时,数字代表列号,字符串时代表数据库中的字段名。也就是说这两种方式都可以从结果中获取自己的想要的数据。这里要特别注意数据类型。
如果结果集中有多条对象,将if修改为while即可。

简单实例


这里以一个学生表的增删改查为例,给出完整程序代码。

Student类:

package bean;

public class Student {
	public int id;
	public String name;
	public float grade;
	public int age;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getGrade() {
		return grade;
	}
	public void setGrade(float grade) {
		this.grade = grade;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	// 重载toString方法
	public String toString() {
	// TODO Auto-generated method stub
	String str = "学号:" + id + " 姓名:" + name + " 成绩:" + grade + " 年龄:" + age;
	return str;
	}

}

StudentDAO类:

package dao;

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

import bean.Student;

public class StudentDAO {
	// 构造函数,在实例化对象时载入jar包
	public StudentDAO() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public Connection getConnection() throws SQLException {
		return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testjava?characterEncoding=UTF-8", "root", "lxz74123");
		
	}
	
	// 获取学生总数
	public int getTotal() {
		int total = 0;
		// try-with-resource的方式,不需要再手动调用close()
		try (Connection c = getConnection(); Statement s = c.createStatement();) {
			String sql = "select count(*) from student";
			// 执行sql语句
			ResultSet rs = s.executeQuery(sql);
			while(rs.next()) {
				total = rs.getInt(1);
			}
			System.out.println("total:" + total);
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return total;
	}
	
	// 添加学生
	public void add(Student student) {
		String sql = "insert into student values(null, ?, ?, ?)";
		// 因为这里要获取自增主键,所以prepareStatement有第二个参数
		// Statement.RETURN_GENERATED_KEYS 告诉sql去要返回自增id
		try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);) {
		// 填充字符串中的?,构造完整的sql语句。
			ps.setString(1, student.name);
			ps.setFloat(2, student.grage);
			ps.setInt(3, student.age);
			ps.execute();
			// 获取生成的id号
			ResultSet rs = ps.getGeneratedKeys();
			if (rs.next()) {
				int id = rs.getInt(1);
				student.id = id;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void update(Student student) {
		String sql = "update student set name= ?, grade = ?, age = ? where id = ?";
		try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
			ps.setString(1, student.name);
			ps.setFloat(2, student.grade);
			ps.setInt(3, student.age);
			ps.setInt(4, student.id);
			
			ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	// 根据id 删除学生
	public void delete(int id) {
		try (Connection c = getConnection(); Statement s = c.createStatement();) {
			String sql = "delete from student where id = " + id;
			s.execute(sql);
			
		} catch (SQLException e) {
			e.printStackTrace();
			// TODO: handle exception
		}
	}
	
	public Student get(int id) {
		Student student = null;
		try (Connection c = getConnection(); Statement s = c.createStatement();) {
			String sql = "select * from student where id = " + id;
			ResultSet rs = s.executeQuery(sql);
			if (rs.next()) {
				student = new Student();
				student.name = rs.getString(2);
				student.grade = rs.getFloat("grade");
				student.age = rs.getInt(4);
				student.id = id;
			}
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return student;
	}
	
	public List<Student> list() {
	// 第一个参数是开始的位置,第二个参数是获取的学生的数目。
		return list(0, Short.MAX_VALUE);
	}
	
	public List<Student> list(int start, int count) {
		
		List<Student> students = new ArrayList<Student>();
		// 以id降序排列,limit限定查询范围
		String sql = "select * from student order by id desc limit ?,?";
		
		try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
			ps.setInt(1, start);
			ps.setInt(2, count);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				Student student = new Student();
				student.id = rs.getInt(1);
				student.name = rs.getString(2);
				student.grade = rs.getFloat("grade");
				student.damage = rs.getInt(4);
				// 将学生加入列表中
				students.add(student);
				
			}
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		return students;
	}
}

主函数:

package dao;
import java.util.List;
import bean.Student;
import dao.StudentDAO;
public class doStudentDAO {
	public static void main(String[] args) {
		// list方法
		List<Student> students = new StudentDAO().list();
		// 在控制台打印数据
		for (Student student : students) {
			System.out.println(student);
		}
		// 其他方法依次类推
	}
}