简单的JDBC实例分享(3)

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.jdbc.entity.Person;


//封装Person表的增删改查方法
public class PersonDaoImpl {
    //这里的问号?是占位符,用于给将要传递的参数占位置,实现了动态SQL语句的执行
    //添加一条记录的SQL语句,第一个参数由于数据表中是主键自增,这里可以用null
    private static final String SQL_ADD = "insert into person values(null,?,?,?)";
    //删除,指定id的记录
    private static final String SQL_DEL = "delete from person where id = ?";
    //修改,指定id的记录
    private static final String SQL_UPD = "update person set name = ?,gender = ?,age = ? where id = ?";
    //查询,指定id记录
    private static final String SQL_ID = "select * from person where id = ?";
    //查询,所有记录
    private static final String SQL_ALL = "select * from person";
   
    //添加一条记录
    public boolean add(Person p) {
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_ADD);
            //把我们传入的person对象的属性值分作为占位符的值传入,数组各值顺序对应占位符字段顺序
            Object[] params = {p.getName(),p.getGender(),p.getAge()};
            int len = params.length;
            for(int i = 0;i < len;i++) {
                //!!!这里比较特殊,很多下标都是从0开始,例如数组,
                //!!!但是这个setObject方法第一个索引参数是从1开始
                ps.setObject(i+1, params[i]);
            }
            //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数
            //之前的Statement.excute方法要传入SQL语句字符串参数,
            //但是用了PreparedStatement就不用传参数了,因为在前面我们已经预定义处理了
            int line = ps.executeUpdate();
            if (line > 0) {
                System.out.println("添加成功,受影响记录数为"+line);
                return true;//结束,但是后面finally区代码会执行
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭相关对象
            JdbcUtil.close(null, ps, conn);
        }
        System.out.println("添加失败");
        return false;
    }
    //删除一条记录
    public boolean delete(int id) {
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_DEL);
            ps.setInt(1, id);
            //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数
            int line = ps.executeUpdate();
            if (line > 0) {
                System.out.println("删除成功,受影响记录数为"+line);
                return true;//结束,但是后面finally区代码会执行
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭相关对象
            JdbcUtil.close(null, ps, conn);
        }
        System.out.println("删除失败");
        return false;
    }
    //修改一条记录
    public boolean update(Person p) {
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPD);
            //把我们传入的person对象的属性值分作为占位符的值传入
            Object[] params = {p.getName(),p.getGender(),p.getAge(),p.getId()};
            int len = params.length;
            for(int i = 0;i < len;i++) {
                //!!!这里比较特殊,很多下标都是从0开始,例如数组,
                //!!!但是这个setObject方法第一个索引参数是从1开始
                ps.setObject(i+1, params[i]);
            }
            //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数
            int line = ps.executeUpdate();
            if (line > 0) {
                System.out.println("修改成功,受影响记录数为"+line);
                return true;//结束,但是后面finally区代码会执行
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭相关对象
            JdbcUtil.close(null, ps, conn);
        }
        System.out.println("修改失败");
        return false;
    }
    //获取一条记录,这里返回的不再是布尔值,而是一个对应数据表中一条记录的Person对象
    public Person findById(int id) {
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_ID);
            ps.setInt(1, id);
            //返回结果集,这里是查询指定id,所以结果集中应该最多只有一条记录
            rs = ps.executeQuery();
            if(rs.next()) {
                Person p = new Person();
                p.setId(id);
                //这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值
                p.setName(rs.getString("name"));
                p.setGender(rs.getString("gender"));
                p.setAge(rs.getInt("age"));
                return p;//返回p对象,结束
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭相关对象
            JdbcUtil.close(rs, ps, conn);
        }
        return null;
    }
    //获取所有记录,返回结果集不便操作,故封装到一个List中作为方法返回值
        public List<Person> findAll() {
            Connection conn = JdbcUtil.getConnection();
            PreparedStatement ps = null;
            ResultSet rs = null;
            List<Person> list = new ArrayList<>();
            try {
                ps = conn.prepareStatement(SQL_ALL);
                //返回结果集
                rs = ps.executeQuery();
                while(rs.next()) {
                    //创建一个Person对象
                    Person p = new Person();
                    //这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值
                    p.setId(rs.getInt("id"));
                    p.setName(rs.getString("name"));
                    p.setGender(rs.getString("gender"));
                    p.setAge(rs.getInt("age"));
                    list.add(p);//添加至集合
                }
                return list;
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //关闭相关对象
                JdbcUtil.close(rs, ps, conn);
            }
            return null;
        }
}

 小结

JDBC操作数据库步骤概述如下:

1.注册加载驱动类

2.获取连接

3.创建语句对象

4.执行SQL语句(excute)

5(可选).处理结果

6.关闭相关对象(注意顺序:依次为ResultSet、Statement/PreparedStatement、Connction)

扩展

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0744e66079f08b82208350ca2bdbc54b.html