JDBC——API详解
DiverManager
DriverManager(驱动管理类)作用:
1. 注册驱动
MySQL 5之后的版本 不再需要手动写这行注册驱动的代码了(可以省略)
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2. 获取数据库连接
// 2.获取连接 如果连接的是本机数据库 可胜率省略IP地址和端口号 jdbc:mysql:///数据库名称?参数键值对
String url = "jdbc:mysql://127.0.0.1:3306/db_0915?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
参数:
1. url :连接路径
语法:jdbc:mysql://ip地址:端口号/数据库名称?参数键值对1&参数键值对2...
示例:jdbc:mysql://127.0.0.1:3306/db_0915
细节:
如果连接的是本机的mysql服务器,并且mysql 服务器默认端口是3306,则可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置 useSSL = false 参数,禁用安全连接方式,解决警告提示
2. user:用户名
3. password:密码
Connection
Connection(数据库连接对象)作用:
1. 获取执行SQL的对象
普通执行SQL对象
Statement createStatement()
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
2. 管理事务
开启事务:setAutoCommit(boolean aotoCommit) true为自动提交事务,false为手动提交事务 即为开启事务 提交事务:commit() 回滚事务:rollback()
示例:
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db_0915?characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password); // 3. 定义sql
String sql1 = "update account set money = 3000 where name = '张三'";
String sql2 = "update account set money = 3000 where name = '李四'"; // 4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement(); // 开启事务
conn.setAutoCommit(false); try {
// 5.执行SQL
int count1 = stmt.executeUpdate(sql1); // 受影响的行数 // 6. 处理结果
System.out.println(count1); // 5.执行SQL
int count2 = stmt.executeUpdate(sql2); // 受影响的行数 // 6. 处理结果
System.out.println(count2); // 提交事务
conn.commit();
} catch (Exception e) {
// 回滚事务
conn.rollback();
throw new RuntimeException(e);
} // 7. 释放资源
stmt.close();
conn.close();
Statement
执行SQL语句
int executeUpdate(sql) :执行DML、DDL语句 返回值(1)DML语句影响的行数
(2)DDL语句执行后可能返回0
ResultSet executeQuery(sql) :执行DQL语句 返回值 :ResultSet 结果集对象
ResultSet
ResultSet (结果集对象)作用:
1. 封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql) :执行DQL语句,返回ResultSet对象
获取查询结果
boolean next() :(1)将光标从当前位置向前移动一行
(2)判断当前行是否为有效行
返回值:
true : 有效行,当前行有数据
false : 无效行,当前行没有数据
xxx getXxx(参数) :获取数据
xxx :数据类型;如:int getInt(参数);String getString(参数)
参数:
int :列的编号,从1开始
String :列的名称
使用步骤:
1. 游标向下移动一行,并判断该行是否有数据:next()
2. 获取数据:getXxx(参数)
// 循环判断游标是否最后一行末尾
while(rs.next()){
// 获取数据
rs.getXxx(参数);
)
案例:

Account类
public class Account {
private int id;
private String name;
private double money;
public Account(int id, String name, double money) {
this.id = id;
this.name = name;
this.money = money;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
"}\n";
}
}
主程序:
/**
* ResultSet 案例
* 查询account账户表数据,封装为Account对象,并且存储到ArrayList集合中
*/
public static void main(String[] args) throws Exception { // 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db_0915?characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
// 3. 定义sql
String sql = "select * from account";
// 4. 获取Statement对象
Statement stmt = conn.createStatement();
// 5. 执行sql
ResultSet rs = stmt.executeQuery(sql);
//6. 处理执行结果
ArrayList<Account> accounts = new ArrayList<>(); // 账户表
while(rs.next()){
Account account = new Account(rs.getInt("id"),
rs.getString("name"),rs.getDouble("money"));
accounts.add(account);
}
System.out.println(accounts);
}
PreparedStatement
作用:预编译SQL并执行SQL语句
①获取 PreparedStatement 对象
//SQL语句中的参数值,使用 ? 占位符替代
String sql = "select * from user where username = ? and password = ?"; // 通过Connection 对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
②设置参数值
PreparedStatement 对象: setXxx(参数1,参数2) 给 ? 赋值
Xxx:数据类型 ; 如 setInt(参数1, 参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
③执行SQL
executeUpdate(); / executeQuery();
不需要再传递sql
示例:
/**
* 用户登录 ——PreparedStatement 防SQL注入
*/
@Test
public void testUserLogin() throws Exception{
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db_0915?characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
// 接收用户名和密码
String name = "zhangsan";
//String pwd = "' or '1' = '1 "; ---------登录失败
String pwd = "123";
//定义sql name 和 pwd 用在占位符替代
String sql = "select * from tb_user where username = ? and password = ?";
//通过conn获取PreparedStatement对象
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置参数
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs = pstmt.executeQuery();
//结果判断
if(rs.next()){
System.out.println("登录成功~");
}else{
System.out.println("登录失败~");
}
// 释放资源
rs.close();
pstmt.close();
conn.close(); }
预编译 需要手动开启
PreparedStatement 预编译功能开启: useServerPrepStmts=true
原理:


JDBC——API详解的更多相关文章
- JDBC Api详解
一.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Jav ...
- hibernate学习(2)——api详解对象
1 Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户 ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- jqGrid APi 详解
jqGrid APi 详解 jqGrid皮肤 从3.5版本开始,jqGrid完全支持jquery UI的theme.我们可以从http://jqueryui.com/themeroller/下载我们所 ...
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
- 转】Mahout推荐算法API详解
原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...
- dom4j api 详解--XPath 节点详解
dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
- Java的JDBC事务详解
Java的JDBC事务详解 分类: Hibernate 2010-06-02 10:04 12298人阅读 评论(9) ...
- 【Unity编程】Unity中关于四元数的API详解
本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...
随机推荐
- 在Django中,多数据操作,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中
在Django中,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中.下面是一个简单的示例: 假设你有一个Django应用程序,名为myapp,并且你希望从另 ...
- [oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
进制转化 回忆上次内容 上次了解的是 整型数字类变量 integer 前缀为i 添加图片注释,不超过 140 字(可选) 整型变量 和 字符串变量 不同 整型变量 是 直接存储二进制形 ...
- ArchLinux Vmware安装指北
ArchLinux Vmware安装指北 在本文开始之前,首先允许我提前声明一点,Arch Linux的安装并不算难,但是绝对也算不上简单,中间的安装可能会遇到很多问题,本篇文章不能保证完全贴合你的真 ...
- 爆破字典:linux 敏感文件-01
linux 中敏感文件 1.0 /apache/apache/conf/httpd.conf /apache/apache2/conf/httpd.conf /apache/php/php.ini / ...
- 🚀RabbitMQ+redis+Redisson分布式锁+seata实现订单服务
引言 订单服务涉及许多方面,分布式事务,分布式锁,例如订单超时未支付要取消订单,订单如何防止重复提交,如何防止超卖.这里都会使用到. 开启分布式事务可以保证跨多个服务的数据操作的一致性和完整性, 使用 ...
- 【Java】线程池配置
先看JUC包自带的一个资源 线程池执行器: 初始化参数如下 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( corePo ...
- 【BatchProgram】工作用的小工具 - 自动访问常用页面
需求: 我需要打开很多页面,但是忘了收藏的话,每次都要重新去找一遍打开 页面很多,不是一两个了,为什么这么多?因为开发情况就是这样啊: 正式生产一个页面,UAT测试一个页面,本地调试一个页面 每日工作 ...
- 【C】Re05 指针
一.变量 & 指针 变量 = 内存地址 + 存储值 指针变量 = 内存地址 + 存储值[变量的内存地址] 作用: 间接访问内存地址 内存地址 = 地址编号 地址编号:内存中的每个字节唯一的编号 ...
- 【Project】原生JavaWeb工程 02 登陆业务的流程(第一阶段样例)
1.对用户信息的描述 首先用户有一些基本信息: 最简单的: 用户名称 + 用户密码 然后是用户状态,例如封号,注销,停用,等等 用户名称 + 用户密码 + 账号状态 接着为了防止脚本攻击,又产生了图形 ...
- 【IDEA】使用Maven骨架创建JavaWeb项目
IDEA版本:2020.1 骨架选项名称: org.apache.maven.archetypes:maven-archetype-webapp 本项目的Maven坐标设置: 设置优先从本地获取骨架: ...