jdbc實(shí)現(xiàn)連接和增刪改查功能
JDBC的定義
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開發(fā)人員能夠編寫數(shù)據(jù)庫(kù)應(yīng)用程序。
jdbc的基本連接
簡(jiǎn)單的說(shuō)就是加載驅(qū)動(dòng),建立連接,然后進(jìn)行查詢和刪除等語(yǔ)句的操作,在java中提供了java.sql的jar包,不過(guò)我現(xiàn)在用的是mysql的連接和實(shí)例,在這里基本在本地的服務(wù)器都是用到下面這個(gè)語(yǔ)句。
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user="root";
String password="root";
加載和建立連接,這就是基本的一個(gè)語(yǔ)法結(jié)構(gòu),在連接數(shù)據(jù)庫(kù)當(dāng)然還有其他的屬性可以設(shè)置,比如說(shuō)最大的連接數(shù)了,和如何建立連接池,都可以在配置中用到,這里我就簡(jiǎn)單的介紹如何連接,后面跟的是這個(gè)連接的字符集,防止出現(xiàn)亂碼。
簡(jiǎn)單的增刪改查
簡(jiǎn)單的增刪改查是每個(gè)開發(fā)者都會(huì)遇到的,畢竟我們整個(gè)系統(tǒng)真正的業(yè)務(wù)所在也是這幾個(gè)簡(jiǎn)單的邏輯,但是在關(guān)系的連接和耦合性下就會(huì)變成復(fù)雜百倍的系統(tǒng),所以要懂得基本的就可以窺見更大系統(tǒng)的構(gòu)建了,所以我現(xiàn)在要分析的只是基本的功能實(shí)現(xiàn)。
首先連接好數(shù)據(jù)庫(kù)之后,那就是創(chuàng)建查詢語(yǔ)句,這里用到的是statment這個(gè)關(guān)鍵詞,下面是代碼的基本實(shí)現(xiàn)。
package dbtest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DbTest {
public static void main(String[] args) {
Employee employee1 =new Employee();
employee1.setEmpno(555);
employee1.setEname("hakly");
employee1.setSal(5400);
employee1.setHiredate(new Date());
addEmployee(employee1);
List<Employee>employees=getEmployees();
for(Employee employee:employees){
System.out.println(employee);
}
Employee employee =new Employee();
employee.setEmpno(999);
employee.setEname("jack");
employee.setSal(5000);
employee.setHiredate(new Date());
addEmployee(employee);
}
public static List<Employee> getEmployees() {
ResultSet rs=null;
Connection conn=null;
Statement stat=null;
List<Employee> employees=new ArrayList<Employee>();
try{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user="root";
String password="root";
conn= DriverManager.getConnection(url,user,password);
stat=conn.createStatement();
String sql="select * from emp";
rs=stat.executeQuery(sql);
Employee employee=null;
while(rs.next()){
employee=new Employee();
employee.setEmpno(rs.getInt("empno"));
employee.setEname(rs.getString("ename"));
employee.setSal(rs.getDouble("sal"));
employee.setHiredate(rs.getDate("hiredate"));
employees.add(employee);
}
}catch(Exception e ){
e.printStackTrace();
}finally{
try {
if(conn!=null){
conn.close();
}
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return employees;
}
public static void addEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注冊(cè)驅(qū)動(dòng)程序
try {
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
// 3.創(chuàng)建執(zhí)行語(yǔ)句,發(fā)送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getEmpno() + ",'"
+ employee.getEname() + "'," + employee.getSal() + ",'" + sdf.format(employee.getHiredate()) + "')";
// 4.處理執(zhí)行結(jié)果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.關(guān)閉資源
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void updateEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注冊(cè)驅(qū)動(dòng)程序
try {
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
// 3.創(chuàng)建執(zhí)行語(yǔ)句,發(fā)送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "update emp set ename='"+employee.getEname()+"empno"+employee.getEmpno()+"sal"+employee.getSal();
// 4.處理執(zhí)行結(jié)果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.關(guān)閉資源
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
這里的代碼很繁瑣,但是沒辦法,為了更清新一點(diǎn)的去了解,這個(gè)過(guò)程是必須的,然后接下來(lái)就是進(jìn)行簡(jiǎn)單的優(yōu)化,雖然代碼還是差不多,但是感覺上會(huì)更加簡(jiǎn)潔了 ,這里就要建立一個(gè)工具類了代碼如下
package dbtest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcUtil {
static String url = "jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8";
static String user = "root";
static String password = "root";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
return DriverManager.getConnection(url, user, password);
}
public static void free(Connection conn){
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在這里,把數(shù)據(jù)庫(kù)連接和異常處理,等工作都及合成一個(gè)工具類,然后再主函數(shù)調(diào)用就可以了,這就是面向?qū)ο蟮囊粋€(gè)體現(xiàn),當(dāng)然還是會(huì)分析下關(guān)于主類的代碼,要不然就太過(guò)于空洞了,下面要分析的主類代碼如下
package com.niit.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class EmployeeDao1 {
public static void main(String[] args) throws ParseException {
List<Employee> employees=getEmployees();
for(Employee employee:employees){
System.out.println(employee);
}
/*Employee employee = new Employee();
employee.setEmpno(9999);
employee.setEname("tom");
employee.setSal(6000);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
employee.setHiredate(sdf.parse("2015-07-23"));
//addEmployee(employee);
//updateEmployee(employee);
deleteEmployee(9999);*/
}
public static List<Employee> getEmployees() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
List<Employee> employees = new ArrayList<Employee>();
// 1.注冊(cè)驅(qū)動(dòng)程序
try {
//2.獲取連接
conn=JdbcUtil.getConnection();
// 3.創(chuàng)建執(zhí)行語(yǔ)句,發(fā)送sql命令
stat = conn.createStatement();
String sql = "select * from emp";
// 4.處理執(zhí)行結(jié)果
rs = stat.executeQuery(sql);
Employee employee = null;
while (rs.next()) {
employee = new Employee();
employee.setEmpno(rs.getInt("empno"));
employee.setEname(rs.getString("ename"));
employee.setSal(rs.getDouble("sal"));
employee.setHiredate(rs.getDate("hiredate"));
employees.add(employee);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.關(guān)閉資源
JdbcUtil.free(conn);
}
return employees;
}
public static void addEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注冊(cè)驅(qū)動(dòng)程序
try {
//2.獲取連接
conn=JdbcUtil.getConnection();
// 3.創(chuàng)建執(zhí)行語(yǔ)句,發(fā)送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getEmpno() + ",'"
+ employee.getEname() + "'," + employee.getSal() + ",'" + sdf.format(employee.getHiredate()) + "')";
// 4.處理執(zhí)行結(jié)果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.關(guān)閉資源
JdbcUtil.free(conn);
}
}
public static void updateEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注冊(cè)驅(qū)動(dòng)程序
try {
//2.獲取連接
conn=JdbcUtil.getConnection();
// 3.創(chuàng)建執(zhí)行語(yǔ)句,發(fā)送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "update emp set ename='" + employee.getEname() + "',sal=" + employee.getSal() + ",hiredate='"
+ sdf.format(employee.getHiredate()) + "' where empno=" + employee.getEmpno();
// 4.處理執(zhí)行結(jié)果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.關(guān)閉資源
JdbcUtil.free(conn);
}
}
public static void deleteEmployee(int empno) {
Connection conn = null;
Statement stat = null;
// 1.注冊(cè)驅(qū)動(dòng)程序
try {
//2.獲取連接
conn=JdbcUtil.getConnection();
// 3.創(chuàng)建執(zhí)行語(yǔ)句,發(fā)送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "delete from emp where empno="+empno;
// 4.處理執(zhí)行結(jié)果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.關(guān)閉資源
JdbcUtil.free(conn);
}
}
}
這樣看上去就比較清晰和明了,不用分割開來(lái)去看代碼,只要調(diào)用到那個(gè)累才去照這個(gè)類的方法,這樣就能夠更加有利于檢查和排錯(cuò),維護(hù)的間接性的一個(gè)軟件的奮斗的目標(biāo),雖然只是簡(jiǎn)單的優(yōu)化,卻能夠減輕了我們寫代碼和維護(hù)的成本。
總結(jié)
通過(guò)本次編碼,對(duì)面向?qū)ο蟮木幊痰拈_發(fā)有更加清晰的了解,當(dāng)然對(duì)重構(gòu)和優(yōu)化的重要性有更深的了解,在這個(gè)軟件里我學(xué)會(huì)的不僅是代碼的書寫,還學(xué)會(huì)了代碼的重構(gòu)不僅需要不斷的提煉,還需要對(duì)代碼的細(xì)微的觀察。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)的二級(jí)聯(lián)動(dòng)菜單效果
這篇文章主要介紹了java實(shí)現(xiàn)的二級(jí)聯(lián)動(dòng)菜單效果,結(jié)合實(shí)例形式分析了java前臺(tái)頁(yè)面布局及與后臺(tái)交互構(gòu)造聯(lián)動(dòng)菜單的相關(guān)技巧,需要的朋友可以參考下2016-08-08
繼承JpaRepository后,找不到findOne()方法的解決
這篇文章主要介紹了繼承JpaRepository后,找不到findOne()方法的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
深度解析SpringBoot中@Async引起的循環(huán)依賴
本文主要介紹了深度解析SpringBoot中@Async引起的循環(huán)依賴,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
java應(yīng)用程序如何自定義log4j配置文件的位置
這篇文章主要介紹了java應(yīng)用程序如何自定義log4j配置文件的位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
logback的使用和logback.xml詳解(小結(jié))
Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開源日志組件,這篇文章主要介紹了logback的使用和logback.xml詳解(小結(jié)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11
SpringBoot整合MongoDB的實(shí)現(xiàn)代碼
自己本科時(shí)候一直使用的是Mysql,目前的課題組使用的是MongoDB,因此就花了一部分時(shí)間整理了一下,實(shí)現(xiàn)springboot與MongoDB的整合,并且實(shí)現(xiàn)基本的增刪改查操作,從頭到尾給出一個(gè)完整的案例。2021-05-05
Java多線程實(shí)現(xiàn)之Callable詳解
這篇文章主要介紹了Java多線程實(shí)現(xiàn)之Callable詳解,Callable是一個(gè)接口,用于實(shí)現(xiàn)多線程,與實(shí)現(xiàn)Runnable類似,但是功能更強(qiáng)大,通過(guò)實(shí)現(xiàn)Callable接口,我們需要重寫call()方法,該方法可以在任務(wù)結(jié)束后提供一個(gè)返回值,需要的朋友可以參考下2023-08-08

