文章目录
概述
JDBC
JDBC 访问数据库步骤
- 加载一个Driver驱动
- 创建数据库连接
- 创建Sql命令发送器Statement
- 通过Statement发送Sql命令并得到结果
- 处理结果
- 关闭数据库资源
- ResultSet
- Statement
- Connection
jdbc 常用接口
1. Statement 接口
用于执行静态SQl 语句并返回它所生成的结果的对象
三种 Statement 类
- Statement : 用于发送简单的Sql 语句
- PreparedStatement 可以发送包含参数的语句,比上一个效率更好,而且可以防止SQL注入,
- CallableStatement : 继承则PreparedStatement ,用于调用存储过程
- 优先使用PreparedStatement 可以避免Sql 注入风险
常用的 Statement
- execute 运行语句,返回是否有结果集
- eecuteQuery 运行select 语句,返回ResultSet 结果集
- executeUpdate 运行inset/update/delete操作,返回更新的行数
事务管理
-
在JDBC 中,事务操作 是自动提交的
-
系统自动 调用 commit ,否则调用rollback 回滚
-
可以改成手动提交,调用 setAutoCommit(False)来禁止自动提交
时间类型
1. java.util.Date
- 子类 : java.sql.Date 表示年月日
- 子类 : java.sql.Time 表示时分秒
- 子类 : java.sql.TimeStmp 表示年月日时分秒
日期比较处理
- 插入随机日期
- 取出指定日期范围的记录
文本存储方式
CLOB
- 用来存储大量的文本数据
- 大字段有些特殊,不同的数据库处理方式不一样,大字段的操作常常是以流的方式来处理的,
mysql 中的相关类型
- TINYTEXT
- TEXT[(M)]
- MEDIUMTEXT
- LONGTEXT
- 上面四种依次变大容量
BLOB
- 二进制大对象的使用
- 大字段数据通常是以流的形式,,而非一般的字段,一次即可读出数据
Mysql 中相关类型
- TINYTEXT
- TEXT[(M)]
- MEDIUMTEXT
- LONGTEXT
- 上面四种依次变大容量
工具类总结
第一种
package com.pratice.jdbc;
/**
* @version : 1.0
* @auther : Firewine
* @Program Name: <br>
* @Create : 2018-09-29-21:30
*/
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 操作JDBC的工具类,其中分装一些工具方法
*
*/
public class JDBCTools {
public static void release(ResultSet rs, Statement statement, Connection conn){
if (rs != null){
try{
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (statement != null){
try{
statement.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn != null){
try{
//也只是返回连接池中,不是真的关闭了
conn.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
/**
* 关闭statement和connection 的方法
* @param statement
* @param conn
*/
public static void release(Statement statement,Connection conn){
if (statement != null){
try{
statement.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn != null){
try{
conn.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
/**
* 1.获取连接的方法
* 通过读取配置文件从数据库服务器获取一个连接
* @return
* @throws Exception
*/
private static DataSource dataSource = null;
//数据库连接池只被初始化一次。
static {
dataSource = new ComboPooledDataSource("helloc3p0");
}
public static Connection getConnection()throws Exception{
return dataSource.getConnection();
}
// public static Connection getConnection()throws Exception{
// //1.准备连接数据库的4个字符串
// //2.获取jdbc.properties对应的输入流
// Properties ppop = new Properties();
//
// //3.加载对应的输入流
// InputStream in =
// JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
//
// //4.具体决定user。password的等4个个字符串
// ppop.load(in);
// //3.加载数据库驱动程序(对应的Driver实现类中有注册驱动的静态代码块)
// String user = ppop.getProperty("user");
// String password = ppop.getProperty("password");
// String jdbcUrl = ppop.getProperty("jdbcUrl");
// String driver = ppop.getProperty("driver");
//
// Class.forName(driver);
// //4.通过DriverManager 的GetConnection方法获取数据库连接
// return DriverManager.getConnection(jdbcUrl,user,password);
// }
}
第二种方法
package sxt.study.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
static Properties pros = null; //可以帮助读取和处理资源文件中的信息
static { //加载JDBCUtil类的时候调用
pros = new Properties();
try {
pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getMysqlConn(){
try {
Class.forName(pros.getProperty("mysqlDriver"));
return DriverManager.getConnection(pros.getProperty("mysqlURL"),
pros.getProperty("mysqlUser"),pros.getProperty("mysqlPwd"));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Connection getOracleConn(){
try {
Class.forName(pros.getProperty("oracleDriver"));
return DriverManager.getConnection(pros.getProperty("oracleURL"),
pros.getProperty("oracleUser"),pros.getProperty("oraclePwd"));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void close(ResultSet rs,Statement ps,Connection conn){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement ps,Connection conn){
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn){
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
C3P0 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="helloc3p0">
<!-- 指定连接数据源的基本属性 -->
<property name="user">root</property>
<property name="password">pwd</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///runoob?useSSL=true</property>
<!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">5</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">10</property>
<!-- C3P0 数据库连接池可以维护的 Statement 的个数 -->
<property name="maxStatements">20</property>
<!-- 每个连接同时可以使用的 Statement 对象的个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>