1. JDBC是什麼?
Java數據庫連接,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。JDBC也是Sun Microsystems的商標。我們通常說的JDBC是面向關係型數據庫的。
2.使用JDBC完成增刪改查的步驟是什麼?
1.加載驅動
Class.forName(driver);
2.創建連接
connection = DriverManager.getConnection(url, username, password);
3發出SQL指令: 發送及執行
StateMent或者PreparedStament
4.對於增刪改操作,需要更新
對於查詢操作,需要查詢更新
5.釋放數據庫的連接資源
三. Statement和PreparedStament的區別及注意點總結。
1.PreparedStatement是預編譯的,對於批量處理可以大大提高效率.也叫JDBC存儲過程。
preparedstatement是預編譯的,preparedstatement支持批處理。
2.使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。PreparedStatement對象的開銷比Statement大,對於一次性操作並不會帶來額外的好處。statement每次執行sql語句,相關數據庫都要執行sql語句的編譯。
4.數據的增刪改查、驗證重名,批量操作
數據庫文件
-- 刪除用戶表
TRUNCATE TABLE user;
DROP TABLE USER;
-- 創建用戶表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
PASSWORD VARCHAR(12),
email VARCHAR(10)
);
-- 給用戶表添加數據
INSERT INTO USER(NAME,PASSWORD,email) VALUES
('張三','123','1133'),
('小李','456','1130'),
('小王','789','1131'),
('旺財','234','1132')
-- 刪除用戶表的某行數據
DELETE FROM USER WHERE id=9999;
-- 修改用戶表的數據
UPDATE USER SET NAME='張三' WHERE id=1;
-- 查看用戶表
SELECT * FROM USER;
-- 查詢詳細的條目
SELECT COUNT(*) FROM user;
1.實體層entity
package entity;
/*
* 實體類
*/
public class User {
private int id;
private String name;
private String password;
private String email;
public User() {
super();
}
public User(int id, String name, String password, String email) {
super();
this.id = id;
this.name = name;
this.password = password;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + "]";
}
}
2.dao層
BaseDao
package dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
* 基類
*/
public class BaseDao {
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3307/testbase1?useUnicode=true&characterEncoding=utf8";
private static String username = "root";
private static String password = "Weak";
// 連接
protected Connection connection = null;
// 預處理
protected PreparedStatement pst;
// 結果集
protected ResultSet rst;
/*
* 1連接方法
*/
public Connection getConnection() {
// 1.加載驅動
try {
Class.forName(driver);
// 2.創建連接
connection = DriverManager.getConnection(url, username, password);
System.out.println("數據庫連接成功!");
} catch (Exception e) {
System.out.println("數據庫連接成功!");
e.printStackTrace();
}
return connection;
}
public static void main(String[] args) {
BaseDao baseDao = new BaseDao();
baseDao.getConnection();
}
/*
* 2數據庫關閉連接
*/
public void close() {
if (rst != null) {
try {
rst.close();
rst = null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (pst != null) {
try {
pst.close();
pst = null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
connection = null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 3.查詢操作 查詢1:輸入查詢語句,要求返回結果集 select * from user where name = ? and email = ?
*
* @param sql
* @param param
* @return
*/
public ResultSet query1(String sql, Object... param) {
System.out.println("處理中:查詢操作1" + sql);
System.out.println("查詢data" + Arrays.toString(param));
// 創建連接
connection = getConnection();
try {
// 進行預處理
pst = connection.prepareStatement(sql);
// 執行之前給佔位符
if (param != null) {
for (int i = 0; i < param.length; i++) {
pst.setObject(i + 1, param[i]);
}
}
// 執行查詢操作
rst = pst.executeQuery();
return rst;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/*
* 3.查詢操作 查詢2:把ResultSet轉換爲List<T>
*/
public <T> List<T> query2(Class<T> cls,String sql,Object...param){
System.out.println("處理中:查詢操作2(泛型 查找)"+sql);
System.out.println("查詢data" + Arrays.toString(param));
rst = query1(sql, param);
List<T> list = new ArrayList<T>();
try {
while(rst.next()) {
// 獲取元數據
ResultSetMetaData rsmd = rst.getMetaData();
// 獲取表的列數
int col = rsmd.getColumnCount();
// 實例化對象
T obj = cls.newInstance();
//遍歷類來獲取屬性名並封裝到對應的方法裏
for (int i = 0; i < col; i++) {
String colsname = rsmd.getColumnLabel(i + 1);// 列名
Object val = rst.getObject(colsname);// 參數:取數據表裏面列對應的值
//測試語句
// System.out.println(colsname + "=====" + val.getClass()+"\t"+val);
// 獲取方法名
String methodName = "set" + colsname.substring(0, 1).toUpperCase() + colsname.substring(1);
//獲取屬性類型
Field field;
try {
//通過列名首先拿到屬性
field = obj.getClass().getDeclaredField(colsname);
//通過屬性拿到屬性類型
Class<?> t = field.getType();
// 反射出對象的方法
Method method = obj.getClass().getDeclaredMethod(methodName, t);
// 執行方法
method.invoke(obj, val);
} catch (Exception e) {
e.printStackTrace();
}
//通過屬性拿到屬性類型
}
list.add(obj);
}
return list;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
close();
}
return null;
}
/**
* 4.更新操作
*
*
* @param sql
* @param param
* @return
*/
public int update(String sql, Object... param) {
System.out.println(" 處理中:更新操作" + sql);
System.out.println("更新data" + Arrays.toString(param));
// 創建連接
connection = getConnection();
try {
// 進行預處理
pst = connection.prepareStatement(sql);
// 執行之前給佔位符
if (param != null) {
for (int i = 0; i < param.length; i++) {
pst.setObject(i + 1, param[i]);
}
}
// 執行更新操作
int rows = pst.executeUpdate();
return rows;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
}
UserDao
package dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import entity.User;
public class UserDao extends BaseDao {
/*
* 1.增加更新
*/
public boolean addUpdate(User user) {
String sql = "insert into user(name,password,email)values(?,?,?)";
Object[] param = { user.getName(), user.getPassword(), user.getEmail() };
return update(sql, param) > 0;
}
/*
* 2.刪除更新
*/
public boolean delete(User user) {
String sql = "delete from user where id=?";
// 更新處理
return super.update(sql, user.getId()) > 0;
}
/*
* 3.修改操作
*/
public boolean modify(User user) {
String sql = "update user set name=? where id=?";
Object[] param = { user.getName(), user.getId() };
// 更新處理
return update(sql, param) > 0;
}
// 4.查詢操作1 ResultSet --> List
public List<User> chaxun1() {
String sql = "select id,name,password,email from user";
rst = query1(sql);
// ResuletSet --> List<School>
List<User> list = new ArrayList<User>();
try {
while (rst.next()) {
int id = rst.getInt("id");
String name = rst.getString("name");
String password = rst.getString("password");
String email = rst.getString("email");
// 創建對象,並賦值
User user = new User();
user.setId(id);
user.setName(name);
user.setPassword(password);
user.setEmail(email);
// 封裝對象
list.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close();
}
return list;
}
// 4.查詢操作2
public List<User> chaxun2() {
String sql = "select id,name,password,email from user";
return super.query2(User.class, sql);
}
// 5.登陸驗證
public boolean login(String name, String password) {
String sql = "select id,name,password,email from user where name=? and password=?";
List<User> list = super.query2(User.class, sql, name, password);
if (list.size() < 1) {
System.out.println("抱歉,改用戶不正確!");
return false;
} else {
System.out.println("用戶登陸成功!");
return true;
}
}
// 6.檢查重名
public boolean namecopy(String name) {
String sql = "select id,name,password,email from user where name=?";
List<User> list = super.query2(User.class, sql, name);
if (list.size() <= 1) {
System.out.println("用戶名沒有重名");
return true;
} else {
System.out.println("用戶名有重名");
return false;
}
}
// 7.批處理插入10000條記錄
public int[] addBatch(List<User> userlist) {
for (User user : userlist) {
System.out.println("id:" + user.getId());
}
String sql = "insert into user(id)values(?)";
// 創建連接
connection = getConnection();
try {
// 進行預處理
pst = connection.prepareStatement(sql);
// 執行之前給佔位符
for (User user : userlist) {
//
pst.setInt(1, user.getId());
pst.addBatch();
}
// 執行查詢操作
int[] rows = pst.executeBatch();
return rows;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close();
}
return null;
}
// 8.批處理插入10000條記錄
public int[] deleteBatch() {
String sql = "delete from user where id=?";
// 創建連接
connection = getConnection();
try {
// 進行預處理
pst = connection.prepareStatement(sql);
// 執行之前給佔位符
for (int i = 6; i <= 10000; i++) {
//
pst.setInt(1, i);
pst.addBatch();
}
// 執行查詢操作
int[] rows = pst.executeBatch();
return rows;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close();
}
return null;
}
}
3.應用層services
package services;
import java.util.Arrays;
import dao.UserDao;
public class Test {
public static void main(String[] args) {
UserDao userdao = new UserDao();
// User user = new User();
//增加操作
// user.setName("趙六");
// user.setPassword("369");
// user.setEmail("1135");
// userdao.addUpdate(user);
//刪除操作
// user.setId(2);
// userdao.delete(user);
//修改操作
// user.setId(3);
// user.setName("王五");
// userdao.modify(user);
//查詢操作
// List<User> userlist = userdao.chaxun();
// for (User use : userlist) {
// System.out.println("id:"+use.getId()+"\tname:"+use.getName()+"\tpassword:"+"\temail"+use.getEmail());
// }
//lambdo寫法
// userdao.chaxun1().forEach(System.out::println);
//泛型查找
// userdao.chaxun2().forEach(System.out::println);
//登陸驗證
// userdao.login("張三", "123");
//重名檢查
// userdao.namecopy("張三");
//批量插入
// List<User> userlist = new ArrayList<User>();
// User user1 = null;
// for (int i = 6; i < 10000; i++) {
// user1 = new User();
// user1.setId(i);
// userlist.add(user1);
// }
// int rows[] = userdao.addBatch(userlist);
// System.out.println("影響的行數數組:"+Arrays.toString(rows));
//批量刪除
int rows[] = userdao.deleteBatch();
System.out.println("影響的行數數組:"+Arrays.toString(rows));
}
}