大家好,我是一个爱举铁的程序员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