一,JDBC(java database connecticity)java数据库连接
就是用java语言来操作关系型数据库的API
开发一个jdbc代码可以同时操作多个关系型数据库
jdbc
步骤:
1 首先导入jdbc的jar包
2 注册驱动
Class.forName("com.mysql.jdbc.Driver");
3 获取连接
Connection conn = DriverManager.getConnection(url,username,password);
4 定义SQL语句
String sql = "update 表名 ...";
5 获取执行SQL对象
Statement stmt = conn.createStatement();
6 执行SQL
stmt.executeUpdate(sql);
7 处理返回结果
8 释放资源
// 1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";//自己数据库名字密码
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
// 3 定义sql语句
String sql = "update emp set salary = 20000 where id = 1";
// 4 获取执行sql对象
Statement stmt = conn.createStatement();
// 5执行SQL 有返回值 返回整数
int count = stmt.executeUpdate(sql);
System.out.println("影响数目"+count);
//6 是否资源
stmt.close();
conn.close();
二,JDBC的一些API
1 DriverManger(驱动管理类)
1 注册驱动
2 获取数据库连接
DriverManager.getConnection(url,username,password)
url:jdbc:mysql://127.0.0.1:3306/db1
安全提示取消命令
jdbc:mysql://127.0.0.1:3306/db1?useSSL=false 加上
2 Connection
1获取执行sql对象
普通执行sql对象
Statement createStatement()
预编译sql的执行sql对象,防止sql注入
PreparedStatement prepareStatement(sql)
2管理事务
BEGIN 开启
ROLLBACK 回滚
COMMIT 提交
这里可以使用try catch语法进行包裹,如果出现异常回滚事务,成功的执行commit
3Statement作用
1 执行SQL语句
executeUpdate(sql) 执行dml ddl语句
返回dml影响的行数,ddl执行可能返回0
4 ResultSet
结果集封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql) 返回ResultSet对象
获取查询结果 Boolean next() true有效
比如表中的数据是id name salary
获取数据int GetInt(参数)
while(rs.next()){
//获取数据
int id = rs.getInt(第一列数据所在位置)//1 也可以使用字段名 "id"
String name = rs.getString(第二列数据)//2
double money = rs.getDouble(第三列数据)//3
rs.getXxx(参数);
}
过程
// 1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";
String username = "root";//自己数据库名字密码
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
// 3 定义sql语句
String sql = "select * from emp";
// 4 获取执行sql对象
Statement stmt = conn.createStatement();
// 5执行SQL 有返回值 返回整数
ResultSet rs= stmt.executeQuery(sql);
//创建集合
ArrayList<Account> list = new ArrayList<>();
while(rs.next()){
//创建对象
Account ac = new Account();
//获取数据
int id=rs.getInt("id");
String name= rs.getString("name");
String gender= rs.getString("gender");
Double salary= rs.getDouble("salary");
Date date= rs.getDate("join_date");
int dep_id=rs.getInt("dep_id");
//赋值
ac.setId(id);
ac.setName(name);
ac.setGender(gender);
ac.setDate(date);
ac.setSalary(salary);
ac.setDep_id(dep_id);
//存入集合
list.add(ac);
}
System.out.println(list);
//6 是否资源
stmt.close();
conn.close();
5 PreparedStatement
预编译sql语句并执行:预防SQL注入问题
SQL注入:通过事先定义好的SQL语句,用以达到执行代码攻击服务器的方法
select id from users where username = '"+username +"' and password = '" + password +"'" 这里的username和password都是我们存取从web表单获得的数据。下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = '123',我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。
SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。
String name = "侯旭";
String pwd= "1234";
//定义sql 使用?拼接参数
String sql = "select * from user where name=? and pwd=?"
//获取PreparedStatement对象
PreparedStatement ps= conn.PreparedStatement(sql);
//设置问号值
ps.setString(1,name);
ps.setString(2,pwd);
//执行sql
Result rs = ps.executeQuery();//执行SQL
预编译优点
1 性能更高
2 将敏感字符进行转义
- 1要开启预编译功能,需要在连接后面拼接
&useServerPrepStmts=true添加到连接后面
String url = "jdbc:mysql://127.0.0.1:3306/db1&useServerPrepStmts=true";
- 2 配置sql配置文件 在my.ini中加入
log-output=FILE
general
general_log_file=“D:\mysql.log"
slow-query-log=1
slow_query_log_file=“D:\mysql_slow.log"
long_query_time=2
- 3 重启mysql服务
三,数据库连接池
管理数据库连接的容器,负责分配,管理数据库连接
之前我们是来一个用户我们建立一个连接然后释放掉,来一个用户建立一个连接然后再释放掉
这是一个非常耗时的操作
连接池就是一个多个连接的容器,当一个用户使用完之后还得归还回来,就像银行柜台共享的多只笔,使用完归还,下一个人继续使用
好处:资源复用 提升响应速度 避免遗漏
连接池的实现 标准接口是DataScource
由第三方来实现该接口
常见数据库连接池有
- DBCP
- C3P0
- Druid
Druid是阿里巴巴开源项目 ,
Druid 使用步骤
- 导入jar包
2 定义配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=1234
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
放在src下druid.properties名的文件下
3 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
4 获取数据库连接池对象
DataScource ds = DuridDataScourceFactory.createDataScource(prop);
5 获取连接
Connection conn = ds.getConnection();
sout(conn);
网友评论