JDBC(第1天)

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));
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章