JDBC
概念:
Java Database Connectivity Java 数据库连接,Java语言操作数据库
本质:使用同一套Java代码,操作所有关系型数据库。因此JDBC即定义了操作所有关系型数据库的规则(接口)。各数据库厂商实现这套接口,提供数据库驱动jar包。真正执行代码的是jar包的实现类。
步骤:
1.导入驱动jar包
2.注册驱动
3.获取数据库连接对象Connection
4.定义sql
5.获取执行sql语句的对象Statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源
/*
DriverManager:驱动管理对象
功能:
1.注册驱动:告诉程序该使用哪个数据库驱动jar包
static void registerDriver(Driver driver):注册与给定驱动程序 DriverManager
Class.forName("com.mysql.jdbc.Driver");
源码中,com.mysql.jdbc.Driver类中存在静态代码块
static {
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException E)
{
throw new RuntimeException("Can't register driver!")
}
}
2.数据库连接
static Connection getConnection(String url,String user,String password)
url:指定连接路径:
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
user:用户名
password:密码;
Connection:数据库连接对象
1.功能:
1.获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理事务:
开始事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
Statement :执行sql的对象
1.执行sql
boolean execute(String sql):可以执行任意sql
int executeUpdate(String sql):执行DML()语句,DDL语句
ResultSet executeQuery(String sql):执行DQL语句
ResultSet:结果集,封装结果
boolean next();游标向下移动一行,判断当前行是否是最后一行末尾,当游标返回false时,表示当前行末尾
使用步骤:
游标向下移动一行;
判断是否有数据;
获取数据
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接对象
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/db4","root","root");
//4.定义sql语句
String sql="update stu set name='zhang' where id=1";
//5.获取执行sql的对象
Statement statement=connection.createStatement();
//6.执行sql
int count=statement.executeUpdate(sql);
System.out.println(count);
statement.close();
connection.close();
}
}
/*
使用集合接受数据库中表
*/
public static void main(String[] args) {
List<emp>list=new JdbcDemo6().findAll();
System.out.println(list);
}
public List<emp> findAll() {
Connection connection = null;
Statement statement = null;
ResultSet resultSet=null;
List<emp> empList = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
statement = connection.createStatement();
String sql = "SELECT * FROM emp";
resultSet = statement.executeQuery(sql);
emp emps =null;
while (resultSet.next()) {
int id = resultSet.getInt("id");
String ename = resultSet.getString("ename");
int job_id = resultSet.getInt("job_id");
int mgr = resultSet.getInt("mgr");
Date joindate = resultSet.getDate("joindate");
double salary = resultSet.getDouble("salary");
double bouns = resultSet.getDouble("bonus");
int dept_id = resultSet.getInt("dept_id");
emps=new emp();
emps.setId(id);
emps.setEname(ename);
emps.setJob_id(job_id);
emps.setMgr(mgr);
emps.setJoindate(joindate);
emps.setSalary(salary);
emps.setBonus(bouns);
emps.setDept_id(dept_id);
empList.add(emps);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if(resultSet!=null)
{
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null)
{
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null)
{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return empList;
}
使用PreparedStatement对象解决sql注入问题:
sql注入:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题:如OR;
1.导入驱动jar包
2.注册驱动
3.获取数据库连接对象Connection
4.定义sql(sql的参数使用?作为占位符)
5.获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
6.给sql赋值
6.执行sql,接受返回结果,无sql参数
7.处理结果
8.释放资源
C3P0:数据库连接池技术
步骤:
1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
2.定义配置文件
路径为:c3p0.properties 或者 c3p0-config.xml文件
3.创建核心对象:数据库连接池对象 CombopooledDataSource
4.获取连接:getConnection
Druid:数据库连接池技术 阿里巴巴提供
步骤:
1.导入jar包 druid-1.0.9.jar
2.定义配置文件:
properties形式
3.获取数据库连接池对象:DruidDataSourceFactory
4.获取连接