1.JDBC简介
*JDBC(Java DataBase Connectivity)就是使用java语言操作关系型数据库的一套API
*JDBC本质:(可以使用同一套代码,操作不同的关系型数据库)
*官方定义的一套操作所有关系型数据库的规则,即接口
*各个数据厂商去实现这套接口,提供数据库驱动jar包
*我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类
1.用java写jdbc(快速入门)
public class JDBCDemo {
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/db1";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql = "update account set money = 2000 where id = 1";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//返回受影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
}
}
2.JDBC API详解
1.DriverManager
*驱动管理类
*作用:1.注册驱动 2.获取数据库连接
2.Connection
1.获取执行SQL的对象
*普通执行SQL对象
Statement createStatement()
*预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
*执行存储过程的对象
CallableStatement prepareCall(sql)
2.事务管理
*MySQL 事务管理
开启事务:BEGIN;/ START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
*JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolent autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
3.Statement
*作用:执行SQL语句
*执行SQL语句
int executeUpdate(sql):执行DML、DDL语句
*返回值:(1)DML语句影响的行数 (2)DDL语句执行后,执行成功也可能返回0
ResultSet: executeQuery(sql):执行DQL语句
*返回值:ResultSet结果集对象
//1.注册驱动(可不写)
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接:如果连接的是本机Mysql并且端口是默认的3306可以简化书写
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql = "update account set money = 3000 where id = 1";//DML语句
"create database db2";//DDL语句
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//执行完DML语句,受影响的行数
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
4.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.获取连接
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//2.定义sql
String sql = "select * from account";
//3.获取statement对象
Statement stmt = conn.createStatement();
//4.执行sql
ResultSet rs = stmt.executeQuery(sql);
//创建集合
List<Account> list = new ArrayList<>();
//5.处理结果,遍历rs中的所有数据
//5.1光标向下移动一行,并且判断当前行是否有数据
while(rs.next){
Account account = new Account();
//5.2获取数据 getXxx(第几列)
int id = rs.getInt(1);
String name = rs.getString(2);
double money = rs.getDouble(3);
//赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-----")
}
//6.释放资源
rs.close();
stmt.close();
conn.close();
5.PreparedStatement
*预编译SQL语句并执行:预防SQL注入问题(将铭感字符进行转移)
*SQL注入:通过操作输入来修改实现定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
public void testResultSet() throws Exception {
//2.获取连接:如果连接的是本机mysql并且端口是默认的3306可以简化书写
String url = "jbdc:mysql:///db1?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url,username,password);
//接收用户输入 用户名和密码
String name = "zhangsan";
String pwd = "123";
String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
//获取stmt对象
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//判断登录是否成功
if(rs.next()){
System.out.println("登陆成功");
}else{
System.out.println("登录失败");
}
//7.释放资源
/*rs.close();
stmt.close();
conn.close();*/
}
1.获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
2.设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
*Xxx:数据类型;如setInt(参数1,参数2)
*参数:
-参数1:?的位置编号,从1开始
-参数2:?的值
eg:
pstmt:setString(1,name);
pstmt.setString(2,pwd);
//替代问号占位符位置的值
3.执行SQL
executeUpdate();/executeQuery():不需要再传递sql
3.数据库连接池
1.简介
*数据库连接池是个容器,负责分配、管理数据库连接(Connection)
*它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
*释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
*好处:
--资源重用
--提升系统响应速度
--避免数据库连接遗漏
2.数据库连接池实现
*标准接口:DataSource
*官方提供的数据库连接池标准接口,由第三方组织实现此接口
*功能:获取连接
Connection getConnection()
*常见的数据库连接池:
*DBCP
*C3P0
*Druid
*Druid(德鲁伊)
*Druid连接池是阿里巴巴开源的数据库连接池项目,好用
//1.带入jar包
//2.定义配置文件
//3.加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
//4.获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接 Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);