Java连接数据库JDBC
前言
在Python和Golang我们可以使用pip install和go get 去下载开发中使用到的开源的第三方包,以实现企业级应用的开发;
在Java中使用一系列的JAR包通常用于归档大量的Java类文件、相关的元数据和资源(文本、图片等)文件到1个文件中,以便开发Java平台应用软件或库。
帮助我们实现功能丰富、复杂的企业家应用开发;
JAR(Java Archive/Java归档)包,不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。
一、JDBC是什么?
Java Database Connectivity简称JDBC,是Java官方(Sun公司)定义的一套Java程序操作所有关系型数据库的规范(接口);
各大数据库厂商为了通过Java来推广自己的数据库产品,实现了JDBC规范(接口)并通过JAR包的形式发布出来给Java开发人员使用,就是数据库驱动(driver)。
现在我们要用Java调MySQL数据库,所以就需要提前下载MySQL提供的的driver,也就是1个JAR包;
二、JDBC数据库操作
DriverManager驱动管理对象: 可以获取数据库连接对象。
Connection 数据库连接对象: 可以获取执行SQL的对象,可以管理事务操作。
Statement 执行静态SQL对象: 可以执行数据库的增删改查操作
1.创建表(DML)
package cn.zhanggen; import com.mysql.jdbc.CommunicationsException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;
public class App { public static void main(String[] args) { Connection connection = null; Statement statement = null; try { Class.forName("com.mysql.jdbc.Driver"); String dbURL = "jdbc:mysql://192.168.56.18:3306/web?characterEncoding=utf8"; connection = DriverManager.getConnection(dbURL, "zhanggen", "123.com"); statement = connection.createStatement(); String createTable="CREATE TABLE IF NOT EXISTS `staffs`(\n" + "`id` INT UNSIGNED AUTO_INCREMENT KEY COMMENT '用户编号',\n" + "`username` VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',\n" + "`age` TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',\n" + "`salary` FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT '薪水'\n" + ")ENGINE=INNODB DEFAULT CHARSET=UTF8;"; statement.executeUpdate(createTable); // String sql = "insert into staffs(username,age,salary) values ('马睿',18,999.19),('张景辉',58,999.19);"; // statement.executeUpdate(sql); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { System.out.println("11"); e.printStackTrace(); } finally { if (statement != null) { try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
2.新增记录
import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; public class Insert01 { public static void main(String[] args) throws Exception { //1.将MySQL服务器提供的jar包中的Driver接口实现类,注册到JVM Driver driver = new com.mysql.jdbc.Driver(); DriverManager.registerDriver(driver); //2.通过DriverManager在java工程和MySQL服务器之间建立1个连接通道; String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(dbURL, "yourusername", "yourpassword"); //3.在通道中创建1个交通工具 PreparedStatement ps = conn.prepareStatement(""); //4.通过交通工具将SQL命令推送到MySQL服务器上执行 String sql = "insert into staffs(username,age,salary) values ('Martin',18,999.19),('Tom',58,999.19);"; //5.执行插入SQL命令 int counter = ps.executeUpdate(sql); System.out.println(counter); //6.关闭数据库连接资源 if (conn != null) { conn.close(); } if (ps != null) { ps.close(); } } }
3.更新记录
import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; public class update02 { public static void main(String[] args) throws Exception { //1.将MySQL服务器提供的jar包中的Driver接口实现类,注册到JVM中 // Driver driver = new com.mysql.jdbc.Driver(); // DriverManager.registerDriver(driver); Class.forName("com.mysql.jdbc.Driver"); //2.通过DriverManager建立数据库连接通道 String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(dbURL, "用户", "密码"); //3.在通道上创建1个运输SQL的交通工具. PreparedStatement ps = conn.prepareStatement(""); //4.使用交通工具运输SQL; String sql = "update staffs set age=18 where username='Martin';"; int couner = ps.executeUpdate(sql); System.out.printf("更新了%s条数据\n", couner); //5.回收数据库资源 if (conn != null) { conn.close(); } if (ps != null) { ps.close(); } } }
4.查询
import java.sql.*; import java.util.Arrays; public class Select03 { public static void main(String[] args) throws Exception { //1.完成driver注册 Class.forName("com.mysql.jdbc.Driver"); //3.创建数据库连接 String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(dbURL, "用户", "密码"); //4.创建交通工具 PreparedStatement ps = conn.prepareStatement(""); //5.使用交通工具,执行SQL获取查询结果【临时表】 String sql = "select username, age,salary from staffs;"; //6.返回ResultSet接口的实现类对象 ResultSet rs = ps.executeQuery(sql); //7.ResultSet对象的数据,next()执行一次,指针向下移动一行; /* 如果指针指向位置是1个具体数据行, 此时next()将返回true 如果指针指向的位置不是1个具体数据行,此时next()将返回false */ while (rs.next()) { String name = rs.getString("username"); int age = rs.getInt("age"); float salary = rs.getFloat("salary"); System.out.println("姓名:" + name + "年龄:" + age + "工资:" + salary); } //8.回收数据库连接资源 if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } }
5.SQL预编译和批量执行
SQL预编译可以防止SQL注入,批量执行可以提升SQL执行的效率;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class prepareStatement04 { public static void main(String[] args) throws Exception { //1.注册MySQL的driver Class.forName("com.mysql.jdbc.Driver"); //2.创建数据库连接 String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(dbURL, "用户", "密码"); //3.预编译形式的SQL语句 String preparedSQL = "insert into staffs(username,age,salary) values (?,?,?);"; PreparedStatement ps = conn.prepareStatement(preparedSQL); //4.生成批量操作的SQL语句 for (int i = 0; i <= 100; i++) { ps.setString(1, "张根" + i); ps.setInt(2, 18); ps.setDouble(3, 191222.12); ps.addBatch(); } //5.一次性批量执行100条SQL语句 ps.executeBatch(); //6.释放数据库资源 if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } }
6.jdbc事务操作
connection.setAutoCommit(false):开启事务
commit():事务提交/执行
rollback:事务回滚
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Transaction05 { //jdbc的事务操作 public static void main(String[] args) throws Exception { //1.注册MySQL driver Class.forName("com.mysql.jdbc.Driver"); //2.创建数据库连接 String dbURL = "jdbc:mysql://192.168.0.98:3306/zhanggen?characterEncoding=utf8"; Connection conn = DriverManager.getConnection(dbURL, "用户", "密码"); //3.命令启动事务相当于执行start transaction; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(""); String sql1 = "delete from staffs where username='张根85';"; String sql2 = "delete from staffs where username='张根86';"; try { int count1 = ps.executeUpdate(sql1); int count2 = ps.executeUpdate(sql2); System.out.println(count1); System.out.println(count2); conn.commit(); } catch (SQLException e) { //SQL执行出现异常回滚 System.out.println("回滚了!"); conn.rollback(); } finally { if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } } }
三、DAO封装
ORM可以帮助我们把数据中表映射为class类,把每表中的每条记录映射为object对象,使我们可以通过代码操作数据库,在这个基础之上我们还可以进一步对操作数据库的代码进行封装,那就是使用DAO层。
在Java中我们可以使用DAO类对JDB操作表的细节进行代码封装;
DAO(Database Access Object)是指可以提供数据库访问对象的类;
作用:数据库访问对象(DAO)在开发时提供针对某1张表的增删改查操作细节;
优势:DAO可以提高代码封装性,通过数据库访问对象可以避免反复书写SQL以及JDBC开发步骤的书写;
开发规则:
1个DAO类中封装1张表的封装细节;
DAO类命名规则:表名+Dao,比如对employee表的增删改查操作细节进行封装,此时的DAO就应该命名为EmployeeDAO;
DAO类所在包的命名规则:公司网站的域名.dao,例如com.le.dao;
参考