JDBC概念:
Java DataBase Conectivity
,Java数据库连接
驱动
。JDBC本质:
接口
。jar包
,我们需要使用哪个数据库就要再项目导入对应的jar包。JDBC好处:
public class JDBC {
public static void main(String[] args) throws Exception {
// 1. 注册驱动,此步骤在MySQL5.0版本后可省,因为在lib/META-INF/services/java.sql.Driver文件里记录了驱动的名称,会自动加载。
Class.forName("com.mysql.Driver");
// 2.获取连接
String url = "jdbc:mysql://ip地址(域名)/端口号/数据库名称[?参数键值对1&参数键值对2]";
// String url = "jdbc:mysql://ip地址(域名)/端口号/数据库名称?useSSl=false"解决控制栏警告提示
String username = "数据库账户名";
String password = "数据库密码";
Connection connection = DriverManager.getConnection(url,username,password);
// 此处可开启事务
// 3.定义sql
String sql = "update account set money = 20000 where id = 1";
// 4.获取执行sql的对象 statement
Statement statement = connection.createStatement();
// 5.执行sql
int count = statement.executeUpdate(sql);
// 6.处理结果
System.out.println(count);
// 此处可提交事务
// 7.释放资源
statement.close();
connection.close();
}
}
DriverManager(驱动管理类)作用:
Class.forName("com.mysql.Driver")
此步骤在MySQL5.0版本后可省略
,因为在lib/META-INF/services/java.sql.Driver文件里记录了驱动的名称,会自动加载。Connection connection = DriverManager.getConnection(url,username,password);
="jdbc:mysql://ip地址(域名)/端口号/数据库名称?参数键值对1&参数键值对2"
jdba:mysql:///数据库名称[?参数键值对1,参数键值对2]
jdbc:mysql://ip地址(域名)/端口号/数据库名称?useSSl=false
Connection(数据库连接对象)作用:
获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(sql)
CallableStatement prepareCall(sql)
管理事务
开启事务:BEGIN或START TRANSACTION;
提交事务:COMMIT
回滚事务:ROLLBACK
开启事务:setAutoCommit(true/false),true为自动提交,false为手动提交,即开启事务
提交事务:commit
回滚事务:rollback
开启事务
在定义sql之前
;提交事务
在处理完数据库返回的结果后
;回滚事务
在catch
中进行,用try-catch处理sql语句,若出现异常则进行相应的回滚操作。
示例:
try{
// 开启事务
connection.setAutoCommit(fale);
// 定义sql
String sql = "update account set money = 20000 where id = 1";
// 获取执行sql的对象 statement
Statement statement = connection.createStatement();
// 执行sql
int count = statement.executeUpdate(sql);
// 处理结果
System.out.println(count);
// 提交事务
connection.commit();
} catch(Exception throwables){
// 回滚事务
connection.rollback();
}
Statement作用:执行sql语句
int executeUpdate(sql)
:执行DML(对表的操作)、DDL(对数据的增删改)。
返回值: ResultSet executeQuery(sql)
:执行DQL(select查询语句)。
返回值:ResultSet结果集对象ResultSet(结果集对象)作用:
ResultSet statement.executeQuery(sql);
执行select语句,返回ResultSet对象获取查询结果:
boolean next()
: xxx getXxx(参数)
:获取数据,参数可以是具体的值,也可以是对应的字段。 我们查询出来的数据需要封装到ArrayList集合中,返回给前端,见以下案例:
需求:查询Account账户表数据,并将数据封装Account对象中,再将Account对象存入ArrayList集合。
创建Account实体类:
public class Account {
private in id;
private String name;
private double money;
public in getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(){
this.name=name;
}
public double getMoney(){
return name;
}
public void setMoney(){
this.money=money;
}
//这里只是为了查看效果
@Override
public String toString(){
return "Account{"+"id="id+",name='"+name+'\''+",money="money+'}';
}
}
JDBC,查询Account账户表数据,并将数据封装Account对象中,再将Account对象存入ArrayList集合
// 1.定义实体类Account
// 2.查询数据,封装到Account对象中
// 3.将Account对象存入ArrayList集合中
public class resultSet() {
public static void main(String[] args) throws Exception {
// 1. 注册驱动,此步骤在MySQL5.0版本后可省,因为在lib/META-INF/services/java.sql.Driver文件里记录了驱动的名称,会自动加载。
Class.forName("com.mysql.Driver");
// 2.获取连接
String url = "jdbc:mysql://ip地址(域名)/端口号/数据库名称[?参数键值对1&参数键值对2]";
// String url = "jdbc:mysql://ip地址(域名)/端口号/数据库名称?useSSl=false"解决控制栏警告提示
String username = "数据库账户名";
String password = "数据库密码";
Connection connection = DriverManager.getConnection(url,username,password);
// 3.定义sql
String sql = "select * from account";
// 4.获取执行sql的对象 statement
Statement statement = connection.createStatement();
// 5.执行sql
ResultSet res = statement.executeQuery(sql);
// 6.创建集合
List<Account> list = new ArrayList<>();
// 7.处理结果
// 光标向下移动一行,并判断当前行是否有数据
while(res.next()){
// 给每行记录创建一个Account对象
Account account = new Account();
// 获取数据
in id = res.getInt("id");
String name = res.getString("name");
double money = res.getDouble("money");
// 赋值
account.setId(id);
account.setName(name);
account.setMoney(money);
// 存入集合
list.add(account);
}
// 8.释放资源
res.close();
statement.close();
connection.close();
}
}
PreparedStatement作用:
PreparedStatement优点:
开启PreparedStatement预编译功能:在url后面加上useServerPrepStmts=true
要查看日志,需要在MySQL配置文件中配置,然后重启服务器
log-output=FILE
general-log=1
gereral_log_file="D:\mysql.log" #输出目录
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"# 慢查询日志输出目录
long_query_time=2
PreparedStatement使用:
1.获取PrepareStatement对象
// SQL语句的参数设置为?,防止SQL注入
String sql="select * from user where username=? and password=?";
// 通过Connection对象获取,并传入对应的sql语句
PrepareStatement pstmt=connection.prepareStatement(sql);
2.设置?的值
//因为姓名和密码都是String类型,所以都是getString,根据值的数据类型来选择setXxx(parameterIndex,值),parameterIndex表示给第几个值设置值。
pstmt.setString(parameterIndex,name)
pstmt.setString(parameterIndex,pwd)
3.执行SQL
// 不需要将sql作为参数传入执行
executeQuery();//查询语句时使用
executeUpdate();//更新语句时使用
PreparedStatement原理:
SQL注入
'' or '1'='1'
select * from user where username='"+name+"' and password='"+pwd+"'
这样的语句来拼接字符串,导致任何类型的值都可以被拼接成功。"select * from user where username=? and password=?"
用?代替值,在设置?的值的时候会对值进行转义。'\' or \'1\' = \'1'
,把用户非法输入的单引号进行转义,最终传入参数作为一个整体执行,从而防止 SQL 注入,而 Statement 对象不会进行此操作。好处:
DataSource
Connection getConnection()
druid.properties
driverClassName=com.mysql.jdbc.Driver
# 这里的url和JDBC连接数据库的url格式一样
url=jdbc:mysql://数据库ip
username=数据库账户
password=数据库密码
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
// 加载配置文件
Properties prop = new Properties();
// 路径不确定可以通过打印System.getProperty("user.dir")查看
prop.load(new FileInputStream("druid.properties配置文件路径"));
// 获取数据库连接池对象
// 这里可以传入不同参数创建连接池对象,使用的时候具体查看。可以先写该步骤再new相应的对象,也就是加载配置文件的步骤
DataSource dataSource = DruidDataSourceFactor.createDataSource(prop);
// 获取数据库连接connection
Connection connection = dataSource.getConnection();
System.out.println(connection);