准备:
-
用的是java8
-
导入mysql-connector-java-8.0.12.jar包
-
右键jar包找到Add as Library...
-
点击Add as Library...即可
DriverManager
-
注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
-
获取数据库连接
Connection conn = DriverManager.getConnection(url, username, password);
-
参数
-
url:连接路径 语法:jdb:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2..
-
示例:jdbc:mysql://127.0.0.1:3306/db1
-
细节:
-
如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
-
配置userSSL=false参数,禁用安全连接方式,解决警告提示
-
有些需要关闭SSL和调时区
String url = "jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC";
-
-
user:用户名
String username = "用户名";
-
password:密码
String password = "密码";
-
Connection
-
获取执行SQL的对象
-
普通执行SQL对象
Statement createStatement()
-
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
-
执行存储过程的对象
CallableStatement prepareCall(sql)
-
-
事物管理
-
MySQL事物管理
开启事物:BEGIN;/START TRANSACTION; 提交事物:COMMIT; 回滚事物:ROLLBACK; MySQL默认自动提交事务
-
JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务 提交事务:commit() 回滚事务:rollback()
-
Statement作用:
-
执行SQL语句
int executeUpdate(sql):执行DML、DDL语句 返回值:(1)DML语句影响的行数(2)DDl语句执行后,执行成功也可能返回0 ResultSet executeQuery(sql):执行DQL语句 返回值:ResultSet结果集对象
完整代码借鉴
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "update db1 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();
数据库
ResultSet
-
封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
-
获取查询结果
Boolean next():(1)将光标从当前位置向前移动一行 (2)判断前行是否为有效行 返回值: true:有效行,当前行有数据 false:无效行,当前行没有数据
xxx getXxx(参数):获取数据 xxx:数据类型;如:int getInt(参数);String getString(参数) 参数: int:列的编号,从1开始 String:列的名称
-
使用步骤
-
游标向下移动一行,并判断改行是否有数据:next()
-
获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾 while(rs.next()){ //获取数据 rs.getXxx(参数); }
-
完整代码
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "select * from account";
//4.获取执行sql的对象Statement
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//创建集合
List<Account> list = new ArrayList<>();
//6.处理结果,遍历rs中的所有数据
//6.1光标向下移动一行,并且判断当前行师傅有数据
while (rs.next()){
Account account = new Account();
//获取数据
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(list);
//7.释放资源
rs.close();
stmt.close();
conn.close();
PreparedStatement
-
作用:预编译SQL语句并执行:预防SQL注入问题
-
获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代 String sql = "select * from user where username = ? and password = ?"; //通过Connection对象获取,并传入对应的sql的语句 PreparedStatement pstmt = conn.prepareStatement(sql);
-
设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值 Xxx:数据类型;如setInt(参数1,参数2) 参数: 参数1:?的位置编号,从1开始 参数2:?的值
-
执行SQL
executeUpdate();/executeQuery();:
-
PreparedStatement预编译功能开启:useServerPrepStmts=true
-
配置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
-
PreparedStatement原理:
-
在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译
-
执行时就不用再进行这些步骤了,速度更快
-
如果sql模板一样,则只需要进行一次检查、编译。
-
数据库连接池实现
-
标准接口:DataSource
-
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
-
功能:获取连接
Connection getConnection()
-
-
常见的数据库连接池:
-
DBCP
-
C3PO
-
Druid (常用!!!)
-
Driud
-
导入jar包druid-1.1.12.jar
-
定义配置文件
-
加载配置文件
//3.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("druid.properties的路径")); //查找路径 System.out.println(System.getProperty("user.dir"));
-
获取数据库连接池对象
//4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
-
获取连接
//5.获取数据库连接 Connection Connection connection = dataSource.getConnection();