For-Each循环,两种方式实现插入,增删改查,完整的JDBC代码

7.12问题集

For-Each循环

Java[編輯]
Java語言從JDK 1.5.0開始引入foreach循環。

以下代碼用於循環列印myArray數組中的每個元素,java中的foreach循環使用for關鍵字,而非foreach。

for (int x : myArray){
  System.out.println(x);
}

他的语法如下

for(type element: array)

  {

   System.out.println(element);

  }

两种方式实现插入

第一种直接书写sql语句。

public void insert(UserInfo userInfo){
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    try {

        String sqlinsert="insert into userinfo(name,password)"+ "values('"+userInfo.getName()+"','"+userInfo.getPassword()+"')";
        System.out.println(sqlinsert);
        ps=(PreparedStatement) conn.prepareStatement(sqlinsert);

        //注意:这里不要传入参数(),executeUpdate()增删改都使用者种方法。
        int i=ps.executeUpdate();
        if (i>0) {
            System.out.println("添加成功");
        }else {
            System.out.println("添加失败");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        //rs.ps.conn都是跟数据库连接相关的。当我们使用完毕,必须关闭资源,防止堵死。顺序的后打开先关闭
        try {

            if (ps!=null) {
                ps.close();
            }
            if (conn!=null) {
                conn.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }
}

第二种使用占位符书写

/*
 *占位符的优势。
 *1.效率更高
 *2.书写时不容易出错
 *3.防止sql注入(安全问题) 
 */


public void insert2(UserInfo userInfo){
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    try {

        String sqlinsert="insert into userinfo(name,password)"+ "values(?,?)";
        System.out.println(sqlinsert);
        ps=(PreparedStatement) conn.prepareStatement(sqlinsert);
        ps.setString(1, userInfo.getName());
        ps.setString(2, userInfo.getPassword());
        //注意:这里不要传入参数(),executeUpdate()增删改都使用者种方法。
        int i=ps.executeUpdate();
        if (i>0) {
            System.out.println("添加成功");
        }else {
            System.out.println("添加失败");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        //rs.ps.conn都是跟数据库连接相关的。当我们使用完毕,必须关闭资源,防止堵死。顺序的后打开先关闭
        try {

            if (ps!=null) {
                ps.close();
            }
            if (conn!=null) {
                conn.close();
            }
            } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

    }
}
}

他的调用我也补充一下

public static void main(String[] args) {
        ArrayList<UserInfo> arrayList= new UserInfoDao().getList();
        UserInfo userInfo=new UserInfo();
        userInfo.setName("shan");
        userInfo.setPassword("123---");
        new UserInfoDao().insert(userInfo);

    }

}

更新操作

public void update(UserInfo userInfo){
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    String updateSQL="update userinfo set name=?,password=?"+"where id=?";

    try {
        ps=(PreparedStatement) conn.prepareStatement(updateSQL);
        ps.setString(1, userInfo.getName());
        ps.setString(2, userInfo.getPassword());
        ps.setInt(3, userInfo.getId());
        System.out.println(updateSQL);

        int a=ps.executeUpdate();
        if (a>0) {
            System.out.println("更改完成");
        }
        if (a<0) {
            System.out.println("更改失败");

        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
            try {
                if (ps!=null) {
                    ps.close();
                }
                if (conn!=null) {
                    conn.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }

}

注意点:ps.setString(1, userInfo.getName());这是从1开始添加。

删除数据

public void delete(int id) {
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    String deleteSQL="delete from userinfo where id=?";

    try {
        ps=(PreparedStatement) conn.prepareStatement(deleteSQL);
        ps.setInt(1, id);
        int a=ps.executeUpdate();
        if (a>0) {
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        try {
            if (ps!=null) {
                ps.close();
            }
            if (conn!=null) {
                conn.close();
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
}

进行代码优化——1,关闭资源

注意:参数有两个或者三个的。这时候就要使用参数多态性

当使用的时候就直接调用者两个函数就可以了
public static void closeResource(PreparedStatement ps,Connection conn){

    try {
        if (ps!=null) {
            ps.close();
        }
        if (conn!=null) {
            conn.close();
        }
        } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
}

public static void closeResource(ResultSet rs,PreparedStatement ps,Connection conn){

    try {
        if (rs!=null) {
        rs.close();

        }
        if (ps!=null) {
            ps.close();
        }
        if (conn!=null) {
            conn.close();
        }
        } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
}

代码优化之二———使用boolean值作为返回值来判断是否修改成功

前面的修改例子中,修改成功是显示在控制台上。而这种方法修改成功是显示在返回值

public boolean delete(int id) {
    boolean b=false;
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    String deleteSQL="delete from userinfo where id=?";

    try {
        ps=(PreparedStatement) conn.prepareStatement(deleteSQL);
        ps.setInt(1, id);
        int a=ps.executeUpdate();
        if (a>0) {
            b=true;
        }else {
            System.out.println("删除失败");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        BaseConnection.closeResource(ps, conn);
    }
    return b;
}

完整的JDBC代码

package com.zsz.develop.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import org.omg.CORBA.portable.ValueBase;
import org.omg.PortableServer.ID_ASSIGNMENT_POLICY_ID;

import com.mysql.jdbc.PreparedStatement;
import com.zsz.develop.bean.UserInfo;
import com.zsz.develop.util.BaseConnection;

public class UserInfoDao {

public ArrayList<UserInfo> getList(){
    ArrayList<UserInfo> arrayList=new ArrayList<UserInfo>();
    Connection conn=BaseConnection.getConnection();
    //定义在外面是要让他成为全局变量
    PreparedStatement ps=null;
    ResultSet rs=null;
    String sql="select * from userinfo";

    try {
        ps=(PreparedStatement) conn.prepareStatement(sql);
         rs =ps.executeQuery();
        while (rs.next()) {
//                System.out.println(rs.getString("name")+"-----");
            //把数据封装到实体类
            UserInfo userInfo=new UserInfo();
            userInfo.setId(rs.getInt("id"));
            userInfo.setName(rs.getString("name"));
            userInfo.setPassword(rs.getString("password"));
            //再把封装好的对象放到我们的集合中去
            arrayList.add(userInfo);
        }




    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        //rs.ps.conn都是跟数据库连接相关的。当我们使用完毕,必须关闭资源,防止堵死。顺序的后打开先关闭
            BaseConnection.closeResource(rs, ps, conn);
    }

    return arrayList;
}

public boolean insert(UserInfo userInfo){
    boolean b=false;
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    try {

        String sqlinsert="insert into userinfo(name,password)"+ "values('"+userInfo.getName()+"','"+userInfo.getPassword()+"')";
        System.out.println(sqlinsert);
        ps=(PreparedStatement) conn.prepareStatement(sqlinsert);

        //注意:这里不要传入参数(),executeUpdate()增删改都使用者种方法。
        int i=ps.executeUpdate();
        if (i>0) {
            b=true;
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        BaseConnection.closeResource( ps, conn);
    }
    return b;
}
/*
 *占位符的优势。
 *1.效率更高
 *2.书写时不容易出错
 *3.防止sql注入(安全问题) 
 */


public boolean insert2(UserInfo userInfo){
    boolean b=false;
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    try {

        String sqlinsert="insert into userinfo(name,password)"+ "values(?,?)";
        System.out.println(sqlinsert);
        ps=(PreparedStatement) conn.prepareStatement(sqlinsert);
        ps.setString(1, userInfo.getName());
        ps.setString(2, userInfo.getPassword());
        //注意:这里不要传入参数(),executeUpdate()增删改都使用者种方法。
        int i=ps.executeUpdate();
        if (i>0) {
            b=true;
        }else {
            System.out.println("添加失败");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        //rs.ps.conn都是跟数据库连接相关的。当我们使用完毕,必须关闭资源,防止堵死。顺序的后打开先关闭
        BaseConnection.closeResource(ps, conn);

    }
    return b;
}


public boolean update(UserInfo userInfo){
    boolean b=false;
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    String updateSQL="update userinfo set name=?,password=?"+"where id=?";

    try {
        ps=(PreparedStatement) conn.prepareStatement(updateSQL);
        ps.setString(1, userInfo.getName());
        ps.setString(2, userInfo.getPassword());
        ps.setInt(3, userInfo.getId());
        System.out.println(updateSQL);

        int a=ps.executeUpdate();
        if (a>0) {
            b=true;
        }



    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
            BaseConnection.closeResource(ps, conn);

    }
    return b;
}

public boolean delete(int id) {
    boolean b=false;
    Connection conn=BaseConnection.getConnection();
    PreparedStatement ps=null;
    String deleteSQL="delete from userinfo where id=?";

    try {
        ps=(PreparedStatement) conn.prepareStatement(deleteSQL);
        ps.setInt(1, id);
        int a=ps.executeUpdate();
        if (a>0) {
            b=true;
        }else {
            System.out.println("删除失败");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        BaseConnection.closeResource(ps, conn);
    }
    return b;
}



}