第2章java基础课后练习 (java第44天自学)

一提到用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*ex.e**cuteUpdate();
            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*ex.e**cuteQuery(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*ex.e**cuteUpdate(sql);
    }

    @Override
    public boolean add(Teacher t) {
        String sql = "insert into Teacher (name,age,sex) values (?,?,?)";
        return DBUtil*ex.e**cuteUpdate(sql, t.getName(), 
                                    t.getAge(), t.getSex());
    }

    @Override
    public boolean delete(int id) {
        String sql = "delete from Teacher where id = ?";
        return DBUtil*ex.e**cuteUpdate(sql, id);
    }

    @Override
    public boolean update(Teacher t) {
        String sql = 
          "update Teacher set name = ?,age = ?,sex = ? where id = ?";
        return DBUtil*ex.e**cuteUpdate(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*ex.e**cuteQuery(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#