- 创建工程,导入驱动jar包
- 注册驱动
- 获取连接
- 定义sql
- 获取执行sql的对象
- 执行sql
- 处理结果
- 释放资源
1、DriverManager:驱动管理类
- 注册驱动
mysql5之后驱动包可省略,自动加载META包中的驱动类
- 获取数据库连接
禁用安全连接方式,解决警告提示:useSSL=false
2、Connection:数据库连接对象
- 获取执行sql的对象Statement
普通执行SQL对象
statement createStatement()
预编译sql,防止sql注入
PreparedStatement preparedStatement(sql)
执行存储过程的对象
CallableStatement prepareCall(sql)
- 管理事务
Connection接口定义了三个对应方法
开启事物
setAutoCommit
提交事务
commit()
回滚事务
rollback()
try{
//开启事物
connection.setAutoCommit(false);
//执行sql
//处理结果
//提交
connection.commit()
}catch(e){
connection.rollback();
e.print
}
mysql事物管理:
开启事物:BEGIN;/START TRANSACTION;
提交:COMMIT;
回滚:ROLLBACK;
mysql默认自动提交事务
3、Statement:执行sql语句
- 执行DML,DDL
int executeUpdate(sql)
返回影响的行数,DDL执行成功也可能返回0
- 执行DQL
ResultSet executeQuery(sql)
返回ResultSet结果集对象
4、ResultSet:封装查询结果
ResultSet statement.executeQuery(sql)
-
将光标从当前位置向前移动一行
-
判断当前行是否为有效行
boolean next()
- 获取数据
int getInt(参数) //列编号,从1开始
String getString(参数) //列名
使用
while(result.next()){
int getInt(参数);
}
结果封装对象
List<User> list = new ArrayList<>();
while(result.next()){
User user = new User();
int id = result.getInt(参数);
user.setId(id);
list.add(user);
}
5、PreparedStatement:预编译sql并执行
sql注入是通过输入来修改事先定义好的sql语句,执行代码对服务器进行攻击
预编译SQL,性能更高
防止SQL注入: 将敏感字符进行转义
使用
-
获取PrepareStatement对象
String sql = "select * from tb where id = ?"; PreparedStatement preparedStatement = connection.preparedStatement(sql);
-
设置参数
//给?复制 preparedStatement.setInt(位置,值)
-
执行sql
ResultSet resultSet = preparedStatement.executeQuery();
java代码--->sql,mysql开始检查sql语法--->编译sql为可执行函数--->执行sql--->返回结果
开启:
useServerPrepStmts=true
- 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
- 执行时就不用再进行这些步骤了,速度更快
- 如果sql模板一样,则只需要进行一次检查、编译
配置mysql执行日志:
log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow_query_log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
数据库连接池
在一个容器提前申请很多连接,分配管理连接
资源重用、提升系统响应速度、避免数据库连接遗漏
标准接口DataSource,可以获取连接
Connection getConnection()
使用
-
导入jar包
-
定义配置文件、加载配置文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://... username=root password=1234 initialSize=5 maxActive=10 maxWait=3000
Properties properties = new Properties(); properties.load(new FileInputStream("路径"));
-
获取数据库连接池对象、获取连接
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); Connection connection = dataSource.getConnection();
增删改查
查询所有:
-
创建实体类
- 类型和名称与数据库表里的字段类似
- 驼峰命名
- int默认值是0,尽量用Integer;包装类是对象,默认值是null
- get、set、toString
Connection connection = null; Statement statement = null; ResultSet resultSet = null;
// 注册驱动 Class.forName("com.mysql.cj.jdbc.Driver");
-
获取Connection
// 获取连接 String url = "jdbc:mysql://localhost:3306/practice"; String username = "root"; String password = "1234"; Connection connection = DriverManager.getConnection(url, username, password);
-
定义sql
String sql = "";
-
获取PrepareStatement对象执行 SQL
Statement statement = connection.createStatement();
PrepareStatement prepareStatement = connection.prepareStatement(sql)
-
设置参数
-
执行sql,并获取结果集
ResultSet resultSet = statement.executeQuery(sql);
-
处理结果
//创建集合 List<User> list = new ArrayList<>(); // 处理结果集 while (resultSet.next()) { //获取数据 int userId = resultSet.getInt("userid"); //根据列名获取数据 //封装对象 User user = new User(); user.setUserid(userId); //装载集合 list.add(user); System.out.println("User ID: " + userId); } System.out.println(list);
-
释放资源
resultSet.close(); statement.close(); connection.close();
添加:
-
编写sql
insert into tb(name,age) values(?,?);
-
需要除了主键id之外的所有参数
statement.setString(1,name) statement.setInt(2,age)
-
执行sql
int count = statement.executeUpdate();
-
用一个boolean封装结果
增删改没有ResultSet
sout:(count>0);
根据id修改:
-
编写sql
update tb set name=?, age=? where id = ?
-
设置参数
statement.setString(1,name); statement.setInt(2,age);
-
执行sql
int count = statement.executeUpdate();
用一个boolean封装结果
增删改没有ResultSet
sout:(count>0);
删除:
-
编写sql
delete from tb where id = ?
-
设置参数
statement.setInt(1,id);
-
执行sql
int count = statement.executeUpdate();
用一个boolean封装结果
增删改没有ResultSet
sout:(count>0);