项目描述
学校实训第一天,企业老师教了基本的jdbc操作,包括:如何创建一个数据库、如何在编译器中连接数据库、利用jdbc操作数据库(包括最基本的增删改查)等等。最终做了一个简单的利用jdbc操作学校信息数据库的项目。废话不多说,直接先上代码!
代码:
这次实训老师教了Dao模式开发,emmm还不是很懂Dao模式,之前看过一个博客,里面也是用的Dao模式开发,讲得更细一点,123,上链接!☞JavaAPI(DAO模式+图书管理系统控制台版本)
当然,我这里也有代码:
测试类JournalTest
package ycu.Journal;
import java.util.*;
import ycu.Journal.dao.SchoolDao;
import ycu.Journal.dao.impl.SchoolDaoImpl;
import ycu.Journal.pojo.SchoolInfo;
@SuppressWarnings("all")
/**
* 下面是测试代码, 测试添加、查询、修改、删除
*/
public class JournalTest {
public static void main(String[] args) {
try {
SchoolDao dao = new SchoolDaoImpl();
SchoolInfo info = null;
info = dao.queryInfo("111");//先查询一遍在数据库表中是否存在这个编号的学校
if (info == null) {//返回的是null说明表里面没有,则添加
info = new SchoolInfo();
info.setSchoolID("111");
info.setName("南昌十中");
info.setDescription("这是最差的重点中学");
if (dao.insert(info)) {
System.out.println("新增学校:" + info.getName() + " 成功");
}
}
//下面的添加过程同样的道理,可以连续运行两边,会发现运行结果不一样,先用查找再判断的好处是反复使用的时候不会重复添加
info = dao.queryInfo("222");
if (info == null) {
info = new SchoolInfo();
info.setSchoolID("222");
info.setName("师大附中");
info.setDescription("这是最好的重点中学");
if (dao.insert(info)) {
System.out.println("新增学校:" + info.getName() + " 成功");
}
}
info = dao.queryInfo("333");
if (info == null) {
info = new SchoolInfo();
info.setSchoolID("333");
info.setName("南昌三中");
info.setDescription("这是比较好的重点中学");
info.setAddress("南昌市青山湖区");
if (dao.insert(info)) {
System.out.println("新增学校:" + info.getName() + " 成功");
}
}
info = dao.queryInfo("111");
if (info == null) {
System.out.println("学校编号:123 不存在");
} else {
//测试更新操作
info.setAddress("中华人民共和国");
if (dao.update(info)) {
System.out.println("更新学校:" + info.getName() + " 成功");
};
}
//测试删除操作
if (dao.delete("123")) {//可以自己手动创一个新的行,然后删除,就不删除上面创建的了
System.out.println("删除学校成功");
} else {
System.out.println("删除学校失败");
}
//测试查询所有学校信息操作:
System.out.println("===========================================================");
List<SchoolInfo> infoList = dao.queryInfoList();
for (SchoolInfo si : infoList) {
System.out.println("学校编号:" + si.getSchoolID() + "\t学校名称:" + si.getName() +
"\t学校说明:" + si.getDescription() + "\t学校地址:" + si.getAddress());
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
Dao类中的schoolDao接口与它的实现类SchoolDaoImpl
package ycu.Journal.dao.impl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import ycu.Journal.dao.SchoolDao;
import ycu.Journal.pojo.SchoolInfo;
@SuppressWarnings("all")
public class SchoolDaoImpl implements SchoolDao{//这个实现类,就是具体实现操作数据库的类
Connection conn = null;
PreparedStatement pest = null;
ResultSet rs = null;
String sql = "";//用来执行sql语句的
int exCont = 0; //用来存储pest使用查找、修改、删除语句返回影响数据库的行数值
public SchoolDaoImpl(){//要操作数据库,肯定要连接,下面是连接的固定模板,可以直接套用
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ycu?useUnicode=true&characterEncoding=utf8&useSSL=false",
"root","123456");//后面两个参数,分别是数据库的用户名和密码,这是在创建数据库时需要设置的,可以自行查看
/* 两个地方可以修改:
* 1.“127.0.0.1”:表示连接MySQL的服务器端口,在本机所以用本机端口127.0.0.1,也可以换成localhost
* 2.“ycu”:表示数据库的名称,注意,是“数据库”的名称,不是连接端口的名称
* */
} catch (Exception e) {
System.out.println(e.toString());
}
}
protected void finalize() throws Throwable {
//析构函数,老师说是Java的垃圾回收机制,简单理解就是为了最后能够关闭连接的,
//而PreparedStatement的对象pest和ResultSet的对象rs也需要关闭,在后面实现用完就关闭,连接是最后才关闭,所以单独写出了
conn.close();
}
@Override
public boolean insert(SchoolInfo info) throws SQLException {
/*开始实现增加的方法:
* 思路是往数据库中添加,所以下面将会用到PreparedStatement去执行sql语句,往数据库中添加数据
* 关键的sql语句是:insert into tableName(schoolID,schoolName,description,address) value(?,?,?,?)(?表示的是要添加的进去的属性)
* */
sql="INSERT INTO "+ tableName + " (" + fieldID + ","+fieldName + ","
+ fieldDescription + "," + fieldAddress + ") VALUE(?,?,?,?)";
pest=conn.prepareStatement(sql);//用pest预处理conn连接的数据库,简单理解就是在Java中使用sql语句,记得这里使用conn获得了连接,后面就要关闭
//下面是给?设置值,这个值靠形参info给出
pest.setString(1, info.getSchoolID());
pest.setString(2, info.getName());
pest.setString(3, info.getDescription());
pest.setString(4, info.getAddress());
exCont=pest.executeUpdate();
//用完了pest记得养成关闭的好习惯
pest.close();
return exCont > 0;
}
@Override
public boolean delete(String schoolID) throws SQLException {
/*开始实现删除方法:
* 关键的sql语句是:delete from tableName where id=? 靠唯一标识ID来删除数据库表中整行数据
*/
sql="DELETE FROM "+ tableName + " WHERE " + fieldID + " = ?";
pest=conn.prepareStatement(sql);//用pest预处理conn连接的数据库,简单理解就是在Java中使用sql语句,记得这里使用conn获得了连接,后面就要关闭
//下面是给?设置值,这个值靠形参schoolID给出
pest.setString(1, schoolID);
exCont=pest.executeUpdate();//影响行数,等于0表示删除失败
//用完了pest记得养成关闭的好习惯
pest.close();
return exCont > 0;
}
@Override
public boolean update(SchoolInfo info) throws SQLException {
/*开始实现修改方法:
* 关键的sql语句是:update tableName set name = ?,description = ?,address = ? where schoolID = ?
*/
sql="UPDATE "+ tableName + " SET " + fieldName + " = ?," + fieldDescription + " = ?," +
fieldAddress + " = ? WHERE " + fieldID + " = ?";
pest=conn.prepareStatement(sql);
//下面是给 ? 设置值,这个值靠形参info给出
pest.setString(1, info.getName());
pest.setString(2, info.getDescription());
pest.setString(3, info.getAddress());
pest.setString(4, info.getSchoolID());
exCont=pest.executeUpdate();
//用完了pest记得养成关闭的好习惯
pest.close();
return exCont > 0;
}
@Override
public SchoolInfo queryInfo(String schoolID) throws SQLException {
/*开始查找单个学校信息:
* 查找,肯定是要返回查找到的数据信息的,用什么存放呢?就是用ResultSet(结果集)来存放
* 关键的sql语句:select * from where schoolID = ?
* */
sql="SELECT * FROM "+ tableName + " WHERE " + fieldID + " = ?";
pest=conn.prepareStatement(sql);
//下面是给?设置值,这个值靠形参schoolID给出
pest.setString(1, schoolID);
rs=pest.executeQuery();//用rs保存查询结果集,同样道理,这个后面也是需要关闭的
SchoolInfo info = null;//创建需要返回的对象
if(rs.next()){
info = new SchoolInfo();
info.setSchoolID(rs.getString(fieldID));
info.setName(rs.getString(fieldName));
info.setDescription(rs.getString(fieldDescription));
info.setAddress(rs.getString(fieldAddress));
}
//用完了pest和rs记得养成关闭的好习惯
pest.close();
rs.close();
return info;
}
@Override
public List<SchoolInfo> queryInfoList() throws SQLException {
/*开始查找所有学校信息
* 关键sql语句:select * from tableName
* */
sql="SELECT * FROM "+ tableName;
pest=conn.prepareStatement(sql);
rs=pest.executeQuery();
List<SchoolInfo> infolist = new ArrayList<>();
SchoolInfo info = null;
while(rs.next()){//查询结果可能很多,所以用循环
info = new SchoolInfo();//由于有许多SchoolInfo对象,所以需要循环用new开辟空间
info.setSchoolID(rs.getString(fieldID));
info.setName(rs.getString(fieldName));
info.setDescription(rs.getString(fieldDescription));
info.setAddress(rs.getString(fieldAddress));
infolist.add(info);//把对象加入到集合里去
}
return infolist;
}
}
实体类SchoolInfo
package ycu.Journal.pojo;
public class SchoolInfo {
private String schoolID="";
private String name = "";
private String description = "";
private String address = "";
public void setSchoolID(String schoolID) {
this.schoolID = schoolID;
}
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
public void setAddress(String address) {
this.address = address;
}
public String getSchoolID() {
return schoolID;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String getAddress() {
return address;
}
}
注释我都加在代码里了,应该比较好懂(^_−)☆
总结:
1.如何在idea上添加mysql的驱动类
首先,驱动类是什么?简单理解,就是实现jdbc接口的一个实现类。因为Java肯定不能直接操作数据库,肯定是通过一堆方法来操作,而怎么操作(具体方法是什么?)则需要mysql厂商才知道(你操作人家的东西,肯定人家最懂自己的产品),于是乎,就有了mysql驱动类,是一个.jar文件的包。而如何在idea添加呢?步骤如下:
上面这些步骤完成之后,就可以愉快的用Java操作数据库啦~(*^▽^*)
2.Dao模式编程
Dao(Data Access Object,数据访问对象)编程,我这次做的项目比较简单,只有三个层:
即,Dao数据层、pojo实体层、测试层(没有创建包,直接在ycu.Journal包下),严格的Dao模式应该还包括数据库连接关闭层、显示类。上面引了一个大佬的文章,讲得更详细一点。
3.jdbc代码理解
用Java操作数据库包括:
①加载驱动类(Class.forName(...))
②连接数据库(con=DriverManager.getConnection(...))
③使用预处理语句编写sql语句(conn.prepareStatement(...))
④获取影响行数或者结果集(pest.executeUpdate(...)/pest.executeQuery(...))
加载连接数据库:
“增/删/改”的一般jdbc语句:
“查”的一般jdbc语句: