一提到用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在企业实战项目中,是如何在数据库中应用的。
- 封装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#