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