大家好,我是一个爱举铁的程序员Shr。
本篇文章介绍JDBC,还有用JDBC连接数据库添加数据,查询数据。
源码地址:https://github.com/ShrMus/Dao/tree/master/dao_20180603/src/main/java/com/shrmus/jdbc01
一、什么是JDBC
JDBC的全称是Java DataBase Connectivity,Java数据库连接,它一套用来连接数据库的规范。我个人的理解JDBC是Java程序和数据库之间的桥梁。
二、为什么要使用JDBC
它可以和数据库建立连接,发送操作数据库的SQL语句,接收SQL语句的执行结果。
三、JDBC中的重要元素
3.1 驱动包
项目中导入驱动包才能使用JDBC,连接不同的数据库需要对应的Jar包。
SQL Server导入sqljdbc.jar
MySQL导入mysql-connector-java-5.0.4-bin.jar(5.0.4是版本号)
Oracle导入ojdbc6.jar
3.2 连接地址
连接数据库系统的URL是不一样的。
SQL Server :jdbc:sqlserver://localhost:1433;DatabaseName=数据库名
MySQL :jdbc:mysql://127.0.0.1:3306/数据库名
Oracle :jdbc:oracle:thin:@localhost:1521:orcl(orcl是Oracle数据库实例)
3.3 用户名和密码
登录数据库系统的用户名和密码
3.4 DriverManager类
管理数据库中所有驱动程序。
3.5 Connection接口
与数据库的连接,通过DriverManager类获取。
Connection connection = riverManager.getConnection();
3.6 Statement接口
在建立连接的基础上向数据库发送SQL语句,用于执行静态的SQL语句。通过连接对象获取。
Statement statement = connection .createStatement();
3.7 PreparedStatement接口
该接口继承Statement接口,用于执行动态的SQL语句。通过连接对象获取。
PreparedStatement prepareStatement = connection .prepareStatement(sql);
3.8 ResultSet接口
类似一张数据表,用来暂时存放数据库查询操作所获得的结果集。
ResultSet resultSet = statement.executeQuery(sql);
四、JDBC操作数据
4.1 创建数据库,新建表
创建数据库dao_20180603,新建表jdbc01_student。
CREATE TABLE `jdbc01_student` (
`stu_id` int(11) NOT NULL,
`stu_name` varchar(20) default NULL,
`stu_age` int(11) default NULL,
`stu_gender` int(11) default NULL,
PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.2 连接数据库
public class DBUtil {
/* 数据库驱动,其实就是对应的jar中的驱动类的全路径
MySQL: com.mysql.jdbc.Driver
SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver
Oracle 11g: oracle.jdbc.driver.OracleDriver
*/
private static final String DRIVE_STRING = "com.mysql.jdbc.Driver";
/* 数据库连接URL,数据库名为dao_20180603
MySQL: jdbc:mysql://localhost:3306/dao_20180603
SQL Server: jdbc:sqlserver://localhost:1433;databaseName=dao_20180603
Oracle 11g: jdbc:oracle:thin:@localhost:1521:orcl
*/
private static final String URL_STRING = "jdbc:mysql://localhost:3306/dao_20180603?characterEncoding=utf8";
// 数据库用户名
private static final String USER_STRING = "root";
// 数据库密码
private static final String PASSWORD_STRING = "shrmus";
// 数据库连接对象
public static Connection connection;
// SQL执行对象
public static Statement statement;
// 结果集对象
public static ResultSet resultSet;
// 加载驱动
static {
try {
Class.forName(DRIVE_STRING);
} catch (ClassNotFoundException e) {
System.err.println("加载数据库驱动失败!");
}
}
/**
* 获取数据库连接对象
* @return
*/
public static Connection getConnection() {
try {
connection = DriverManager.getConnection(URL_STRING, USER_STRING, PASSWORD_STRING);
} catch (SQLException e) {
System.err.println("获取数据库连接对象失败!");
}
return connection;
}
/**
* 关闭数据库连接对象
* @param connection
*/
public static void close(Connection connection) {
if(null != connection) {
try {
connection.close();
} catch (SQLException e) {
System.err.println("关闭数据库连接对象失败!");
}
}
}
/**
* 关闭SQL执行对象
* @param statement
*/
public static void close(Statement statement) {
if(null != statement) {
try {
statement.close();
} catch (SQLException e) {
System.err.println("关闭SQL执行对象失败!");
}
}
}
/**
* 关闭结果集对象
* @param resultSet
*/
public static void close(ResultSet resultSet) {
if(null != resultSet) {
try {
resultSet.close();
} catch (SQLException e) {
System.err.println("关闭结果集对象失败!");
}
}
}
/**
* 关闭数据库连接对象,SQL执行对象,结果集对象
* @param resultSet
* @param statement
* @param connection
*/
public static void close(ResultSet resultSet, Statement statement, Connection connection){
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
System.err.println("关闭结果集对象失败!");
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
System.err.println("关闭SQL执行对象失败!");
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
System.err.println("关闭数据库连接对象失败!");
}
}
}
}
4.3 添加一条记录到数据库
4.3.1 新建一个实体类
public class Student {
private int id;
private String name;
private int age;
private int gender;
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
public Student() {
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
4.3.2 新建一个Dao类
public class StudentDao {
/**
* 添加一条记录
* @param student
* @return
*/
public int addStudent(Student student) {
// 受影响的行数
int acceptRow = 0;
// 获取数据库连接对象
Connection connection = DBUtil.getConnection();
Statement statement = null;
ResultSet resultSet = null;
try {
// 获取SQL执行对象
statement = connection.createStatement();
// sql语句
String sql = "insert into jdbc01_student(stu_id,stu_name,stu_age,stu_gender) "
+ "values("+student.getId()+",'"+student.getName()+"',"+student.getAge()+","+student.getGender()+")";
System.out.println(sql);
acceptRow = statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接
DBUtil.close(resultSet, statement, connection);
}
return acceptRow;
}
}
4.3.3 新建一个Service类
public class StudentService {
/**
* 添加一个学生的信息
* @param student
* @return
*/
public int addStudent(Student student) {
StudentDao studentDao = new StudentDao();
int accpetRow = studentDao.addStudent(student);
return accpetRow;
}
}
4.3.4 新建一个测试类
public class StudentTest {
@Test
public void addStudent() throws Exception{
StudentService studentService = new StudentService();
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(20);
student.setGender(1);
studentService.addStudent(student);
}
}
执行测试类中的addStudent()方法就往数据库中添加了一条记录。
数据库中能查找到这条记录,那怎么在程序中查找到这条记录呢。接下来要讲的就是查找数据库中的记录。
4.4 查询数据库中的记录
4.4.1 在Dao类中添加查询方法
/**
* 查找所有学生
* @return
*/
public List<Student> getStudentList(){
List<Student> studentList = new ArrayList<>();
// 获取数据库连接对象
Connection connection = DBUtil.getConnection();
Statement statement = null;
ResultSet resultSet = null;
try {
// 获取SQL执行对象
statement = connection.createStatement();
// sql语句
String sql = "select stu_id,stu_name,stu_age,stu_gender from jdbc01_student";
// 获取结果集
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
Student student = new Student();
// 根据列名获取值
String idString = resultSet.getString("stu_id");
String nameString = resultSet.getString("stu_name");
String ageString = resultSet.getString("stu_age");
String genderString = resultSet.getString("stu_gender");
int id = Integer.parseInt(idString);
int age = Integer.parseInt(ageString);
int gender = Integer.parseInt(genderString);
// 封装学生的信息
student.setId(id);
student.setName(nameString);
student.setAge(age);
student.setGender(gender);
// 添加到集合中
studentList.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接
DBUtil.close(resultSet, statement, connection);
}
return studentList;
}
4.4.2 在Service类中添加查询方法
/**
* 查找所有学生
* @return
*/
public List<Student> getStudentList(){
StudentDao studentDao = new StudentDao();
List<Student> studentList = studentDao.getStudentList();
return studentList;
}
4.4.3 在测试类中添加查询方法
@Test
public void getStudentList() throws Exception{
StudentService studentService = new StudentService();
List<Student> studentList = studentService.getStudentList();
for(Student student : studentList) {
System.out.println(student);
}
}
执行测试类中的查询方法就可以看到控制台打印的信息了。
Student [id=1, name=张三, age=20, gender=1]
修改和删除的代码我就不写了,读者可以自己根据查询和添加自己练习。
源码地址:https://github.com/ShrMus/Dao/tree/master/dao_20180603/src/main/java/com/shrmus/jdbc01