@wuxin1994
2019-03-21T19:01:39.000000Z
字数 7078
阅读 898
数据库
JAVA
Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。它JDBC是面向关系型数据库的。
即用于执行SQL语句的JAVA API。
直接按照教程,话不多说。
MySQL安装图解
(1)在MySQL官网页面,选择对应系统的文件。如果是windows系统,选择Platform Independent对应的jar包即可。
(2)复制mysql-connector-java-8.0.15.jar包到你的\jre1.8.0_181\lib\ext文件夹下。
a.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//上面这种方法相当于注册两次驱动,因此没有必要,最好用下面这种代码:
Class.forName("com.mysql.jdbc.Driver");//deprecated
Class.forName("com.mysql.cj.jdbc.Driver");
b.建立连接
//1. 一个参数,用&隔开
DriverManager.getConnection("jdbc:mysql://localhost/database_name?user=user&password=password");
//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
conn = DriverManager.getConnection("jdbc:mysql://localhost/database_name", "user", "password");
c.创建statement
//3. 创建statement对象 ,很重要的一个类
st = conn.createStatement();
d.执行sql ,得到ResultSet
//4. 执行查询 , 得到结果集
String sql = "select * from table_name";
rs = st.executeQuery(sql);
e.遍历结果集
//5. 遍历查询每一条记录
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id="+id + "===name="+name+"==age="+age);
}
f.释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) { } // ignore
rs = null;
}
通过代码示例了解如何通过JDBC对数据库进行增删改查的任务。
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement对象
st = conn.createStatement();
// 3. 执行添加
String sql = "insert into t_stu values(null , 'wufan' , 99)";
//返回影响的行数,如果大于0表明操作成功。否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
// 3. 执行删除
String sql = "delete from t_stu where name='wufan'";
//返回影响的行数,如果大于0表明操作成功。否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
// 3. 执行返回ResultSet.
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
// 4. 遍历结果集
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + " " + age);
}
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
// 3. 执行更新
String sql = "update t_stu set age = 16 where name ='wufan'";
//返回影响的行数,如果大于0表明操作成功。否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
在JDBC中,Properties()是一种很方便的方法,不需要将url、user、password、driverClass写在代码方法中,而是写入配置文件,并通过调用配置文件实现。
1.在src声明一个配置文件XXX.properties,内容如下:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8
username=root
password=root
2.在工具类中,使用静态代码块读取属性。
private static String driverClass;
private static String url;
private static String name;
private static String password;
static{
try {
//1. 创建一个属性配置对象
Properties properties = new Properties();
InputStream is = new FileInputStream("jdbc.properties"); //对应文件位于工程根目录
//方法1:使用当前类加载器,读取src底下的资源文件。
//InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//方法2:导入输入流。
properties.load(is);
//读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
获取连接:
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
释放资源:
public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
可以发现,这种方式能降低代码维护成本,解决了数据库更换的麻烦。
DAO: Data Access Object 数据访问对象
(1).隔离业务逻辑代码和数据访问代码,位于业务逻辑和持久化数据之间,实现对持久化数据的访问。
(2).隔离不同数据库的实现。
(1).DAO接口
(2).DAO实现类
(3).实体类
(4).数据库连接和关闭工具类
(1).DAO接口
package jdbc;
public interface DAO {
void findeAll();
}
(2).DAO实现类(实体类略去)
package jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @Author: wufan
*/
public class UerDao implements DAO {
@Override
public void findeAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1. 获取连接对象
conn = JDBCUtil.getConnection();
//2. 创建statement对象
st = conn.createStatement();
String sql = "select * from user";
rs = st.executeQuery(sql);
while(rs.next()){
String phone = rs.getString("phone");
int id = rs.getInt("uid");
System.out.print(id+"\t"+phone);
System.out.println("");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
public static void main(String[] args) {
UerDao ud = new UerDao();
ud.findeAll();
}
}
(4).数据库连接和关闭工具类
package jdbc;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @Author: wufan
*/
public class JDBCUtil {
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
try {
Properties properties = new Properties();
//InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("JDBC.properties");
InputStream is = new FileInputStream("P:\\Java\\Database\\src\\JDBC.properties"); //对应文件位于工程根目录
properties.load(is);
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public static void release(Connection conn, Statement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在需要传入参数的SQL语句中,替换
Statement
对象。相比较以前的
Statemen
, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用?
占位符来替代后续要传递进来的变量。后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
String sql = "insert into table_name values(? , ? , ?)";
PrepareStatement ps = conn.prepareStatement(sql);
//给占位符赋值
//注意从左到右数过来,1 代表第一个问号, 永远从1开始。
ps.setInt(1,id);
ps.setString(2, userName);
ps.setString(3, phone);
(1)time zone错误
SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
SQLState: 01S00
VendorError: 0
这是由于数据库和系统时区差异所造成的,简单的方法是再url后面加上
serverTimezone=GMT
比如:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/database_name?"+"user=root&password=root"+"&serverTimezone=GMT");
(2) java.io.FileNotFoundException: JDBC.properties (系统找不到指定的文件。)
解决办法1:使用类加载
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("JDBC.properties");
办法2:改用全路径
InputStream is = new FileInputStream("P:\\Java\\Database\\src\\JDBC.properties");
参考链接:
1.mysql-8.0.13使用jdbc与java连接教程
2.通过JDBC进行简单的增删改查(以MySQL为例)
3.《高性能MySQL》