实训小项目01——简单的jdbc实战1

项目描述

        学校实训第一天,企业老师教了基本的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语句:

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这个问题可以用汇编语言来解决。下面是一个可能的解决方案,仅供参考。 首先,我们需要定义一个数组,用于存储每个月份的缩写。可以用如下方式定义: ``` months db 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' ``` 接下来,我们需要获取用户输入的数字,可以使用 DOS 中断 21h 中的功能来实现。具体步骤如下: 1. 调用中断 21h 的 01h 功能,显示提示信息 "Please enter a number (1-12): ",并等待用户输入。 2. 调用中断 21h 的 0Ah 功能,将用户输入的字符串读入到一个缓冲区中。 3. 将缓冲区中的字符串转换为数字,并保存到一个寄存器中。 代码如下: ``` mov ah, 09h ; 01h 功能:显示字符串 lea dx, prompt ; 提示信息 int 21h mov ah, 0Ah ; 0Ah 功能:输入字符串 lea dx, buffer ; 缓冲区 int 21h mov al, buffer[2] ; 第三个字符是用户输入的数字 sub al, '0' ; 将 ASCII 码转换为数字 ``` 接下来,我们需要检查用户输入的数字是否在 1-12 的范围内。如果不是,则显示错误信息并退出程序。否则,将对应月份的缩写输出到屏幕上。 代码如下: ``` cmp al, 1 jl error cmp al, 12 jg error mov dl, months[al-1] ; 获取对应月份的缩写 mov ah, 02h ; 02h 功能:显示字符 int 21h mov dl, months[al] int 21h mov dl, months[al+1] int 21h jmp exit error: mov ah, 09h lea dx, errmsg int 21h exit: mov ah, 4Ch ; 4Ch 功能:退出程序 int 21h prompt db 'Please enter a number (1-12): $' buffer db 3, 0 errmsg db 'Invalid input!$' ``` 完整代码如下: ``` .model tiny .code org 100h start: mov ah, 09h ; 01h 功能:显示字符串 lea dx, prompt ; 提示信息 int 21h mov ah, 0Ah ; 0Ah 功能:输入字符串 lea dx, buffer ; 缓冲区 int 21h mov al, buffer[2] ; 第三个字符是用户输入的数字 sub al, '0' ; 将 ASCII 码转换为数字 cmp al, 1 jl error cmp al, 12 jg error mov dl, months[al-1] ; 获取对应月份的缩写 mov ah, 02h ; 02h 功能:显示字符 int 21h mov dl, months[al] int 21h mov dl, months[al+1] int 21h jmp exit error: mov ah, 09h lea dx, errmsg int 21h exit: mov ah, 4Ch ; 4Ch 功能:退出程序 int 21h prompt db 'Please enter a number (1-12): $' buffer db 3, 0 errmsg db 'Invalid input!$' months db 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' end start ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值