黑马程序员最新版JavaWeb基础教程,Java web从入门到企业实战完整版_哔哩哔哩_bilibili
JDBC
概念:JDBC就是使用Java语言操作关系型数据库的一套API
全称:(java DataBase Connectivity)java数据库连接
JDBC本质:
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC好处:
各数据库厂商使用相同的接口,java代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1注册驱动
Class.forName("com.itheima.jdbc.JDBCDemo");
//2获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3
String sql = "update account set money = 2000 where id = 1";
//4
Statement stat = conn.createStatement();
//5
int count = stat.executeUpdate(sql);
//6
System.out.println(count);
//7
stat.close();
conn.close();
}
}
JDBC API
DriverManager
DriverManager(驱动管理类)作用:
1:注册驱动
ps:MySQL 5之后的驱动包,可以省略注册驱动的步骤。自动加载jar包中META-INF\serivces\java.sql.Driver文件中的驱动类
2:获取数据库连接
static Connection | getConnection(String url,String user,String password)
参数
1:url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数值对1&参数值2.....
示例: jdbc:mysql://127.0.0.1:3306/db1
细节:如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为jdbc:mysql://数据库名称?参数值对
配置useSSL=false参数,禁用安全连接方式,解决警告提示
2:user 用户名
3: password 密码
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo2_DriverManger {
public static void main(String[] args) throws Exception {
//1注册驱动
// Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3
String sql = "update account set money = 2000 where id = 1";
//4
Statement stat = conn.createStatement();
//5
int count = stat.executeUpdate(sql);
//6
System.out.println(count);
//7
stat.close();
conn.close();
}
}
Connection
Connection(数据库连接对象)作用:
1获取执行SQL的对象
普通执行SQL对象
Statement createStatement()
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
执行存储过程的对象
CallableStatement preparCall(sql)
2管理事物
MySQL事物管理
开启事务:BEGIN;/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):ture为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo3_Connection {
public static void main(String[] args) throws Exception {
//1注册驱动
// Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3定义sql
String sql1= "update account set money = 3000 where id = 1";
String sql2 = "update account set money = 3000 where id = 2";
//4获取执行sql的对象 Statement
Statement stat = conn.createStatement();
try {
//开启事务
conn.setAutoCommit(false);
//5执行sql
int count1 = stat.executeUpdate(sql1);
//6处理结果
System.out.println(count1);
//5执行sql
int count2 = stat.executeUpdate(sql2);
//6处理结果
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
e.printStackTrace();
}
//7释放资源
stat.close();
conn.close();
}
}
Statement
Statement作用:
1,执行SQL语句
执行SQL语句
1:
int executeUpdate(sql):执行DML,DDL语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
2:
ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet 结果集对象
package com.itheima.jdbc;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo4_Statement {
/**
* 执行DML语句
* @throw Exception
* */
@Test
public void testDML() throws SQLException{
//1注册驱动
// Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3
String sql = "update account set money = 2000 where id = 5";
//4
Statement stat = conn.createStatement();
//5
int count = stat.executeUpdate(sql);//执行完DML语句,受影响的行数
//6
// System.out.println(count);
if (count>0){
System.out.println("修改成功~");
}else {
System.out.println("修改失败~");
}
//7
stat.close();
conn.close();
}
/**
* 执行DML语句
* @throws Exception
* */
@Test
public void testDDL() throws SQLException{
//1注册驱动
// Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3
// String sql = "CREATE DATABASE db2";
String sql = "DROP DATABASE db2";
//4
Statement stat = conn.createStatement();
//5
int count = stat.executeUpdate(sql);//执行完DML语句,受影响的行数
//6
// System.out.println(count);
// if (count>0){
// System.out.println("修改成功~");
// }else {
// System.out.println("修改失败~");
// }
System.out.println(count);
//7
stat.close();
conn.close();
}
}
ResultSet
ResultSet(结果集对象)作用:
1:封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
获取查询结果
boolean next():(1)将光标从当前位置向前移动一行,(2)判断当前行是否为有效行
返回值:
ture:有效行,当前行有数据
false:无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx:数据类型;如:int getlnt(参数);String getSreing(参数)
参数:int:列的编号,从1开始
String;列的名称
package com.itheima.pojo;
public class Account {
public int id;
public String name;
public double money;
public Account() {
}
public Account(int id ,String name,double money) {
this.id = id;
this.name=name;
this.money=money;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
package com.itheima.jdbc;
import com.itheima.pojo.Account;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo5ResultSet_ {
/**
* 执行DQL语句
* @throws Exception
* */
@Test
public void testResuitSet() throws SQLException{
//1注册驱动
// Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3定义sql
//String sql="select * feom accout";
String sql="SELECT * FROM ACCOUNT";
//4获取statement对象
Statement stmt = conn.createStatement();
//5执行sql
ResultSet rs=stmt.executeQuery(sql);
// //6处理结果 遍历rs中的所有数据
// //6.1光标向下移动一行,并且判断当前是否有数据
// while (rs.next()){
// //6.2获取数据
// int id=rs.getInt(1);
// String name=rs.getString(2);
// double money=rs.getDouble(3);
//
// System.out.println(id);
// System.out.println(name);
// System.out.println(money);
// System.out.println("---------");
// }
//6处理结果 遍历rs中的所有数据
//6.1光标向下移动一行,并且判断当前是否有数据
while (rs.next()){
//6.2获取数据
int id=rs.getInt("id");
String name=rs.getString("name");
double money=rs.getDouble("money");
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("---------");
}
rs.close();
stmt.close();
conn.close();
}
/**
* 查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
* 1.定义实体类Account
* 2.查询数据,封装到Account对象中
* 3将Account对象存入ArrayList集合中
* @throws Exception
* */
@Test
public void testResuitSet2() throws SQLException{
//1注册驱动
// Class.forName("com.itheima.jdbc.JDBCDemo2_DriverManger");
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3定义sql
//String sql="select * feom accout";
String sql="SELECT * FROM ACCOUNT";
//4获取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();
//6.2获取数据
int id=rs.getInt("id");
String name=rs.getString("name");
double money=rs.getDouble("money");
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
}
System.out.println(list);
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement
PreparedStatement作用:
1,预编译SQL语句并执行:预防SQL注入问题
1获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql="select * from user where usemame =? and password = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt =conn.prepareStatement(sql);
2设置参数值
PreparedStatement对象;setXxx(参数1,参数2):给?赋值
Xxx:数据类型;如setlnt(参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
3执行SQL
executeUpdate();\executeQuery(); :不需要再传递sql
SQL注入:
SQL注入是通过操作输入来事先定义好的SQL语句,用以达到执行对服务器进行攻击的方法
package com.itheima.jdbc;
import com.itheima.pojo.Account;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo6_UserLongin {
@Test
public void testLongin() throws SQLException{
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//接收用户输入 用户名和密码
String name="zhangsan";
String pwd="'or'1'='1";
String sql="SELECT * FROM tb_user WHERE USERNAME='"+name+"'AND PASSWORD='"+pwd+"'";
//获取stmt对象
Statement stmt= conn.createStatement();
//执行sql
ResultSet re= stmt.executeQuery(sql);
//判断登录是否成功
if (re.next()){
System.out.println("登录成功~");
}else {
System.out.println("登录失败~");
}
//7释放
re.close();
stmt.close();
conn.close();
}
}
package com.itheima.jdbc;
import org.junit.Test;
import java.sql.*;
public class JDBCDemo7_PreparedStatement {
//@Test
// public void testPreparedStatement() throws SQLException{
// //2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
// String url = "jdbc:mysql:///db1?useSSL=false";
// String username = "root";
// String password = "root";
// Connection conn = DriverManager.getConnection(url, username, password);
//
// //接收用户输入 用户名和密码
// String name="zhangsan";
// String pwd="'or'1'='1";
//
// //定义sql
// String sql="SELECT * FROM tb_user WHERE USERNAME=? AND PASSWORD=?";
//
// //获取pstmt对象
// PreparedStatement pstmt= conn.prepareStatement(sql);
//
// //设置?的值
// pstmt.setString(1,name);
// pstmt.setString(2,pwd);
//
// //执行sql
// ResultSet rs= pstmt.executeQuery();
//
// //判断登录是否成功
// if (rs.next()){
// System.out.println("登录成功~");
// }else {
// System.out.println("登录失败~");
// }
// //7释放
// rs.close();
// pstmt.close();
// conn.close();
/**
* PreparedStatement 原理
* @throws Exception
*/
@Test
public void testPreparedStatement2() throws SQLException{
//2获取连接:如果连接的是本机的mysql并且端口是默认的3306 可以简化
String url = "jdbc:mysql:///db1?useSSL=false&useServerPrepPrepStmts=true";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//接收用户输入 用户名和密码
String name="zhangsan";
String pwd="'or'1'='1";
//定义sql
String sql="SELECT * FROM tb_user WHERE USERNAME=? AND PASSWORD=?";
//获取pstmt对象
PreparedStatement pstmt= conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs= pstmt.executeQuery();
//判断登录是否成功
if (rs.next()){
System.out.println("登录成功~");
}else {
System.out.println("登录失败~");
}
//7释放
rs.close();
pstmt.close();
conn.close();
}
}
数据库连接池
简介:
数据库连接池是一个容器,负责分配,管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个
释放空间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:资源重用
提升系统响应速度
避免数据库连接遗漏
标准接口:DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
功能:获取连接
Connection getConnection()
常见的数据库连接池:
DBCP
C3P0
Druid
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是java语言最好的数据库连接池之一
Driud使用步骤
1.导入jar包driud-.**.
2.定义配置文件
3.定义加载文件
4,获取数据库连接池对象
5,获取连接
package com.itheima.druid;
/*
* Druid数据库连接池演示
* */
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
// 3加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("D:/xudian/ithaima/jdbc/JDBCDemo/src/com/itheima/druid.properties"));
//4获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5.获取数据库连接池Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
// System.out.println(System.getProperty("user.dir"));
}
}
diud包下的配置文件
目录