JDBC的概念

  JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

JDBC的使用流程

导入jar包

  1、下载有关数据库的jar包(下载地址:http://central.maven.org/maven2/mysql/mysql-connector-java/)

  2、导入jar包,在Build Path里配置环境

    Build Path-->Add JARs

加载驱动

// 加载驱动程序:Class.forName(driverClass)

// 加载mysql驱动:
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0版本以后的mysql驱动 // 加载oracle驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");

获取数据库连接对象

String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);

  参数含义:

    url: 表示要连接的数据地址

    user: 数据库的用户名

    password: 数据库的密码

  作用:

    连接到指定的数据库并返回连接对象。

创建sql命令对象(编译和发送sql命令给数据库)

Statement stmt = conn.createStatement();

创建sql命令

String sql = "insert into user values(13,'王13','wang13')";

指定sql命令,获得返回结果

int i = stmt.executeUpdate(sql);
ResultSet rs = stmt.executeQuery(sql)

  增删改 时调用 stmt.executeUpdate(sql)方法。返回值为 int类型。大于等于 1 时表示成功,为 0 时表示失败。  

  查询 调用 stmt.executeQuery(sql)方法。返回ResultSet 类型,表示一个结果集。

  ResultSet对象是基于指针进行数据存储的,类似枚举。不便于数据的针对性的获取。可将数据转换到ArrayList中进行存储。

关闭资源

        stmt.close();
conn.close();

  关闭之前打开的资源。需要抛出异常。

对数据的增删改查

增加 (insert)

        // 声明jdbc变量
Connection conn = null;
Statement stmt = null;
// 声明jdbc参数
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
try {
// 1 加载驱动类
Class.forName(driver);
// 2.获取数据库连接对象(连接指定数据库)
conn = DriverManager.getConnection(url, user, password);
// 3.创建sql命令对象(编译和发送sql命令给数据库)
stmt = conn.createStatement();
// 4.创建sql命令
String sql = "insert into user values(13,'王13','wang13')";
// 5.指定sql命令
int i = stmt.executeUpdate(sql);
System.out.println("执行结果:" + i);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6.关闭资源
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

修改 (update)

        // 声明jdbc变量
Connection conn = null;
Statement stmt = null; // 声明jdbc参数
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456"; try {
// 1 加载驱动类
Class.forName(driver); // 2.获取数据库连接对象(连接指定数据库)
conn = DriverManager.getConnection(url, user, password); // 3.创建sql命令对象(编译和发送sql命令给数据库)
stmt = conn.createStatement(); // 4.创建sql命令
String sql = "update user set username='王update' where id=13"; // 5.指定sql命令
int i = stmt.executeUpdate(sql);
System.out.println("执行结果:" + i); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6.关闭资源
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

删除 (delete)

        // 声明jdbc变量
Connection conn = null;
Statement stmt = null; // 声明jdbc参数
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456"; try {
// 1 加载驱动类
Class.forName(driver); // 2.获取数据库连接对象(连接指定数据库)
conn = DriverManager.getConnection(url, user, password); // 3.创建sql命令对象(编译和发送sql命令给数据库)
stmt = conn.createStatement(); // 4.创建sql命令
String sql = "delete from user where id=11"; // 5.指定sql命令
int i = stmt.executeUpdate(sql);
System.out.println("执行结果:" + i); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6.关闭资源
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

查询(select)

        // 声明jdbc变量
Connection conn = null;
Statement stmt = null;
// 声明jdbc参数
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
try {
// 1 加载驱动类
Class.forName(driver);
// 2.获取数据库连接对象(连接指定数据库)
conn = DriverManager.getConnection(url, user, password);
// 3.创建sql命令对象(编译和发送sql命令给数据库)
stmt = conn.createStatement();
// 4.创建sql命令
String sql = "select * from user";
// 5.指定sql命令
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt(1) + " " + rs.getString("username") + " " + rs.getString(3));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6.关闭资源
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

  

JDBC的事务管理

  事务:一个事件的完成需要几个子操作的联合完成。只要有一个子操作执行失败,则数据回滚到原始状态,都成功则提交数据。

  JDBC默认为自动提交事务。进行增删改操作时应将其设置为手动提交。

conn.setAutoCommit(false);

  默认值为true,自动提交。 false 为手动提交。

  使用try catch进行SQL命令执行提交和回滚。

        try {
conn.commit();
} catch (SQLException e) {
conn.rollback();
e.printStackTrace();
}

  try 中使用 conn.commit() 进行数据提交,若报错则在 catch 中使用 conn.rollback() 进行事务回滚。

使用PreparedStatement对象进行数据库操作

PreparedStatement对象与Statement对象的比较

  Statement对象进行数据库操作时可能会出现 sql 注入的风险。

  preparedStatement对象在sql语句中使用占位符,可以防止sql注入。可以预编译,批量执行同一条SQL语句时效率远大于Statement对象。

// statement对象执行sql语句
Statement stmt = conn.createStatement();
String sql = "insert into user values(13,'王13','wang13')";
int i = stmt.executeUpdate(sql); // preparedStatement对象执行sql语句
String sql = "insert into user values(?,?,?)";
PraparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 15);
ps.setString(2, "王15");
ps.setString(3, "123456");
int i = ps.executeUpdate();

优化封装代码

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=123456

db.properties

 import java.io.IOException;
import java.io.InputStream;
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.Properties; public class JUtil {
private static String driver;
private static String url;
private static String user;
private static String password; static {
// 创建properties对象获取属性文件的内容
Properties p = new Properties();
// 获取属性文件的读取对象流
InputStream is = JUtil.class.getResourceAsStream("/db.properties");
try {
// 加载属性配置文件
p.load(is);
// 获取jdbc参数
driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
password = p.getProperty("password");
// 加载驱动
Class.forName(driver);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 获取Connection对象
public static Connection getConn() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
} // 获取PreparedStatement对象
public static PreparedStatement getPre(Connection conn,String sql) {
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ps;
} // 关闭资源
public static void closeAll(Statement stmt,Connection conn) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

工具类Jutil

         /**
* 封装DML
* @param sql sql语句
* @param objs 参数数组
* @return i 大于等于 1 时执行成功,等于 0 时执行失败。
*/
private int executeDML(String sql,Object ... objs) {
Connection conn = null;
PreparedStatement ps = null;
int i= 0;
try {
// 创建连接对象
conn = JUtil.getConn();
// 手动提交事物
conn.setAutoCommit(false);
// 获得sql语句及参数
ps = JUtil.getPre(conn, sql);
// 给占位符赋值
for(int j = 0; j < objs.length; j++) {
ps.setObject(j+1, objs[j]);
}
// 执行sql命令
i = ps.executeUpdate();
// 提交
conn.commit();
} catch (SQLException e) {
try {
// 回滚
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
JUtil.closeAll(ps, conn);
}
return i;
}

封装DML(增删改)

     /**
* 增加
* @param id
* @param name
* @param pwd
* @return i 大于等于 1 时执行成功,等于 0 时执行失败。
*/
public int insert(int id,String name,String pwd) {
String sql = "insert into user values(?,?,?)";
int i = executeDML(sql,id,name,pwd);
return i;
}

insert增加

     /**
* 修改
* @param id
* @param name
* @param pwd
* @return i 大于等于 1 时执行成功,等于 0 时执行失败。
*/
public int update(int id,String name,String pwd) {
String sql = "update user set username=? where id=?";
int i = executeDML(sql,name,id);
return i;
}

update修改

     /**
* 删除
* @param id
* @param name
* @param pwd
* @return i 大于等于 1 时执行成功,等于 0 时执行失败。
*/
public int delete(int id,String name,String pwd) {
String sql = "delete from user where id=?";
int i = executeDML(sql, id);
return i;
}

delete删除

     /**
* 查询
* @return
*/
public List<User> select() {
Connection conn = JUtil.getConn();
String sql = "select * from user";
PreparedStatement ps = JUtil.getPre(conn, sql);
List<User> us = new ArrayList<User>();
try {
ResultSet rs = ps.executeQuery();
while(rs.next()) {
User u = new User();
u.setId(rs.getInt(1));
u.setName(rs.getString(2));
u.setPwd(rs.getString(3));
us.add(u);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JUtil.closeAll(ps, conn);
}
return us;
}

select查询

常见的JDBC错误

  1.   ClassNotFoundException:

    驱动类未找到

  2.   java.sql.SQLException: No suitable driver found for :mysql://localhost:3306/test

    URL错误
  3.   No database selected
             未找到数据库

  4.  Access denied for user 'root1'@'localhost' (using password: YES)

用户名或密码错误

  5.  java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
             sql语句错误

  6.   java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '13' for key 'PRIMARY'
           主键冲突

学习笔记—JDBC的更多相关文章

  1. Java学习笔记——JDBC读取properties属性文件

    Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件. 文件的内容是格式是"键=值"(key-valu ...

  2. Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作

    必须的准备工作 一.MySQL的安装.可以参考博文: http://blog.csdn.net/jueblog/article/details/9499245 二.下载 jdbc 驱动.可以从在官网上 ...

  3. Java学习笔记--JDBC数据库的使用

    参考  hu_shengyang的专栏 : http://blog.csdn.net/hu_shengyang/article/details/6290029 一. JDBC API中提供的常用数据库 ...

  4. JAVA学习笔记 -- JDBC及其应用

    一个.准备工作 1.开放SQL Server服务与支持TCP/IP  进一步确认TCPport watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk ...

  5. Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用

    预编译 SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 预编译的优点 1.PreparedStatement是预编译的,对于批量处理 ...

  6. JMeter学习笔记--JDBC测试计划-连接Mysql

    1.首先要下载jar包,mysql-connector-java-5.1.7-bin.jar 放到Jmeter的lib文件下ext下 2.添加JDBC Connection Configuration ...

  7. 学习笔记-JDBC连接数据库操作的步骤

    前言 这里我就以JDBC连接数据库操作查询的步骤作以演示,有不到之处敬请批评指正! 一.jdbc连接简要步骤 1.加载驱动器. 2.创建connection对象. 3.创建Statement对象. 4 ...

  8. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. TensorFlow从1到2(四)时尚单品识别和保存、恢复训练数据

    Fashion Mnist --- 一个图片识别的延伸案例 在TensorFlow官方新的教程中,第一个例子使用了由MNIST延伸而来的新程序. 这个程序使用一组时尚单品的图片对模型进行训练,比如T恤 ...

  2. 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类

    一.对象的扩展 1.1对象属性名表达式 ES6可以在JSON中使用[]包裹一个key的名字.此时这个key将用表达式作为属性名(被当做变量求值),这个key值必须是字符串. var a = 'name ...

  3. POLARDB · 最佳实践 · POLARDB不得不知道的秘密

    ## 前言 POLARDB作为阿里云下一代关系型云数据库,自去年9月份公测以来,收到了不少客户的重点关注,今年5月份商业化后,许多大客户开始陆续迁移业务到POLARDB上,但是由于POLARDB的很多 ...

  4. [Inside HotSpot] C1编译器优化:全局值编号(GVN)

    1. 值编号 我们知道C1内部使用的是一种图结构的HIR,它由基本块构成一个图,然后每个基本块里面是SSA形式的指令,关于这点如可以参考[Inside HotSpot] C1编译器工作流程及中间表示. ...

  5. selinux学习

    一.基本概念 1.TE模型的安全上下文 所有的操作系统访问控制都基于主体.客体,以及与他们相关的访问控制属性. 在selinux中,访问控制属性叫做安全上下文.所有对象(文件.进程间通信通道.套接字. ...

  6. Server Error in '/' Application Runtime Error 错误

    项目发布后  在本地发布可以运行  在服务器就会出现这种错误 在网上也查找了各种资料  解决方案 都没有解决 因为我用的C# 首先在 Webconfig配置文件中的 system.web中加入 < ...

  7. 关于Vue.use()使用详解

    问题 相信很多人在用Vue使用别人的组件时,会用到 Vue.use() .例如:Vue.use(VueRouter).Vue.use(MintUI).但是用 axios时,就不需要用 Vue.use( ...

  8. Ubuntu 18.04编译AOSP源码

    总结一下我从Ubuntu 18.04下编译成功AOSP的过程,以及遇到的坑 我的电脑配置: OS: Ubuntu 18.04 bionic Kernel: x86_64 Linux 4.18.0-17 ...

  9. Activity 之生命周期

    Activity 之生命周期 本文内容: 1. Activity 介绍 2. Activity 的生命周期 2.1 生命周期图 2.2 常见情况下生命周期的回调 2.3 关于生命周期常见问题 2.4 ...

  10. Ubuntu 安装yii2 advanced版 遇到的坑

    1.安装 Composer https://www.yiichina.com/doc/guide/2.0/start-installation通过 Composer 安装 curl -sS https ...