一提到用Java操作数据库,就想起当年解决社保大批量数据的问题。那时候有同事用ORM框架去读写几万条数据时,总遇到性能瓶颈,操作到一半时,总会出错。
项目经理安排我去解决这个难题,我啥也不管,直接改为JDBC进行操作。当时用了什么办法,如今想来已经没有什么大的印象了,反正顺利地解决了问题,获得最高的项目奖金。
其实大多数操作数据库的Java第3方开发包,都是基于JDBC的,只不过在它的基础上新增了一些简单好用的功能罢了。Java几乎支持所有的数据库,如MySQL、SQL Server、Oracle和Sqlite等。为了方便讲解,我们就用Sqlite为例吧。
为了让Java支持对指定数据库的操作,你要下载其对应的驱动程序,Sqlite驱动程序的地址为
https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc ,其实Java的驱动程序也是jar开发包。下载之后,自己将其放进Java运行环境中。
在实际开发当中,很少人会在代码中去创建表格,因为那样效率太低,而且维护也不方便,还有会导致DBA失业。我加在代码中,是为了不让你因为没有创建表格,而放弃学习这一块非常重要的内容。还有,为了培养实战开发思维,我就告诉你Java在企业实战项目中,是如何在数据库中应用的。
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#