1 什么是jdbc?
JDBC(java database connectivity )是Java语言连接操作关系型数据库的一套解决方案,屏蔽了底层各数据库不同的差异。 具体是通过sun公司定义的统一的一套API【标准接口】来实现解决差异, 具体实现是各大数据库厂商来实现的,即各个不同的驱动jar包。
java----jdbc统一接口----各关系型数据库
2JDBC重要的API
2.1 DriverManager(驱动管理)
注册驱动; DriverManager.registerManager()
获得数据库连接;DriverManager.getConnection();
2.2 Connection(连接)
获取执行sql语句的对象
-- Connection.createStatement() 获得普通执行sql对象Statement
-- Connection.prepareStatement(sql) 预编译sql的sql执行对象PreparedStatement,防止sql注入
-- Connection.prepareCall(sql) 执行存储过程的对象CallableStatement
管理事务
-- Connection.setAutoCommit(boolean autoCommit) autoCommit=true时 事务自动提交,false时手动开启事务
-- Connection.commit() 提交事务
-- Connection.rollback() 回滚事务
2.3 ResultSet (DQL语句执行后封装的结果集对象)
next() 判断是否存在有效数据行
getXXX(String ColumnName) 根据列名获得数据
getXXX(int columnIndex) 根据列索引获得数据 索引从1开始
2.4 PreparedStatement (预编译sql执行对象)
预编译并执行sql
使用?占位符去替换sql中的变量,防止sql注入
设置变量setXXX(i,j) XXX为变量类型 i为出现?的位置 j为?的值
PreparedStatement的好处
预编译sql语句,性能更高【如果使用的模板一样,则只需要检查一次】
对敏感sql语句进行转义处理,防止sql注入问题
3 代码示例
连接Mysql8的数据库,需要的引入的包mysql-connector-java-8.0.28.jar
操作的数据表如下
public class JDBCDemo1 {
public static void main(String[] args) throws Exception {
//获得MySQL的驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//设置连接数据库的信息
//连接本地的face数据库
String connectUrl="jdbc:mysql://localhost:3306/face?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT";
//账号
String user="root";
//连接密码
String password="Liuyifei@@";
//获得Connection
Connection connection= DriverManager.getConnection(connectUrl,user,password);
//查询操作
//执行sql语句
String sql="select * from ip ";
//获得执行sql的statement对象
Statement statement = connection.createStatement();
//执行sql语句获得结果集
ResultSet resultSet = statement.executeQuery(sql);
//遍历结果集
while (resultSet.next()){
//打印输出IP与门岗信息
System.out.println(resultSet.getString("ip")+"=="+resultSet.getString("position"));
}
//变量使用占位符给替换,防止sql注入问题
String sql="update ip set is_delete='N' where id=?";
//预编译执行sql对象,防止sql注入
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给变量赋值 SetXXX(i,j)
//XXX为变量的类型
//i为变量出现的位置
//j为变量的值
preparedStatement.setInt(1,4);
//执行sql语句
boolean execute = preparedStatement.execute();
if(execute){
System.out.println("success!");
}else{
System.out.println("failed!");
}
//关闭连接
statement.close();
connection.close();
}
}
4 数据库连接池
由JDBCDemo1 可知,在执行sql语句之前需要从驱动那获得数据库连接,执行完之后需要手动地关闭数据库连接。当服务中出现多数据操作时,频繁的开闭数据库连接将会大大得影响服务的性能。因此需要对数据库的连接进行额外的处理。
数据库连接池是一个容器,用于管理、分配数据库的连接;
它允许现有的程序重复使用同一个连接,而不是重复创建一个新的连接;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连 接遗漏
使用连接池的好处:资源重用,提升系统响应速度,避免数据库连接遗漏
Sun公司提供了一个标准接口DataSource 来定义数据库连接池的基本功能,具体实现由第三方组织来实现这个标准接口.
常见的数据库连接池实现有
DBCP
C3P0
DRUID【阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一】
/**
* 数据库连接池 DRUID连接池
* 使用DRUID连接池后,避免原生的DriverManager驱动类来获取数据库连接
* 使用的jar包druid-1.1.16
* 定义配置文件
* 加载配置文件
* 获取数据库连接池对象
* 获得连接
*/
public class ConnectionPool {
public static void main(String[] args) throws Exception {
Properties prop=new Properties();
prop.load(new FileInputStream("src/properties/DruidConnection.Properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
Connection connection = dataSource.getConnection();
System.out.println(connection);
//E:\PROJECT\JAVA\Study\JdbcStudy
System.out.println(System.getProperty("user.dir"));
//执行sql语句
PreparedStatement statement = connection.prepareStatement("insert into uuser(username,password,root,is_delete)values(?,?,?,?)");
statement.setString(1,"lyf");
statement.setString(2,"lyf");
statement.setString(3,"admin");
statement.setString(4,"N");
statement.execute();
}
}
项目结构如下=
DruidConnection.Properties
## 数据库连接字符串
url=jdbc:mysql://XXXXX:3306/face?useSsl=false&useUnicode=true&serverTimezone=UTC
## 数据库连接账号
username= 账号
## 数据库连接密码
password= 密码
## 数据库连接驱动
classDriver=com.mysql.cj.jdbc.Driver
##初始化时建立物理连接的个数
initialSize=5
关于Druid的其他配置信息可查看官方说明 根据实际需求进行配置
Durid配置说明