美文网首页
通过JDBC进行简单的增删改查(以MySQL为例)

通过JDBC进行简单的增删改查(以MySQL为例)

作者: 与雨予鱼yu | 来源:发表于2018-08-23 15:54 被阅读0次

    前言:什么是JDBC

    维基百科的简介:

    Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。它JDBC是面向关系型数据库的。

    简单地说,就是用于执行SQL语句的一类Java API,通过JDBC使得我们可以直接使用Java编程来对关系数据库进行操作。通过封装,可以使开发人员使用纯Java API完成SQL的执行。

    • JDBC与数据库驱动的关系:接口与实现的关系。


      JDBC规范
    • JDBC的四个核心对象:
      DriverManager:用于注册驱动(类)
      Connection: 表示与数据库创建的连接(接口)
      Statement: 操作数据库sql语句的对象(接口)
      ResultSet: 结果集或一张虚拟表(接口)


      示意图

    一、准备工作

    MySQL安装配置和基础学习

    使用JDBC操作数据库之前,首先需要有一个数据库。

    create table Student            //创立表语句
    (
    sno varchar(20),
    sname varchar(20),
    ssex varchar(20),
    sbirthday datetime,
    class varchar(20)
    );
    
    101 李军  男   1976-02-20  95033   //表原始数据
    103 陆君  男   1974-06-03  95031   
    105 匡明  男   1975-10-02  95031   
    107 王丽  女   1976-01-23  95033   
    108 曾华  男   1977-09-01  95033   
    109 周梅  女   1993-01-19  95032   
    
    下载数据库对应的jar包并导入
    • 使用JDBC需要在工程中导入对应的jar包。数据库与JDBC包的对应关系可以参考各种数据库对应的jar包、驱动类名和URL格式。在Eclipse下的导入方法:
      在工程的图标上右击,选择”Properties”,在”Java Bulid Path”中选择”Add External JARs…”,选择下载并解压后获得的jar包。
      示意图

    二、JDBC基本操作

    • 定义记录的类
    public class Student {
        private String Sno;          //学号
        private String Sname;        //姓名
        private String Ssex;         //性别
        private String Sbirthday;    //生日
        private String Sclass;       //班级
    
        Student(){}                      //空参构造
    
        Student(String Sno, String Sname, String Ssex, String Sbirthday, String Sclass){
            this.Sno = Sno;             //有参构造
            this.Sname = Sname;
            this.Ssex = Ssex;
            this.Sbirthday = Sbirthday;
            this.Sclass = Sclass;
        }
    
        public String getSno() {
            return Sno;
        }
        public void setSno(String sno) {
            Sno = sno;
        }
        public String getSname() {
            return Sname;
        }
        public void setSname(String sname) {
            Sname = sname;
        }
        public String getSsex() {
            return Ssex;
        }
        public void setSsex(String ssex) {
            Ssex = ssex;
        }
        public String getSbirthday() {
            return Sbirthday;
        }
        public void setSbirthday(String sbirthday) {
            Sbirthday = sbirthday;
        }
        public String getSclass() {
            return Sclass;
        }
        public void setClass(String Sclass) {
            this.Sclass = Sclass;
        }
    }
    
    • 定义增删改查的类
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    public class JDBCOperation {
        //得到连接的方法
        private static Connection getCon() throws Exception{
            String url = "jdbc:mysql://localhost:3306/day21";
            String user = "root";           //用户名
            String password = "******";     //密码
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            Connection con = DriverManager.getConnection(url, user, password);
            
            return con;
        }
        
        
        //增insert
        static void insert(Student student) throws Exception {
            Connection conn = getCon();
            String sql = "insert into Student (Sno,Sname,Ssex,Sbirthday,Class) values(?,?,?,?,?)";
            PreparedStatement pstmt;
    
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, student.getSno());
            pstmt.setString(2, student.getSname());
            pstmt.setString(3, student.getSsex());
            pstmt.setString(4, student.getSbirthday());
            pstmt.setString(5, student.getSclass());
            pstmt.executeUpdate();     //执行数据库语句
            pstmt.close();    
            conn.close();
        }
        
        //删delete
        static void delete(String Sno) throws Exception{
            Connection con = getCon();
            String sql = "delete from Student where Sno = '" + Sno + "'";
            PreparedStatement pstmt = con.prepareStatement(sql);
            con.close();
            pstmt.close();
        }
        
        //改update
        static void update(Student student) throws Exception {  
            Connection conn = getCon();
            String sql = "update Student set Sname = ?, Ssex = ?, Sbirthday = ?, Class = ? where Sno = ?";
            PreparedStatement pstmt;
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, student.getSname());
            pstmt.setString(2, student.getSsex());
            pstmt.setString(3, student.getSbirthday());
            pstmt.setString(4, student.getSclass());
            pstmt.setString(5, student.getSno());
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();
        }
        
        //查select
        static Integer getAll() throws Exception {
            Connection conn = getCon();
            String sql = "select * from Student";   
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            List<Student> list = new ArrayList<Student>(); //使用集合存储结果
             
            while(rs.next()){     //将每一条查询到的结果存入Student对象
                Student student = new Student();
                student.setSno(rs.getString(1));
                student.setSname(rs.getString(2));
                student.setSsex(rs.getString(3));
                student.setSbirthday(rs.getString(4));
                student.setClass(rs.getString(5));
                list.add(student);
            }
            
            for(Student student : list){
                System.out.print(student.getSno() + "\t");
                System.out.print(student.getSname() + "\t");
                System.out.print(student.getSsex() + "\t");
                System.out.print(student.getSbirthday() + "\t");
                System.out.print(student.getSclass() + "\t");
                System.out.println();
            }
            System.out.println();
            return null;
        }
    }
    
    
    • 测试函数
    public class test {
        public static void main(String[] args) throws Exception{
             JDBCOperation.getAll();      //第一次查询
             JDBCOperation.insert(new Student("102", "刘攀", "男", "1989-09-29" , "95032"));
             JDBCOperation.getAll();      //第二次查询
             JDBCOperation.update(new Student("109", "周梅", "女", "1993-01-19" , "95032"));
             JDBCOperation.delete("101");
             JDBCOperation.getAll();      //第三次查询
        }
    }
    

    • 第一次查询结果
    101 李军  男   1976-02-20  95033   
    103 陆君  男   1974-06-03  95031   
    105 匡明  男   1975-10-02  95031   
    107 王丽  女   1976-01-23  95033   
    108 曾华  男   1977-09-01  95033   
    109 周梅  女   1993-01-19  95032   
    
    • 第二次查询结果
    101 李军  男   1976-02-20  95033   
    102 刘攀  男   1989-09-29  95032   
    103 陆君  男   1974-06-03  95031   
    105 匡明  男   1975-10-02  95031   
    107 王丽  女   1976-01-23  95033   
    108 曾华  男   1977-09-01  95033   
    109 周梅  女   1993-01-19  95032   
    
    • 第三次查询结果
    102 刘攀  男   1989-09-29  95032   
    103 陆君  男   1974-06-03  95031   
    105 匡明  男   1975-10-02  95031   
    107 王丽  女   1976-01-23  95033   
    108 曾华  男   1977-09-01  95033   
    109 周梅  女   1993-01-19  95032   
    

    三、代码分析

    Connection

    java.sql

    接口 Connection

    所有超级接口:

    Wrapper


    public interface Connection extends Wrapper

    与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。

    Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。此信息是使用 getMetaData 方法获得的。

    PreparedStatemnt

    java.sql

    接口 PreparedStatement

    所有超级接口:

    Statement, Wrapper

    所有已知子接口:

    CallableStatement


    public interface PreparedStatement extends Statement
    表示预编译的 SQL 语句的对象。
    SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

    常用方法

    boolean execute()

    在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。

    ResultSet executeQuery()

    在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。

    int executeUpdate()

    在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。

    ResultSet

    java.sql

    接口 ResultSet

    所有超级接口:

    Wrapper

    所有已知子接口:

    CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet, RowSet, SyncResolver, WebRowSet


    public interface ResultSet extends Wrapper
    表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

    四、思考问题

    1.每次SQL操作都需要建立和关闭连接,这势必会消耗大量的资源开销,如何避免?

    分析:可以采用连接池,对连接进行统一维护,不必每次都建立和关闭。事实上这是很多对JDBC进行封装的工具所采用的。

    2.Java代码中,传入的数据格式与数据库定义不同怎么办?

    分析:在执行SQL语句时,数据库会尝试进行转换。具体转化规则应该和数据库有关。

    注:参考博文:
    https://www.cnblogs.com/wuyuegb2312/p/3872607.html

    相关文章

      网友评论

          本文标题:通过JDBC进行简单的增删改查(以MySQL为例)

          本文链接:https://www.haomeiwen.com/subject/gxhjiftx.html