1.JDBC 简介
sum公司在jdk集成, 学习一套接口
使用java: 面向对象:
JDK只提供了JDBC核心接口, 实现类由各大数据库厂家提供
JDBC实现类称为数据库驱动, 不在jdk中, 外部jar, jar: 压缩文件, 放的是class文件
2.核心API
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
DriverManager(类): 驱动管理器: 加载指定数据库的驱动, 表示使用那个数据库
Connection: 连接对象, 连接数据库
Statement: 用于发送sql给数据, 通知数据库执行sql语句
ResultSet: 用于接收查询的结果集
3.JDBC入门程序
(1)创建一个java项目,导入数据库驱动jar: 使用mysql数据库, 导入mysql驱动jar
在项目中创建一个lib目录, 存放第三方jar
把第三方jar拷贝到lib目录, CTRL+C CTRL+V
设置lib是jar目录
再添加其他jar, 不需要重新设置, 只需要把jar拷贝到lib
(2)编写jdbc代码
1.增删改
jdbc的步骤:
加载驱动类: 指定使用那个数据库
获取连接
编写sql语句, 字符串
创建Statement对象
执行之(发送sql语句到数据库,通知数据库执行sql)
接收结果(如果是增删改: 行数(int), 查询:结果集(ResultSet))
如果查询, 解析ResultSet(表结构),变成java对象
关闭资源
<span style="background-color:#dadada"><span style="color:#1f0909">1. 加载驱动类: 指定使用那个数据库 通过反射技术
Class.forName("com.mysql.jdbc.Driver");
2.获取连接 DriverManager的getConnection方法获取连接
String url = "jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false";
String username = "root";
String password="123";
conn = DriverManager.getConnection(url,username,password);
System.out.println("连接成功!!!");
3.编写sql语句
String sql = "INSERT INTO tb_user VALUES(2,'lisi','1234','男')";
//删除
String sql = "delete from tb_user where id = 2";
//修改:
String sql = "update tb_user set gender = '女', password='123456' where id = 1";
4.创建Statement 通过Connection对象
statement = conn.createStatement();
5.执行之,接收结果 增删改: int executeUpdate(sql)
// 查询:ResultSet executeQuery(sql)
int row = statement.executeUpdate(sql);
6.关闭资源 倒序关 包裹代码: ctrl + alt + T
try {
if(statement != null) statement.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}</span></span>
2.查询
加载驱动类
获取连接
编写sql select
创建Statement对象
执行之,并接收结果 executeUpdate(sql) executeQuery(sql)
如果查询, 解析ResultSet
关闭资源
<span style="background-color:#dadada"><span style="color:#1f0909"> //1.加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false";
String username="root";
String password = "123";
conn = DriverManager.getConnection(url,username,password);
System.out.println("请输入您要查询的姓名:");
Scanner input = new Scanner(System.in);
String word = input.next();
//'%z%'
//3.编写sql select
String sql ="SELECT * FROM tb_user where username like '%" +word+"%'";
System.out.println("sql:"+sql);
//4.创建Statement对象
stmt = conn.createStatement();
//5.执行之,并接收结果
resultSet = stmt.executeQuery(sql);
//6.解析ResultSet: 获取每一行每一列数据
resultSet.next();
//列索引获取 从1开始
int id = resultSet.getInt(1);
//列名获取
String name = resultSet.getString("username");
String pass = resultSet.getString("password");
String gender = resultSet.getString("gender");
System.out.println("id:"+id+",name:"+name+",pass:"+pass+",gender:"+gender);
/* resultSet.next();
//列索引获取 从1开始
id = resultSet.getInt(1);
//列名获取
name = resultSet.getString("username");
pass = resultSet.getString("password");
gender = resultSet.getString("gender");
System.out.println("id:"+id+",name:"+name+",pass:"+pass+",gender:"+gender);*/
//循环获取
while( resultSet.next()){
//列索引获取 从1开始
int id = resultSet.getInt(1);
//列名获取
String name = resultSet.getString("username");
String pass = resultSet.getString("password");
String gender = resultSet.getString("gender");
System.out.println("id:"+id+",name:"+name+",pass:"+pass+",gender:"+gender);
}
//7.关闭资源
try {
if(resultSet != null) resultSet.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}</span></span>
查询不仅可以向下移还可以向上移
<span style="background-color:#dadada"><span style="color:#1f0909">//往上移动
resultSet.previous();</span></span>
4.PreparedStatement 预编译功能
使用Statement, sql语句使用拼接
很容易出错
sql注入/sql攻击
解决方案:
使用Statement的子接口: PreparedStatement
在sql中提供占位符 ?
<span style="background-color:#dadada"><span style="color:#770088">SELECT</span> * <span style="color:#770088">FROM</span> tb_user <span style="color:#770088">WHERE</span> username = <span style="color:#008855">? </span><span style="color:#770088">AND</span> PASSWORD = <span style="color:#008855">?</span></span>
给?赋值, 这个值一定使用单引号引起, 只作为值使用 or 关键字只作为值
sql语句的执行:
sql编译
语法检查
执行sql
SELECT * FROM tb_user WHERE username = ? AND PASSWORD = ?
SELECT * FROM tb_user WHERE username =? AND PASSWORD =?
相对于Statement优点:
防止sql攻击
可读性高
效率高: 预编译功能(一定数据库有这个功能)
给?赋值:
PreparedStatement提供setXxx(int index, Xxx 值) Xxx数据类型. 给?赋值
index: ?的位置, 从1开始
通用数据类型setObject(任意数据类型);
通用数据类型 setString(String 类型)
setInt()
setLong()
.....
注意:
以后都是使用PreparedStatement
5.jdbc工具类
发现jdbc代码大量重复, 使用工具类把重复的代码抽取出来形成一个工具类
写的是一个半封装的
扩展: jdbc工具类全封装
executeQuery(String sql, List params) 执行查询
int executeUpdate(String sql, List params) 执行增删改
重复的代码:
得到连接的代码重复
数据库四大参数 不能硬编码, 写在代码中, 应该把四大参数写在一个文件中
drivaerClass= com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false
关闭资源代码的重复
Map: HashMap<k,v>: key/value key:Object value:Object
Properties: key/value key:String value:String
把一个properties的文件的所有数据加载到Properties类的中
load(InputStream inStream)
String
getProperty(String key)
properties的文件要求: 文本文件
后缀名: .properties
语法格式:
key1=value1
key2=value2
...
#表示注释
properties配置文件存放的目录: src目录
<span style="background-color:#dadada"><span style="color:#aa5500">#驱动类全限定名</span> <span style="color:#0000ff">driverClass </span>=<span style="color:#009900"> com.mysql.jdbc.Driver</span> <span style="color:#aa5500">#jdbc的url</span> <span style="color:#0000ff">url </span>=<span style="color:#009900"> jdbc</span>:<span style="color:#009900">mysql</span>:<span style="color:#009900">//localhost</span>:<span style="color:#009900">3306/mytest?useUnicode</span>=<span style="color:#009900">true&characterEncoding</span>=<span style="color:#009900">utf8&useSSL</span>=<span style="color:#009900">false</span> <span style="color:#aa5500">#用户名</span> <span style="color:#0000ff">username </span>=<span style="color:#009900"> root</span> <span style="color:#aa5500">#密码</span> <span style="color:#0000ff">password </span>=<span style="color:#009900"> 123</span></span>