1. 程式人生 > >jsp實現對mysql資料庫的操作

jsp實現對mysql資料庫的操作

接上,在PersonDao.java中逐項完成方法。

PreparedStatement pmst;
Connection conn;
ResultSet rs;

增加資料:

public int addPerson(Person p) {
		int i = 0;
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		String sql = "insert into users values(?,?,?,?,?)";
		
		try{
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.為佔位符傳值
			pmst.setInt(1, p.getId());
			pmst.setString(2, p.getName());
			pmst.setString(3, p.getSex());
			pmst.setInt(4, p.getAge());
			pmst.setString(5, p.getPhone());
			//5.執行sql語句
			i = pmst.executeUpdate();
			//釋放資源
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			e.printStackTrace();
		}	
		
		return i;
	}

在OaTest.java中進行測試:

@Test
	public void test2(){
		Person p = new Person(5,"李蓮英","男",20,"158121111");
		int i = dao.addPerson(p);
		if(i>0){
			System.out.println("插入成功!");
		}else{
			System.out.println("插入失敗!");
		}
	}

執行test2,插入成功:

事物:

將id設為主鍵後,如果表中已有該id的值,應該報錯。

在“com.xmx.oa.test”包下新建一個class“TrasctionDemo.java”

我們關閉事物自動提交,改為手動提交,並回滾:

@Test
	public void test1(){
		//1.與資料庫建立連線
		Connection conn = OaUtils.getConnection();
		//SQL語句
		String sql1 = "insert into users values(1,'愛好','男',20,'2424')";
		String sql2 = "insert into users values(3,'第三方','女',34,'2dsg')";
		String sql3 = "insert into users values(2,'的','男',31,'22fd4')";
		String sql4 = "insert into users values(4,'啊','女',80,'3dfs4')";
		
		try {
			//2.關閉事物自動提交
			conn.setAutoCommit(false);
			Statement smt = conn.createStatement();
			smt.executeUpdate(sql1);
			smt.executeUpdate(sql2);
			smt.executeUpdate(sql3);
			smt.executeUpdate(sql4);
			//3.手動提交
			conn.commit();
			System.out.println("插入成功!");
			//釋放資源
			smt.close();
			conn.close();
		} catch (Exception e) {
			//4.回滾到先前狀態
			System.out.println("出現異常,馬上回滾!");
			try {
				conn.rollback();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		
	}

這樣可以避免在多次操作中因一步錯誤而產生影響。

刪除單條資料:

public int deletePersonById(int id) {
		int i = 0;
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		String sql = "delete from users where id=?";
		
		try{
			//關閉事物自動提交
			conn.setAutoCommit(false);
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.為佔位符傳值
			pmst.setInt(1, id);
			//4.執行sql語句
			i = pmst.executeUpdate();
			//手動提交
			conn.commit();
			//釋放資源
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			//回滾到先前狀態
			System.out.println("出現異常,馬上回滾!");
			try {
				conn.rollback();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}	
		
		return i;
	}

測試:

public void test3(){
		int i = dao.deletePersonById(5);
		if(i>0){
			System.out.println("刪除成功!");
		}else{
			System.out.println("刪除失敗!");
		}
	}

修改資料:

public int updatePerson(Person p) {
		int i = 0;
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		String sql = "update users set name=?, sex=?, age=?, phone=? where id=? ";
		
		try{
			//關閉事物自動提交
			conn.setAutoCommit(false);
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.為佔位符傳值		
			pmst.setString(1, p.getName());
			pmst.setString(2, p.getSex());
			pmst.setInt(3, p.getAge());
			pmst.setString(4, p.getPhone());
			pmst.setInt(5, p.getId());
			//4.執行sql語句
			i = pmst.executeUpdate();
			//手動提交
			conn.commit();
			//釋放資源
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			//回滾到先前狀態
			System.out.println("出現異常,馬上回滾!");
			try {
				conn.rollback();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}	
		
		return i;
	}

測試:

public void test4(){
		Person p = new Person(5,"李蓮英","男",20,"110");
		int i = dao.updatePerson(p);
		if(i>0){
			System.out.println("修改成功!");
		}else{
			System.out.println("修改失敗!");
		}
	}

增刪改:

觀察可以得到,增加刪除和修改操作中大體步驟是相同的,只有sql語句和傳入的引數不同。

考慮把它們合成一條:

public int executeUpdate(String sql, Object...parameters){
		int i = 0;
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		try{
			//關閉事物自動提交
			conn.setAutoCommit(false);
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.為佔位符傳值
			if(parameters!=null && parameters.length>0){
				for(int j=0; j<parameters.length; j++){
					pmst.setObject(j+1, parameters[j]);
				}
			}
			//5.執行sql語句
			i = pmst.executeUpdate();
			//手動提交
			conn.commit();
			//釋放資源
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			//回滾到先前狀態
			System.out.println("出現異常,馬上回滾!");
			try {
				conn.rollback();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}	
		
		return i;
	}

傳入的引數為sql語句和多個引數Object...parameters。

xxx.setObject(j+1, parameters[j]);中,j+1表示sql語句中的佔位符(從1開始,而j是從0開始),parameters[j]表示傳入的多個引數。

測試:

public void test5(){
		//增加
//		Person p = new Person(6,"魏忠賢","男",35,"1123123");
//		String sql = "insert into users values(?,?,?,?,?)";
//		int i = dao.executeUpdate(sql, p.getId(), p.getName(), p.getSex(), p.getAge(), p.getPhone());
		
		//刪除
//		String sql = "delete from users where id=?";
//		int i = dao.executeUpdate(sql, "1");
		
		//修改
		Person p = new Person(5,"魏忠賢","女",35,"1123123");
		String sql = "update users set name=?, sex=?, age=?, phone=? where id=?";
		int i = dao.executeUpdate(sql, p.getName(), p.getSex(), p.getAge(), p.getPhone(), p.getId());
		
		if(i>0){
			System.out.println("成功!");
		}else{
			System.out.println("失敗!");
		}
	}

測試各項需要分開測試。

查詢所有資訊:

public List<Person> findAllPerson() {
		List<Person> list = new ArrayList<Person>();
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		String sql = "select * from users order by id ";
		
		try{
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.執行查詢語句
			rs = pmst.executeQuery(sql);
			
			while (rs.next()){
			    int id = rs.getInt(1);
			    String name = rs.getString(2);
				String sex = rs.getString(3);
				int age = rs.getInt(4);
				String phone = rs.getString(5);
				//5.封裝到Person物件中
				Person p = new Person(id, name, sex, age, phone);
				//6.新增到集合中
				list.add(p);
			}
			
			//7.釋放資源
			rs.close();
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return list;	
	}

該方法的返回型別為List<Person>,因此首先定義一個該型別的list。

這裡執行查詢語句executeQuery(sql),與上述的更新語句executeUpdate()不同。

因為list裡面的物件是Person型別的,而getString和getInt方法取出的是String和int型別,因此取出後先封裝到Person中:Person p = new Person(id, name, sex, age, phone);最後再加進list:list.add(p);

測試:

public void test6(){
		List<Person> list = dao.findAllPerson();
		for(Person p:list){
			System.out.println(p);
		}	
	}

按id查詢資訊:

public Person findByIdPerson(int id) {
		Person p = new Person();
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		String sql = "select * from users where id= "+id;
		
		try{
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.為佔位符傳值(加了這行就報錯)
//			pmst.setInt(1, id);
			//5.執行查詢語句
			rs = pmst.executeQuery(sql);
			rs.next();
			String name = rs.getString(2);
			String sex = rs.getString(3);
			int age = rs.getInt(4);
			String phone = rs.getString(5);
			//6.封裝到Person物件中
			p = new Person(id, name, sex, age, phone);
			
			//釋放資源
                        rs.close();
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			e.printStackTrace();
		}	
		
		return p;
	}

這裡注意返回型別為Person型,跟上個方法不同,它只需要顯示一條資訊,因此僅是少了加入集合的步驟。

測試:

public void test7(){
		Person p = dao.findByIdPerson(10);
		System.out.println(p.toString());
	}

按id刪除多組:

public int deleteManyPerson(int[] id) {
		int i = 0;
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		String sql = "delete from users where id=?";
		
		try{
			//關閉事物自動提交
			conn.setAutoCommit(false);
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			for(int j=0; j<id.length; j++){
				//4.為佔位符傳值
				pmst.setInt(1, id[j]);
				//4.執行sql語句
				i = pmst.executeUpdate();
			}
			//手動提交
			conn.commit();
			//釋放資源
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			//回滾到先前狀態
			System.out.println("出現異常,馬上回滾!");
			try {
				conn.rollback();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}	
		
		return i;
	}

這裡傳入的是陣列,因此為佔位符傳值時我們使用一個迴圈來多次執行,以達到刪除多項的目的。

測試:

public void test8(){
		int[] id = new int[]{2, 5};
		int i = dao.deleteManyPerson(id);
		if(i>0){
			System.out.println("刪除成功!");
		}else{
			System.out.println("刪除失敗!");
		}
	}

分頁查詢:

  • 在mysql中支援分頁查詢
  • select * from <表名> limit m,n
  • m表示從第幾條開始
  • n表示顯示幾條
  • 分頁時傳遞的是你的當前頁面和每頁顯示的條數
  • select * from <表名> limit (currentpage-1)*size, size
public List<Person> findByPage(int currentpage, int size) {
		List<Person> list = new ArrayList<Person>();
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.sql語句
		int m = (currentpage-1)*size;
		int n = size;
		String sql = "select * from users limit "+m+","+n;
//		System.out.println(sql);
		
		try{
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql);
			//4.執行查詢語句
			rs = pmst.executeQuery(sql);
			
			while (rs.next()){
				int id = rs.getInt(1);
				String name = rs.getString(2);
				String sex = rs.getString(3);
				int age = rs.getInt(4);
				String phone = rs.getString(5);
				//5.封裝到Person物件中
				Person p = new Person(id, name, sex, age, phone);
				//6.新增到集合中
				list.add(p);
			}
			
			//7.釋放資源
			rs.close();
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return list;	
	}

測試:

public void test9(){
		int[] id = new int[]{2, 5};
		int i = dao.deleteManyPerson(id);
		if(i>0){
			System.out.println("刪除成功!");
		}else{
			System.out.println("刪除失敗!");
		}
	}

高階搜尋:

public List<Person> superQuery(Person p){
		List<Person> list = new ArrayList<Person>();
		//1.與資料庫建立連線
		conn = OaUtils.getConnection();
		//2.動態新增sql語句
		StringBuilder sql = new StringBuilder("select * from users where 1=1");//1=1為假條件
		if(p.getName()!=null && p.getName()!=""){
			sql.append(" and name="+"'"+p.getName()+"'");
		}
		if(p.getSex()!=null && p.getSex()!=""){
			sql.append(" and sex="+"'"+p.getSex()+"'");
		}
		if(p.getPhone()!=null && p.getPhone()!=""){
			sql.append(" and phone="+"'"+p.getPhone()+"'");
		}
//		System.out.println(sql.toString());
		try{
			//3.建立PreparedStatement物件
			pmst = conn.prepareStatement(sql.toString());
			//4.執行查詢語句
			rs = pmst.executeQuery();
			
			while (rs.next()){
				int id = rs.getInt(1);
				String name = rs.getString(2);
				String sex = rs.getString(3);
				int age = rs.getInt(4);
				String phone = rs.getString(5);
				//5.封裝到Person物件中
				Person p1 = new Person(id, name, sex, age, phone);
				//6.新增到集合中
				list.add(p1);
			}
			
			//7.釋放資源
			rs.close();
			pmst.close();
			conn.close();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return list;
	}

StringBuilder實現字串的動態拼接,append();

或者使用String.format(s,....);用佔位符%s和%d也行:

String s = "select * from users where %s %s %s";
String s1="", s2="", s3="";
if(p.getName()!=null && p.getName()!=""){
	s1 = "name='"+p.getName()+"'";
}
if(p.getSex()!=null && p.getSex()!=""){
	s2 = "and sex='"+p.getSex()+"'";
}		
if(p.getPhone()!=null && p.getPhone()!=""){
	s3 = "and phone='"+p.getPhone()+"'";
}
		
String sql = String.format(s, s1, s2, s3);

如要實現模糊查詢,把“=”改成“like”,在欄位前後都加入“%”即可:

s1 = "name like'%"+p.getName()+"%'";

測試:

public void test10(){
		Person p = new Person("name1", "man", null);
		List<Person> list = dao.superQuery(p);
		for(Person p1:list){
			System.out.println(p1);
		}
	}