11--Java--JDBC知识梳理
JDBC
一、概述:JDBC(java database connection),使用java语言连接数据库,是java提供一套操作数据库的接口(标准),实现对数据库的统一访问,是一个java引用应用程序与数据库交互的桥梁。

二、组成:
DriverManager类:驱动管理类,用户注册驱动,获取连接对象
Connection接口:数据库的连接对象
Statement接口:执行SQL语句,操作数据
PreparedStatement接口:执行SQL语句,操作数据
ResultSet接口:接收SQL查询结果(一张虚拟的表)

三、通过JDBC实现Query操作
第一步:在数据库中创建数据库、新建表等一系列操作。
第二步:在myeclipse中新建Web Project,创建与数据库中数据表相对应的实体类
第三步:引入数据库厂商提供的数据库对应的驱动包(.jar格式...)到项目文件夹中的WebContent/WEB INF/lib/
第四步:写代码
使用JDBC访问数据库的步骤:
1.加载数据库驱动(推荐方式二)
import java.sql.DriverManager;
方式一:DriverManager.registerDriver(new com.mysql.jdbc.Driver());//不推荐
方式二:Class.forName("驱动类全称:包名+类名"); //通过反射加载驱动,此处JDBC4.0后自动加载,可不用写,但建议写。
Class.forName("com.mysql.jdbc.Driver");
2.获取数据库的连接对象(三种方式)
import java.sql.Connection;
Connection conn = DriverManager.getConnection("url","user","password");
url:1)统一资源定位符,标识网络上的一个具体资源(一个网页,一张照片,一个视频等)
2)url格式是 协议+ip地址+端口+资源名称
jdbc:mysql :// localhost : 3306 / 数据库名称
jdbc:mysql :// 127.0.0.1 : 3306 / 数据库名称
jdbc:mysql :/// 数据库名称 (此种写法默认本机)
user:数据库用户名
password:数据库用户密码
Connection conn = DriverManager.getConnection("Path");//path等于url+user+password
path:jdbc:mysql://localhost:3306/数据库名称?user = ...&password = ...
Connection conn = DriverManager.getConnection("url",properties);
properties:属性对象
Properties p = new Properties();
p.setProperty("user","...");
p.setProperty("password","...");
3.编写SQL语句
import java.sql.Statement;
import java.sql.ResultSet;
1)获取SQL语句对象
Statement st = conn.CreateStatement();
2)执行SQL语句,返回结果
ResultSet rs = st.executeQuery("select * from student");//执行查询SQL语句,将查询结果返回到结果集中
String sql = "delete ....";
int num = st.executeUpdate(sql);//执行更新(增删改)SQL语句,返回的是int型的成功执行语句条数
4.处理结果集
方式一:不建议使用
while(rs.next()){//next()获取的一张表的一行,也称一条记录
Object id = rs.getObject(1);//获取的是一张表的第一列,也称一个字段
Object name = rs.getObject(2);//第二列
Object age = rs.getObject(3);//第三列
}
方式二:方法中的参数名称需要和数据表中的字段名称一致,并且建议创建数据库中数据表的字段时不要使用中文!!!
while(rs.next()){//next()获取的一张表的一行,也称一条记录
int id = rs.getInt("学号");//获取的是一张表的第一列,也称一个字段
String name = rs.getString("姓名");//第二列
int age = rs.getInt("年龄");//第三列
//如果数据库中的Date类型,建议使用String接收
}
5.释放连接资源。
import java.sql.SQLException;
finally{ //finally意思是在结尾无论前面发生了啥,程序总会执行这段代码
if(conn != null){
try{ conn.close();
}catch(SQLException e){
e.printStackTrace();
}}
if(st != null){
try{ st.close();
}catch(SQLException e){
e.printStackTrace();
} }
if(rs != null){
try{ rs.close();
}catch(SQLException e){
e.printStackTrace();
} }//所有对象通通关闭
}
四、注意:
1.JDBC使用Statement会存在数据库注入问题,因此需用PrepareStatement对象来解决
String username = "1' or 1 = '1'";//设用户名
String password = "1' or 1 = '1'";//设密码
PreparedStatement pre = conn.prepareStatement("select * from student where username = ? and password = ?");//将SQL语句进行预处理,采用问号占位符的形式
pre.setString(1,username);//给第一个问号的位置赋值
pre.setString(2,password);//给第二个问号的位置赋值
ResultSet rs = pre.executeQuery();//执行赋值后的SQL语句
五、封装并调用JDBC工具类
封装工具类的代码:
public class JDBCfunction{
//静态块 优先执行,并且只执行一次
static{
try{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundExcption e){
e.printStackTrack();
}
}
//连接对象
public static Connection getConnection(){
Connection conn = null;
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename","username","password");
}catch(SQLExcption e){
e.printStackTrack();
}
return conn;
}
//释放连接资源
public static void close(Connection conn,Statement st,ResultSet rs){
if(conn != null){
try{
conn.close();
}catch(SQLExcption e){
e.printStackTrack();
}
}
if(st != null){
try{
st.close();
}catch(SQLExcption e){
e.printStackTrack();
}
}
if(rs != null){
try{
rs.close();
}catch(SQLExcption e){
e.printStackTrack();
}
}
}
}
调用工具类的代码:(使用时需导入Import JDBCfunction所在的文件包)
public class UseJDBCfunction(){
public static void main(String[] args) throws SQLException{
//加载驱动,建立连接
Connection conn = JDBCfunction.getConnection();
//创建预处理对象
PreparedStatement pre = conn.prepareStatement("select * from student");
//查询
ResultSet rs = pre.executeQuery();
//遍历输出
while(rs.next()){
int uid = rs.getInt("uid");
String username = rs.getString("username");
String password = rs.getString("password");
User user = new User(uid,username,password);
System.out.println(user);
}
//释放资源
JDBCfunction.close(conn,pre,rs);
}
}
六、JDBC批量操作
1.jdbc设置事务自动提交,处理异常
在连接对象conn与数据库通过用户名和密码建立连接了之后,如果后续操作有catch异常,则不让其conn对象最终对数据库进行修改。
conn.setAutoCommit(false);//设置事务是否自动提交,默认为ture,自动提交。
conn.commit();//立即提交事务,对数据库进行修改。
conn.rollback();//如果异常,事务回滚
public class UseJDBCfunction(){
public static void main(String[] args) throws SQLException{
Connection conn = null;
PrepareStatement pre = null;
try{
//加载驱动,建立连接
conn = JDBCfunction.getConnection();
conn.setAutoCommit(false);//禁止自动提交事务
//创建预处理对象
pre = conn.prepareStatement("insert into user(username,password) value(?,?)");
pre.setString(1,"xiaoming");
pre.setString(2,"123");
//更新
int update = pre.executeUpdate();
if(update > 0){
System.out.println("添加成功");
conn.commit();//提交事务
}
}catch(SQLException e){
e.printTrackTrace();
try{
conn.rollback();//出现异常,事务回滚
}catch(SQLException e){
e.printTrackTrace(); }
}
//释放资源
JDBCfunction.close(conn,pre,rs);
}
}
2.jdbc批量添加
在给预处理对象赋值时,采用pre.addBatch();的方式,对数据库语句中的问号进行批量添加操作
public class UseJDBCfunction(){
public static void main(String[] args) throws SQLException{
Connection conn = null;
PrepareStatement pre = null;
try{
//加载驱动,建立连接
conn = JDBCfunction.getConnection();
conn.setAutoCommit(false);//禁止自动提交事务
//创建预处理对象
pre = conn.prepareStatement("insert into user(username,password) value(?,?)");
pre.addBatch();
pre.setString(1,"m1");
pre.setString(2,"123");
pre.addBatch();
pre.setString(1,"m2");
pre.setString(2,"1234");
pre.addBatch();
pre.setString(1,"m3");
pre.setString(2,"12345");
//......
//更新(这是没用批量操作的写法)
//int update = pre.executeUpdate();
//更新(用批量操作的写法,返回的是一个数组,因为数据库添加了多条数据)
int[] executeBatch = pre.executebatch();
if(executeBatch.length > 0){
System.out.println("添加成功");
conn.commit();//提交事务
}
}catch(SQLException e){
e.printTrackTrace();
try{
conn.rollback();//出现异常,事务回滚
}catch(SQLException e){
e.printTrackTrace();26 }
}
//释放资源
JDBCfunction.close(conn,pre,rs);
}
}

11--Java--JDBC知识梳理的更多相关文章
- java基础知识梳理
java基础知识梳理 1 基本数据类型
- 《面试补习》- Java集合知识梳理
一.ArrayList ArrayList 底层数据结构为 动态数组 ,所以我们可以将之称为数组队列. ArrayList 的依赖关系: public class ArrayList<E> ...
- 新手上路---Java学习知识梳理
我随笔 我相信也有那么一些人跟我一样,脱下军装后对未来感到迷茫,不知所措甚至怀疑起自己的能力,自身体会的经历过才能明白其中的辛酸!归咎一切:心态,信心,自信!再穷不过乞讨,不死终将出头.好了,闲言碎语 ...
- Java Web知识梳理
今天给内部做了个培训,貌似搞错了对象,不该对新人讲这么原理性的东西. anyway,还是放上来吧,不知道有没有人能理清其中的逻辑 ^ _ ^ 问题:为什么要用tomcattomcat: servlet ...
- Java基础知识梳理《一》
一.Java数据类型(简单称之为“四类八种”) java 基本的数据类型长度都是固定的,好处是在实现跨平台时就统一了. 1.整型 byte short int long (分别是1,2,4,8个字节) ...
- Java简单知识梳理
1. Java是单根继承结构:每个类都继承于Object类 ,这也就保证了每个对象都具备某些功能 2. Java类权限关键字: public -> protected -> default ...
- JAVA JDBC(存储过程和事务管理)
1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...
- Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
随机推荐
- rsync 服务介绍及相关实验
一.rsync 简介 rsync 是类 unix 系统下的数据镜像备份工具.一款支持快速完全备份和增量备份的工具,支持本 地复制,远程同步等,类似于 scp 命令:rsync 命令在同步文件之前要先登 ...
- 使用java做一个能赚钱的微信群聊机器人(2020年基于PC端协议最新可用版)
前言 微信群机器人,主要用来管理群聊,提供类似天气查询.点歌.机器人聊天等用途. 由于微信将web端的协议封杀后,很多基于http协议的群聊机器人都失效了,所以这里使用基于PC端协议的插件来实现. 声 ...
- 搞定SpringBoot多数据源(3):参数化变更源
目录 1. 引言 2. 参数化变更源说明 2.1 解决思路 2.2 流程说明 3. 实现参数化变更源 3.1 改造动态数据源 3.1.1 动态数据源添加功能 3.1.2 动态数据源配置 3.2 添加数 ...
- 异数OS 织梦师-Xnign(四)-- 挑战100倍速Nginx,脚踩F5硬件负载均衡
. 异数OS 织梦师-Xnign(四)– 挑战100倍速Nginx,脚踩F5硬件负载均衡 本文来自异数OS社区 github: https://github.com/yds086/HereticOS ...
- python self用法
在定义类的过程中,无论是显式的创建类的构造方法,还是向类中添加实例方法,都要将self参数作为方法的第一个参数. class Person: def __init__(self): print(&qu ...
- unity调试native c/c++ dll
最近使用xlua,需要添加自定义的c lua库.研究了一下unity调试native c/c++ dll.方法如下: 通过Unity打开VS工程 VS菜单栏[工具]-> [选项] 在选项对话框中 ...
- 西柚考勤系统——alpha2
这个作业属于哪个课程 http://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业的要求在哪里 https://www.cn ...
- 小白学Java:File类
目录 小白学Java:File类 不同风格的分隔符 绝对与相对路径 File类常用方法 常用构造器 创建方法 判断方法 获取方法 命名方法 删除方法 小白学Java:File类 我们可以知道,存储在程 ...
- 1.Vue初始及相关Vue核心组件
1.Vue官方文档 官网文档:https://cn.vuejs.org/v2/guide/ 2.Vue-cli官方文档(脚手架) 官网文档:https://cli.vuejs.org/zh/guide ...
- SMB信息泄露
开门见山 1. 用netdiscover -r 扫描与攻击机同一网段的靶机,发现PCS 2. 扫描靶场开放信息 3. 挖掘靶场全部信息 4. 针对SMB协议,使用空口令,若口令尝试登录,并查看敏感文件 ...