jdbc全称java database connectivity.是java程序与数据库连接的一种机制。
jdbc的过程:
1、搭建开发环境
2、编写程序,在程序中加载数据库驱动
3、建立连接
4、创建用于向数据库发送sql语句的Statement对象
5、从代表结果集的ResultSet中取出数据
6、断开与数据库的链接,并释放相关的资源
DriverManager:驱动管理类
主要作用:
1、注册驱动
DriverManager.registerDriver(new Driver()); //会导致驱动注册两次
Class.forName("com.test.jdbc.demo1.JdbcTest1"); //实际上使用这种方式
2、获得连接
Connection getConnection(String url,String username,String password);
url的写法:jdbc:mysql://localhost:3306/jdbc
jdbc:协议
mysql:子协议
localhost:主机号
3306:端口号
注意如果为本地ip地址,则可以简写为:jdbc:mysql:///jdbc
jdbc工具类的书写
package com.test.jdbc.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/****
* JDBC的工具类
* @author lenovo
* */
public class JdbcUtils {
private static final String driverClass;
private static final String url;
private static final String username;
private static final String password;
//没有配置文件jdbc.properties时的代码
static {
driverClass = "com.mysql.jdbc.Driver";
url = "jdbc:mysql://localhost:3306/jdbctest";
username = "root";
password = "root";
}
/**
* 注册驱动的方法
**/
public static void loadDriver() throws ClassNotFoundException {
Class.forName(driverClass);
}
/***
*
*获得连接的方法
* */
public static Connection getConnection() throws Exception {
loadDriver(); //这里必须要调用上面的注册驱动方法
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
/***
*第一种资源方式释放Connection、Statement:适用于增加、删除、修改操作
*
* */
public static void ReleaseSource(Connection connection, Statement statement) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
}
/***
*第二种资源方式释放Connection、Statement、ResultSet:适用于查询操作
*
* */
public static void ReleaseSource(Connection connection, Statement statement, ResultSet resultSet) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null;
}
}
}
下面是具有了jdbc.propreties属性的代码:
package com.test.jdbc.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/****
* JDBC的工具类
* @author lenovo
* */
public class JdbcUtils {
private static final String driverClass;
private static final String url;
private static final String username;
private static final String password;
//有配置文件jdbc.properties时的代码
static {
//加载属性文件并解析
Properties props = new Properties();
//如何获得属性文件的输入流?
//通常情况下使用类的加载器的方式进行获取
InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
props.load(is);
} catch (IOException e) {
e.printStackTrace();
}
driverClass =props.getProperty("driverClass");
url =props.getProperty("url");
username =props.getProperty("username");
password =props.getProperty("password");
}
/**
* 注册驱动的方法
**/
public static void loadDriver() throws ClassNotFoundException {
Class.forName(driverClass);
}
/***
*
*获得连接的方法
* */
public static Connection getConnection() throws Exception {
loadDriver(); //这里必须要调用上面的注册驱动方法
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
/***
*第一种资源方式释放Connection、Statement:适用于增加、删除、修改操作
*
* */
public static void ReleaseSource(Connection connection, Statement statement) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
}
/***
*第二种资源方式释放Connection、Statement、ResultSet:适用于查询操作
*
* */
public static void ReleaseSource(Connection connection, Statement statement, ResultSet resultSet) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null;
}
}
}
其中jdbc.propreties文件里面的代码是:
driverClass = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/jdbctest
username = root
password = root
Statement的使用
它的使用和我们后面所说的preparedStatement的使用有点不相同,而且我们优先后面的那种方式,因为不会产生sql注入的危险。
preparedStatement的使用
@Test
/***
* 保存数据到数据库,其实就是插入操作
* */
public void demo1() {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//注册驱动和获取连接
connection = JdbcUtils.getConnection();
//创建sql语句
String sql = "insert into user values(null,?,?,?)";
//预处理sql语句
preparedStatement = connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1, "xxx");
preparedStatement.setString(2, "0000");
preparedStatement.setString(3, "boyer");
//执行sql语句
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("数据插入成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.ReleaseSource(connection, preparedStatement);
}
}
在增删改查四个操作里面,我们先来简单连接四个过程的代码:
//保存数据到数据库,其实就是插入操作
//注册驱动和获取连接
connection = JdbcUtils.getConnection();
//创建sql语句
String sql = "insert into user values(null,?,?,?)";
//预处理sql语句
preparedStatement = connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1, "xxx");
preparedStatement.setString(2, "0000");
preparedStatement.setString(3, "boyer");
//执行sql语句
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("数据插入成功");
}
//修改数据库中的数据
//注册驱动与获取连接
connection = JdbcUtils.getConnection();
//创建sql语句
String sql = "update user set username =?,password =?,name=? where uid =?";
//预处理sql语句
preparedStatement = connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1, "eee");
preparedStatement.setString(2, "555");
preparedStatement.setString(3, "lichee");
preparedStatement.setInt(4, 7);
//执行sql语句
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("数据修改成功!");
}
//删除数据库中的数据
//注册驱动与获取连接
connection =JdbcUtils.getConnection();
//创建sql语句
String sql ="delete from user where uid =?";
//预处理sql
preparedStatement =connection.prepareStatement(sql);
//设置参数
preparedStatement.setInt(1,6);
//执行sql语句
int i = preparedStatement.executeUpdate();
if(i>0){
System.out.println("数据删除成功!");
}
//查询数据库中的全部数据
//注册驱动和获取连接
connection =JdbcUtils.getConnection();
//创建sql语句
String sql = "select * from user";
//预处理sql语句
preparedStatement = connection.prepareStatement(sql);
//设置参数
//执行sql语句
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println("uid:"+resultSet.getInt("uid")+"\nusername:"+resultSet.getString("username")+"\npassword:"+resultSet.getString("password")+"\nname:"+resultSet.getString("name"));
}
//查询数据库中的一条数据
//注册驱动和获取连接
connection =JdbcUtils.getConnection();
//创建sql语句
String sql ="select * from user where uid =?";
//预处理sql语句
preparedStatement =connection.prepareStatement(sql);
//设置参数
preparedStatement.setInt(1,1);
//执行sql语句
resultSet = preparedStatement.executeQuery();
//判断结果集中的数据
while (resultSet.next()){
System.out.println("uid:"+resultSet.getInt("uid")+"\nusername:"+resultSet.getString("username")+"\npassword:"+resultSet.getString("password")+"\nname:"+resultSet.getString("name"));
}
也就是说增加,修改,删除都是使用executeUpdate函数,而且返回的是int类型的受影响的行数,然后我们就可以使用:
int i = preparedStatement.executeUpdate();
if(i>0){
System.out.println("数据删除成功!");
}
只有查询使用的是executeQuery函数,而且返回的是resultSet类型的结果集,然后使用:
resultSet = preparedStatement.executeQuery();
//判断结果集中的数据
while (resultSet.next()){
System.out.println("uid:"+resultSet.getInt("uid")+"\nusername:"+resultSet.getString("username")+"\npassword:"+resultSet.getString("password")+"\nname:"+resultSet.getString("name"));
}
连接池
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
C3P0连接池
网友评论