第28天学习Java:掌握数据库操作基础

发表时间: 2021-02-01 12:15

一提到用Java操作数据库,就想起当年解决社保大批量数据的问题。那时候有同事用ORM框架去读写几万条数据时,总遇到性能瓶颈,操作到一半时,总会出错。

项目经理安排我去解决这个难题,我啥也不管,直接改为JDBC进行操作。当时用了什么办法,如今想来已经没有什么大的印象了,反正顺利地解决了问题,获得最高的项目奖金。

28.1 驱动程序

其实大多数操作数据库的Java第3方开发包,都是基于JDBC的,只不过在它的基础上新增了一些简单好用的功能罢了。Java几乎支持所有的数据库,如MySQL、SQL Server、Oracle和Sqlite等。为了方便讲解,我们就用Sqlite为例吧。

为了让Java支持对指定数据库的操作,你要下载其对应的驱动程序,Sqlite驱动程序的地址为
https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc ,其实Java的驱动程序也是jar开发包。下载之后,自己将其放进Java运行环境中。

28.2 增删改查

在实际开发当中,很少人会在代码中去创建表格,因为那样效率太低,而且维护也不方便,还有会导致DBA失业。我加在代码中,是为了不让你因为没有创建表格,而放弃学习这一块非常重要的内容。还有,为了培养实战开发思维,我就告诉你Java在企业实战项目中,是如何在数据库中应用的。

  1. 封装DB操作

JDBC操作数据库的流程,创建Connection对象,;获得PreparedStatement;执行executeUpdate()或executeQurey()获得结果;关闭PreparedStatement对象和Connection对象。常用Connection、PreparedStatement和select中的ResultSet类,DBUtil为通用工具类。

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Statement;import java.sql.ResultSet;import java.sql.SQLException;/* * 数据操作工具类 */public class DBUtil {    //类加载时,只执行一次。    static {        try {            Class.forName("org.sqlite.JDBC");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    //建立链接,返回链接对象    public static Connection getConnection() {        try {            return DriverManager.getConnection("jdbc:sqlite:sqlite.db");        } catch (SQLException e) {            e.printStackTrace();        }        return null;    }    /*     * 增删改的通用方法     */    public static boolean executeUpdate(String sql, Object... args) {        PreparedStatement ps = null;        try {            ps = getConnection().prepareStatement(sql);            for (int i = 0; i < args.length; i++) {                ps.setObject(i + 1, args[i]);            }            int i = ps.executeUpdate();            if (i > 0) return true;        } catch (SQLException e) {            e.printStackTrace();        }        return false;    }    //数据查询    public static ResultSet executeQuery(String sql) {        Statement stmt = null;        try {            stmt = getConnection().createStatement();            return stmt.executeQuery(sql);        } catch (SQLException e) {            e.printStackTrace();        }        return null;    }}

2. 实体类

面向对象的一个特征就是封装,为了方便开发,经常会将要操作的数据库表格转为实体类的方式,这样传值,应用都要方便好多。

//教师实体类public class Teacher {    private int id;    private String name;    private int age;    private String sex;    public Teacher() {    }    public Teacher(int id, String name, int age, String sex) {        this.id = id;        this.name = name;        this.age = age;        this.sex = sex;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    @Override    public String toString() {        return "Teacher{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                ", sex='" + sex + '\'' +                '}';    }}

3. 数据DAO

不知从什么时候开始,大家习惯了将对实体类进行的操作,定为以接口和实现类的方式,像实现对Teacher的DAO,接口用ITeacherDAO,实现类用TeacherDAOImpl。你还别说,这种方式挺好的。

//接口import java.util.List;public interface ITeacherDAO {    //创建表格    boolean create();    //添加信息    boolean add(Teacher t);    // 删除指定行数据    boolean delete(int id);    // 修改老师信息    boolean update(Teacher t);    // 查询数据    List<Teacher> query();}

实现类,隐藏了实现细节,不错。

import java.util.ArrayList;import java.util.List;import java.sql.ResultSet;import java.sql.SQLException;//实现类public class TeacherDAOImpl implements ITeacherDAO {    @Override    public boolean create() {        String sql = "CREATE TABLE Teacher"                + "(id INTEGER not NULL, "                + " name VARCHAR(50), "                + " age INTEGER, "                + " sex VARCHAR(10), "                + " PRIMARY KEY( id ))";        return DBUtil.executeUpdate(sql);    }    @Override    public boolean add(Teacher t) {        String sql = "insert into Teacher (name,age,sex) values (?,?,?)";        return DBUtil.executeUpdate(sql, t.getName(),                                     t.getAge(), t.getSex());    }    @Override    public boolean delete(int id) {        String sql = "delete from Teacher where id = ?";        return DBUtil.executeUpdate(sql, id);    }    @Override    public boolean update(Teacher t) {        String sql =           "update Teacher set name = ?,age = ?,sex = ? where id = ?";        return DBUtil.executeUpdate(sql, t.getName(),                                     t.getAge(), t.getSex(), t.getId());    }    @Override    public List<Teacher> query() {        List<Teacher> list = new ArrayList<>();        Teacher t = null;        String sql = "select * from Teacher";        ResultSet rs = DBUtil.executeQuery(sql);        try {            if (rs != null) {                while (rs.next()) {                    int id = rs.getInt("id");                    String name = rs.getString("name");                    int age = rs.getInt("age");                    String sex = rs.getString("sex");                    t = new Teacher(id, name, age, sex);                    list.add(t);                }            }        } catch (SQLException e) {            e.printStackTrace();        }        return list;    }}

4. 数据库操作

在要实现对数据表格操作的代码中,你面向接口编程就好了。是不是很嗨皮,很简答呀?那你还不赶紧关注我?

/* * 数据库操作 */import java.util.List;public class TestClass {    public static void main(String[] args) {        try {            Teacher t1 = new Teacher(1, "韩梅梅", 29, "女");            Teacher t2 = new Teacher(2, "李磊", 34, "男");            ITeacherDAO iTeacherDAO = new TeacherDAOImpl();            //创建表格            iTeacherDAO.create();            //新增数据            iTeacherDAO.add(t1);            iTeacherDAO.add(t2);            List<Teacher> list = iTeacherDAO.query();            int size = list.size();            for (int i = 0; i < size; i++) {                Teacher t = list.get(i);                System.out.println("id=" + t.getId() + ",name="                                    + t.getName()+ ",age="                                    + t.getAge() + ",sex=" + t.getSex());            }        } catch (Exception e) {            e.printStackTrace();        }    }}

输出结果

id=1,name=韩梅梅,age=29,sex=女

id=2,name=李磊,age=34,sex=男

好了,有关Java操作内容就这么多了,如果你觉得老陈这样讲还可以的话,你就转发和点赞,你的轻轻一点,就是对老陈继续创作的最大鼓励和支持。

一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,可关注今日头条:老陈说编程。我在分享Python,前端、Java和App方面的干货。关注我,没错的。

#Java##APP##程序员##Web##Spring#