目录
JDBC简述
JDBC概念:
- JDBC就是使用Java语言操作关系型数据库的一套API
- 全称:(Java Database Connectify)Java数据库连接
JDBC本质:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则(接口)
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们用这套接口(JDBC)编程,真正执行的是驱动jar包中的实现类
JDBC的好处:
- 各数据库厂商使用相同的接口,Java代码不需要针对不同十几块分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
步骤:
0.创建工程,导入驱动jar包
mysql-connector-java-5.1.48 jar
1.注册驱动
Class.ForName(“com.mysql.jdbc.Driver”);
2.获取连接
Connection coon = DriverManger.getConnection(url,username,password);
3.定义SQL语句
String sql = “update…”
4.获取执行SQL对象
Statement stmt = coon.createStatement();
5.执行SQL
stmt.executeUpdate(sql);
6.处理返回结果
7.释放资源
DriverManger:驱动管理类
注册驱动:Class.forName("com.mysql.cj.jdbc.Driver");
Driver底层就是通过DriveManger实现的:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
MySQL 5之后的驱动包,可以省略注册驱动的步骤
- 获取连接:Connection coon = DriverManger.getConnection(url,username,password);
- 参数:
1.url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
实例:jdbc:mysql://localhost:3306/db1
如果连接的是本机的mysql服务器,并且默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置useSSL = false参数,禁用安全连接方式,解决警告提示
2.user:用户名
3.password:密码
Connection:数据库连接对象
- 获取执行SQL的对象
- 普通执行SQL对象:Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PrepareStatement PrepareStatement(sql)- 执行存储过程的对象:CallableStatement prepareCall(sql)
- 事务管理(Connection接口中定义了3个对应的方法)
- 开启事务:setAutoCommit(Boolean autoCommit):true为自动提交事务;false为手动提交事务,即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
在Java里通过异常机制来回滚事务:
try {
//开启事务
con.setAutoCommit(false);
//执行SQL
int count = stmt.executeUpdate(sql);//受影响的行数
//处理结果
System.out.println(count);
//提交事务
coon.commit();
} catch (Exception e) {
//回滚事务
coon.rollback();
e.printStackTrace();
}
Statement:执行SQL语句
int excuteUpdate(sql):执行DML、DDL语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
例://DML String sql = "update account set money = 3000 where id = 1"//定义SQL Statement stmt = coon.createStatement();//获取S执行SQL的对象 Statement int count = stmt.excuteUpdate(sql) if(count)>0{ // System.out.println("修改成功"); } else { System.out.println("修改失败"); } //DDL String sql = "create database db2" Statement stmt = coon.createStatement(); int count = stml.excuteUpdate(sql);
ResultSet excuteQuery(sql):执行DQL语句
返回值:ResultSet结果集对象
ResultSet(结果集对象)
1.封装了DQL查询结果
- ResultSet stmt.excuteQuery(sql):执行DQL语句,返回ResultSet对象
2.获取查询结果
- Boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行
返回值:
- true:有效行,当前行有数据
- false:无效行,当前行没有数据
- XXX getXxx(参数):获取数据
xxx:数据类型;如:int getInt(参数);String getString(参数)
参数:
- int:列的编号,从1开始
- String:列的名称
使用步骤:
- 游标向下移动一行,并判断该行是否有数据:next()
- 获取数据:getXxx(参数)
//循环判断游标是否是最后一行
while(rs.next()){
//获取数据
rs.getXxx(参数);
}
PreparedStatement:预编译并执行SQL语句
PrepareStatement:预编译SQL语句并执行:预防SQL注入问题
①获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的SQL语句
PreparedStatement pstmt = coon.prepareStatement(sql);
②设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
XXX:数据类型;如setInt(参数1,参数2)
参数:
- 参数1:?的位置编号,从1开始
- 参数2:?的值
③执行SQL
excuteUpdate();/excuteQuery();:不需要再传递SQL
//完整样例
Connection conn = DriverManger.getConnection(url,username,password);
String name = "zhangsan";
String pwd = "123";
String sql = "select * from student where username = ? and password = ?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行SQL
ResultSet rs = stmt.excuteQuery(sql);
//判断是否登录成功
if(re.next()){
System.out.println("登录成功");
}else{
System.out.println("登录成功");
}
- SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
PreparedStatement原理
PreparedStatement好处:
- 预编译SQL,性能更高(需要手动开启)
开启预编译:useServerPrepStmts=true
(写在url的参数里)
String url = "jdbc:mysql:///db1 ? useSSL=false & useServerPrepStmts=true"
- 防止SQL注入:将敏感字符进行转义
PreparedStatement原理:
- 在获取PreparedStatement对象时,将SQL语句发送给mysql服务器进行检查,编译(这些语句很耗时)
- 执行时就不用再进行这些步骤了,速度更快
- 如果sql模板一样,则只需要进行一次检查和编译,性能更高
数据库连接池
数据库连接池简介:
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
- 好处
- 资源重用
- 提示系统响应速度
- 避免数据库连接遗漏
数据库连接池实现:
- 标准接口:DataSource
- 官方(sun)提供的数据库连接池标准接口,由第三方组织实现此接口
- 功能:获取连接
Connection getConnection()
- 常见的数据库连接池:
- DBCP
- C3P0
- Druid
- Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
Druid数据库连接池步骤:
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
在src下新建druid.properties文件,键入以下内容:
> driverClassName=com.mysql.jdbc.Driver
> url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
> username=root
> password=1234
> #初始化连接数量
> initialsize=5
> #最大连接数
> maxActive=10
> #最大等待时间
> maxWait=3000
- 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
- 获取连接池对象
DataSource datasource = DruidDataSourceFactory.createDataSource(prop);
- 获取数据库连接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);