1. 程式人生 > >黑馬作業(d29)JDBCUTils工具類

黑馬作業(d29)JDBCUTils工具類

必須能獨立寫出JDBCUtils工具類,保證用JDBCUtils工具類能完成功能,不用JDBCUtils工具類工具類也能夠完成功能
1.map中有如下資料(使用者名稱=密碼)
[liuyan=123456,wangbaoqiang=123321,fangbian=abcd,miejueshitai=123abc321]
在ip為127.0.0.1資料庫名為stdb,連線資料庫的使用者名稱和密碼為:admin和123456中有一個userinfo表相關欄位為(id,username,password)
(1)將map中的手機號碼取出來列印到控制檯上
* 直接使用map集合的keySet()方法獲取所有的key組成的Set集合,並遍歷
(2)判斷map中所有的使用者名稱在userinfo表中是否存在存在則輸出"該使用者已註冊",如果不存在將該使用者名稱及對應的密碼存入到userinfo表中
    (map中的資料不需要修改)
    * 連線到資料庫
    * 建立表
    drop database stdb;
    create database stdb;
    use stdb;
    create table userinfo(
    id int(10) primary key auto_increment,
    username varchar(200),
    password varchar(200)

    );    

運用前面學到的知識採用配置檔案建立JDBCUtils

配置檔案   connection.properties

DriverClassName=com.mysql.jdbc.Driver
Url=jdbc:mysql://127.0.0.1:3306/stdb
UserName=admin

Password=123456

package com.homework;

import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {
	private static String driverclassname;
	private static String url;
	private static String username;
	private static String password;
	private static Connection con;
	private JDBCUtils() {}
	static {
		try {
			readConnection();
			Class.forName(driverclassname);
			con=DriverManager.getConnection(url, username, password);
			}catch(Exception ex) {
				ex.printStackTrace();
				throw new RuntimeException("資料庫連線失敗!!!!");
			}
	}
	public static void readConnection() {
		try {
		Properties pro = new Properties();
		pro.load(new FileReader("connection.properties"));
		driverclassname=pro.getProperty("DriverClassName");
		url = pro.getProperty("Url");
		username = pro.getProperty("UserName");
		password = pro.getProperty("Password");
		}catch(IOException io) {
			io.printStackTrace();
			throw new RuntimeException("讀取配置檔案失敗!!!!");
		}
	}
	
	public static Connection getConnection() {
		return con;
	}
}

ackage com.homework;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;

public class Text {
	public static Map<String, String>map=new HashMap<String ,String>();
	public static Connection con =JDBCUtils.getConnection();
	public static PreparedStatement pst;
	public static ResultSet rs;
	
	public static void main(String[] args) {
		storeMap();
		readMap();
	}
//	遍歷集合、判斷、新增
	public static void readMap() {
		for(String key:map.keySet()) {
			 String password = map.get(key);
			 System.out.println(key+"<<<<"+password);
			 try {
			 if(judge(key)) {
				System.out.println("該使用者已經註冊");
			}else {
			 insert(key, password);
			}
			 }catch(SQLException sql) {
				 sql.printStackTrace();
				 throw new RuntimeException("系統異常!!!請聯絡管理員");
			 }
		}
	}
//	寫入使用者資訊
	public static void insert(String username,String password) {
		try {
		String sql = "INSERT INTO userinfo (username,upassword)VALUES(?,?)";
		pst =con.prepareStatement(sql);
		pst.setString(1, username);
		pst.setString(2, password);
		int i =pst.executeUpdate();
		if(i>0) {
			System.out.println("註冊使用者成功!!!!");
		}
		}catch(SQLException sql) {
			sql.printStackTrace();
			throw new RuntimeException("註冊失敗!!!請聯絡管理員");
		}
		
	}
//	判斷
	public static Boolean judge(String username)throws SQLException {
		String sql = "SELECT*FROM userinfo WHERE username=?";
		pst =con.prepareStatement(sql);
		pst.setString(1, username);
		rs = pst.executeQuery();
		if(rs.next()) {
			return true;
		}else {
		return false;
		}
	}
//	儲存集合資料
	public  static void storeMap() {
		map.put("liuyuan","123456");
		map.put("wangbaoqiang","123321");
		map.put("fangbian","abcd");
		map.put("miejueshitai","123abc321");
		map.put("fasdf", "312435");
	}

}

總結:對於迴圈判斷使用者名稱是否存在,最開始想的是for與while的巢狀迴圈來實現,後面實驗後才發現rs.next只能迴圈5次,後面返回值都是false,無法實現想要的結果,故後面直接採用資料庫判斷這樣就解決了剛才出現的問題