用到的知识:
MySQL
java 基础
JDBC
swing 基础
19.07.10 第一更
开始构造框架,用的MVC框架,第一次接触,大概了解了一下:
MVC模式:
Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
也大概了解了下 模式-架构-框架 之间的区别和联系
共创建了五个包:
com.java1212.view 视图层
com.java1212.dao 数据库访问层
com.java1212.model 实体层
com.java1212.utill 工具包(连接数据库)
pictures 图片素材包
构建工具包
创建DbUtil类,实现连接数据库的getCon方法和关闭closeCon方法
package com.java1212.util;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* 数据库工具类
* @author Administrator
*
*/
public class DbUtil
{
private String driverAddress = "jdbc:mysql://localhost:3306/db_book";//连接数据库的地址
private String userName = "root"; //连接数据库的用户名
private String passWord = "123456"; //连接数据库的用户密码
private String jdbcName = "com.mysql.jdbc.Driver"; //加载驱动的驱动名称
/**
* 获取数据库连接
* @return
* @throws Exception
*/
public Connection getCon()throws Exception
{
Class.forName(jdbcName); //加载驱动
Connection con = DriverManager.getConnection(driverAddress,userName,passWord);//连接数据库
return con;
}
/**
* 关闭数据库连接
* @param con
* @throws Exception
*/
public void closeCon(Connection con)throws Exception
{
if(con != null) //判断是否为空,避免异常
{
con.close(); //断开连接,一定要关,因为占用内存很大
}
}
public static void main(String[] args)
{
DbUtil dbUtil = new DbUtil();
try {
Connection con = dbUtil.getCon();
System.out.println("连接成功");
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
System.out.println("连接失败");
}
}
}
期间出现的问题:
问题(1):
在创建连接数据库的工具类DbUtil类时候,最后连接测试出现了:“No Suitable Driver Found For Jdbc”的错误,检查了下,总结的解决方案:
1.连接URL格式出现了问题(Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/XX","root","XXXX")
2.驱动名称字符串出错 (com.mysql.jdbc.Driver)
3.Class path中没有加入合适的mysql_jdbc驱动,
4.有了驱动还需要将该jar包加入到java运行环境的外部jar包中。
创建DbString类,实现判断字符串是否为空串和是否是非空串
package com.java1212.util;
public class DbString
{
/**
* 判断是否是空
* @param str
* @return
*/
public static boolean isEmpty(String str)
{
if(str == null || "".equals(str.trim())) return true;
else return false;
}
/**
* 判断是否不是空
* @param str
* @return
*/
public static boolean isNotEmpty(String str)
{
if(str == null || "".equals(str.trim())) return false;
else return true;
}
}
构建 实体层,创建User类:
package com.java1212.model;
/**
* 用户的实体
* @author Administrator
*
*/
public class User
{
private int userId; //用户id
private String userName; //用户名称
private String passWord;//用户的登录密码
//构造方法
public User() {
super();
// TODO 自动生成的构造函数存根
}
public User(String userName, String passWord) {
super();
this.userName = userName;
this.passWord = passWord;
}
//属性的get set方法
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
创建UserDao类,User类连接数据库
package com.java1212.dao;
import java.sql.Connection;
import com.java1212.model.User;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao
{
public User login(Connection con, User user)throws Exception
{
/**
* 登录验证
*/
User resultUser = null; //返回的用户类
String sql = "select * from t_user where userName = ? and passWord = ? ;"; //sql语句
PreparedStatement prep = con.prepareStatement(sql); //预处理sql语句
prep.setString(1, user.getUserName()); //用户名
prep.setString(2, user.getPassWord()); //密码
ResultSet resultSet = prep.executeQuery(); //返回一个结果集
if(resultSet.next())
{
resultUser = new User();
resultUser.setUserId(resultSet.getInt("id")); //获取id
resultUser.setUserName(user.getUserName()); //设置用户名
resultUser.setPassWord(user.getPassWord()); //设置密码
}
return resultUser;
}
}
然后创建 视图层,用的是WindowBuilder插件。
实现了登录窗口界面:
1.界面上有显示"图书管理系统“”提示和图书图标。
2.窗口标题是“管理员登录”。
3.有用户名和密码标签。
4.有输入用户名和密码的文本框。
5.有登录按钮和重置按钮。
实现了登录界面的响应:
1.没输入用户名会提示“没输入用户名”。
2.没输密码会提示“没输入密码”。
3.点击重置按钮会清空所以输入的字符。
4.点击登录如果用户名密码不正确会提示“用户名或密码错误”,正确则登录。
效果:
19.07.11 第二更
创建主界面,增加一些菜单,按钮,主要要用WindowBuilder实现
关于窗口最大化WiindowBuilder插件并没有设置,需要手动设置一下,在代码最后面加上:
this.setExtendedState(JFrame.MAXIMIZED_BOTH);//设置JFrame最大化
设置在登录成功后,销毁登录窗口,然后显示主窗口
dispose() //销毁窗口
new MainJFrame().setVisible(true); //默认不可见,设置为可见
设置一下登录窗口居中,将其放在构造方法的最后面
this.setLocationRelativeTo(null); //设置为空,即居中
实现了主界面:
1.增加了菜单栏,中有基本数据维护 和 关于我们 两个一级菜单
2.基本数据维护中有 图书类别管理 和 图书管理 两个二级菜单和关闭系统 一个菜单项
3.图书类别管理中有 图书类别添加 和图书类别维护两个菜单项
4.图书管理中有 图书添加 和 图书维护 两个菜单项
5.关于我们中有 关于开发者 一个菜单项
实现主界面的响应:
1.点击 关闭系统 菜单项后弹出提示,是否关闭,点击是会关闭系统
2.点击 关于开发者 会弹出我的logo
运行一下:
19.07.11 第三更
了解几个关于文本域的方法
方法 | 说明 |
---|---|
bookTypeDescTxt.setBorder(new LineBorder(new java.awt.Color(127,157,185), 1, false)); | 设置边框 |
textArea_1.setLineWrap(true); | 激活自动换行功能 |
textArea_1.setWrapStyleWord(true); | 激活断行不断字功能 |
创建BookType类,图书类型实体
package com.java1212.model;
/**
* 图书类型实体
* @author Administrator
*
*/
public class BookType
{
private int id ; //编号
private String bookTypeName ; //图书类型名称
private String bookTypeDiscribe; //图书类型描述
//构造方法
public BookType(String bookTypeName, String bookTypeDiscribe) {
super();
this.bookTypeName = bookTypeName;
this.bookTypeDiscribe = bookTypeDiscribe;
}
//属性的get set 方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookTypeName() {
return bookTypeName;
}
public void setBookTypeName(String bookTypeName) {
this.bookTypeName = bookTypeName;
}
public String getBookTypeDiscribe() {
return bookTypeDiscribe;
}
public void setBookTypeDiscribe(String bookTypeDiscribe) {
this.bookTypeDiscribe = bookTypeDiscribe;
}
}
创建BookTypeDao类, BookType类需要连接数据库的操作
package com.java1212.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.java1212.model.BookType;
/**
*
* @author Administrator
*return 的是操作的记录数
*/
public class BookTypeDao
{
public int addBookType(Connection con, BookType bookType)throws Exception
{
String sql = "insert into t_bookType values(null,?,?)";
PreparedStatement prep = con.prepareStatement(sql);
prep.setString(1, bookType.getBookTypeName()); //赋值,图书类型
prep.setString(2, bookType.getBookTypeDiscribe()); //设置描述
int result = prep.executeUpdate(); //执行
return result; //返回的是操作数,
}
}
然后是实 现图书类别添加 窗口界面 主要用WindowBuilder实现
1.有图书类别添加标签,图书类别描述标签
2.增添按钮和重置按钮
3.输入图书类别的文本框
4.输入图书类别描述的文本域
下面有一个设置文本域(框)边框的方法,需要了解一下
TextArea.setBorder(new LineBorder(new java.awt.Color(127,157,185), 1, false));
实现的响应:
1.点击增加按钮,如果没有输入图书类别会提示“图书类别为空”,图书描述可以为空
2.如果输入图书类别不为空,则会提示添加成功
3.点击重置按钮会清除所有已经写入的内容
运行:
19.7.11 第四更
连接数据库层中的BookTypeDao类中添加一个list方法,该方法通过传入BookType类对象,返回该对象的图书类型名有关的结果集
public ResultSet list(Connection con, BookType bookType)throws Exception
{
StringBuffer sb = new StringBuffer("select * from t_booktype");
if(DbString.isNotEmpty(bookType.getBookTypeName()))
{
sb.append(" and bookType like '%"+ bookType.getBookTypeName()+ "%' ");
}
PreparedStatement prep = con.prepareStatement(sb.toString().replaceFirst("and", "where")); //预处理
ResultSet ret = null;
ret = prep.executeQuery();
return ret;
}
在使用ResultSet类时,出现了Illegal operation on empty result set的错误,查询后总结如下:
出现错误(2)
错误原因分析:
ResultSet 是个结果集。不能直接取记录的信息,比如:rs.getString("name");
需要循环历遍的,哪怕结果集返回的只有一条记录。
Statement stmt = conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from register where name='cai'");
while(rs.next()){ //这里必须循环遍历
String passwd = rs.getString("psw");//返回一条记录
System.out.println(passwd );
}
关于高级组件(Table类)的一些方法
DefaultTableModel Table.getModel(); //获取模型
void Table.setRowCount(int n); //设置表格行数,为0表示清空
创建了 图书类型查询 窗口:
1.有图书类型名称标签和一个文本框
2.有查询按钮
3.在滚动窗口中添加有表格组件(Table)
实现的响应:
1.在文本框输入图书类型名(可以模糊查询),点击查询按钮,可以在表格中显示所有的有关信息
19.7.12 第五更
这几更将 最结果写在前面
继续构建 图书类别管理 窗口:
1.增加了表单操作面板,有编号,图书类别名称,描述,和对应文本框和文本域
2.修改和删除按钮
实现的响应:
1.通过选择查询到的记录,进行图书类别名称和描述修改,编号无法修改
2.点击修改按钮会保存修改内容,将表格界面刷新,表单面板重置清零。
3.点击删除按钮可以删除选中的记录,会提示是否删除,没有选中的会提示没有选中。
在BookTypeDao类中,增加了两个方法, delete方法用于删除中的操作, upDate用于修改中的操作
public int delete(Connection con, int id)throws Exception
{
String sql = "delete from t_bookType where id = ? ";
PreparedStatement prep = con.prepareStatement(sql); //预编译
prep.setInt(1, id); //设置值
return prep.executeUpdate(); //执行更新
}
public int upDate(Connection con, BookType bookType)throws Exception
{
String sql = "update t_bookType set bookType = ?, bookTypeDiscribe = ? where id = ? ";
PreparedStatement prep = con.prepareStatement(sql); //预编译
prep.setString(1, bookType.getBookTypeName());
prep.setString(2, bookType.getBookTypeDiscribe());
prep.setInt(3, bookType.getId());
return prep.executeUpdate(); //执行更新
}