一、预备工作
首先,需要下载安装MYSQL(可去官网根据自己的系统下载安装相应版本)
其次,一系列安装MYSQL的流程如下:
- 在mysql文件夹下创建my.ini 配置文件,内容如下(basedir和datadir均为自己电脑上的路径):
(若安装路径出错,可使用双\,为了防止转义字符 )
[mysql]
# 设置mysql客户端默认字符集
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=MYSQL实际解压路径
# 设置mysql数据库的数据的存放目录——若无,会自动创建data文件夹
datadir=MYSQL实际解压路径中的data文件路径
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
- 配置环境变量,在系统变量中的path里填入MYSQL文件夹中的bin文件夹解压路径(环境变量如何配置请自行上网查询)。
- 初始化MYSQL
- 以管理员身份打开黑窗口(即命令提示符窗口),然后进入MySQL的bin目录
- 然后执行命令
mysqld --initialize --console
,生成的代码中记住root@localhost:
之后的密码 - 然后执行
mysqld --install
,成功后重新以管理员身份打开黑窗口,输入net start mysql
运行MYSQL - 然后输入
mysql -u root –p
后面跟的是第二步的密码 - 然后修改密码,输入
alter user ‘root‘@’localhost’identified with mysql_native_password by ‘新密码’;
(方式有很多种,上网搜索)即可修改成自己想要的密码 - 然后即可用MySQL的相关命令来查看MYSQL是否安装及相关信息
- 在这一套流程过程中遇到的问题请自行上网搜索原因
然后,可以学习一下各种MYSQL的知识点,牢记SQL语句,这在之后有很大用处;操作数据库可以使用MYSQL可视化工具(例如SQLyog、navicat等)来方便操作数据库,当然也不能不记SQL语句
最后,我们需要把数据库和编码工具(这里我使用的时idea,所以都以idea而言)连接起来,这时就需要JDBC。相关步骤如下:
- 下载jdbc驱动jar包,可以去MYSQL官网下载页,也可以去MVN repository仓库下载。
- 然后在idea中创建java项目,在项目中创建一个lib目录如下图:
- 将jdbc驱动jar包拖入lib目录中,右键该目录选择Add as Library…,之后就成功把jdbc驱动jar包导入。
这个out目录是src目录右键后点击Build Module '项目名’后出现的;out目录存放的是编译结果。
然后可以创建一个db.properties文件存入数据库信息,如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/results
username=root
password=123456
- 最后,会在相应的工具类(可命名JdbcUtil)中接入db.properties文件的内容来连接数据库,至此idea和MYSQL便连接成功了。
二、学会使用JFormDesigner
要想做出数据管理系统自然少不了图形化界面,这里我推荐JFormDesigner,该插件是一款收费插件,破解方式由自己寻找。
这里我们以下图为例:
最外面是JFrame,其次是JPanel
关于为什么用JDesktopPane铺满窗口,是因为在窗口里打开的窗口JInternalFrame只能在JDesktopPane上才能显示出来。上图中JMenu等的作用自行搜索。
JInternalFrame是什么?示例如下:
至于JTable放在JScrollPane上,是因为避免书籍过多超过此框放不下,JScrollPane可生成滚动条,使其放的下。
至于JFormDesigner其他的功能自行上网查询:
三、写数据库管理系统时的主要操作
第一步,我们要建好5个包:dao、main、model、util、view:
- dao包是操作的包,里面放一些dao类,用来增删改查操作数据库中的类
- main包是运行包,用来运行程序
- model包用来存放实体类
- util包是工具包
- view包是放可视化工具和类的包
- 如下:
然后在main包中创建main类用来new之后的login类(即首页类),来运行管理系统
第二步,在util包中写JdbcUtil类,把项目和数据库连接起来,这个类的具体代码如下:
//链接数据库
public class JdbcUtil {
//事先声明
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
//静态代码块
static {
try {
//下面这几步就是把db.properties的内容接入的方法
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
//将mysql驱动注册到DriverManager中去
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
//获取数据库连接
return DriverManager.getConnection(url,username,password);
}
//非持续性连接,在结束后断开连接,释放资源
public static void release(Connection conn, Statement st, ResultSet rs) {
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
第三步,在model包中创建自己想要操作的实体类,在dao包中创建这个实体类的dao类(这个dao类是操作数据库的类):
实体类例如:
//这是个实体类,用来写get、set方法和各种重载的构造函数
public class User {
private int id;
private String userName;
private String password;
public User() {
super();
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
dao类例如:
//登录验证
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=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1,user.getUserName());
pstmt.setString(2,user.getPassword());
ResultSet rs = pstmt.executeQuery();
if (rs.next()){
resultUser = new User();
//下面的id、userName、password是数据库中的,字符不可以写的与数据库中不相同
resultUser.setId(rs.getInt("id"));
resultUser.setUserName(rs.getString("userName"));
resultUser.setPassword(rs.getString("password"));
}
return resultUser;
}
}
由于用户是用来登录的,所以这个例子只展示了查询语句;dao类里面也可以写增删改的操作。
其他的,例如:
// 图书删除
public int delete(Connection con,String id)throws Exception{
String sql = "delete from t_book where id=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1,id);
return pstmt.executeUpdate();
}
第四步,在view中利用JFormDesigner来创建图形化界面,例如:
上面是创建该图形化界面自动生成的java类,下面这个就是类似二、学会使用JFormDesigner
中的例子这些自动生成的java类中有自动生成的代码,我们也可以在其中手动操作一些代码,例如:
为按钮添加监听事件,会自动创建一个方法在Login类(上上面图中)中:
private void button1Action(ActionEvent evt) {
// TODO add your code here
}
如果是登录功能的话,例如:
private void button1Action(ActionEvent evt) {
String userName = this.usernameTxt.getText();
// new String()把pass的类型转为String类型
String password = new String(this.passwordTxt.getPassword());
// 这里是写了个工具类,然后调用来判断是否为空
if (StringUtil.isEmpty(userName)){
JOptionPane.showMessageDialog(null,"用户名不能为空");
return;
}
if (StringUtil.isEmpty(password)){
JOptionPane.showMessageDialog(null,"密码不能为空");
return;
}
User user = new User(userName,password);
Connection con = null;
try {
con = jdbcUtil.getCon();
//这个是调用userDao里的login方法,把con和user传入,然后经过其中的判断,来验证账号和密码是否正确,是否能打开新的界面
User currentUser = userDao.login(con, user);
if (currentUser !=null){
// JOptionPane.showMessageDialog(null,"登陆成功");
dispose();
new MainFrm();
}else {
JOptionPane.showMessageDialog(null,"用户名或密码错误");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
jdbcUtil.closeCon(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
基本上所有的事件都是由第四步这个步骤写出来的,只是其中的内容不同而已。
另外,有些东西需要初始化,这些方法就需要我们自己写出来了,例如:
// 初始化下拉框、、、、、下拉框类型
private void fillBookType(String type){
Connection con = null;
BookType bookType = null;
try {
con = jdbcUtil.getCon();
ResultSet rs = bookTypeDao.list(con, new BookType());
if ("search".equals(type)){
bookType = new BookType();
bookType.setBookTypeName("请选择……");
bookType.setId(-1);
this.s_bookTypeJcb.addItem(bookType);
}
while (rs.next()){
bookType = new BookType();
bookType.setBookTypeName(rs.getString("bookTypeName"));
bookType.setId(rs.getInt("id"));
if ("search".equals(type)){
this.s_bookTypeJcb.addItem(bookType);
}else if ("modify".equals(type)){
this.bookTypeJcb.addItem(bookType);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
dbUtil.closeCon(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是创建一个需求类以及监听事件的操作。
总结,每一个数据库中需要操作的类(学生类、书籍类等)都需要创建一个实体类和一个dao类;所有的图形化界面上的操作与逻辑在view中生成的java类中操作(添加事件等)。
四、注意
1.有时,JInternalFrame没有显示在JDesktopPane,这个时候我们就需要这样(红框内的):
下面的几个调用都是为了初始化界面。
2.当利用自动生成的窗口的×键关闭界面时,JFrame窗口关闭了,但是程序没有;这个时候我们就需要在其自动生成的代码中加入setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
,如图:
或者(JFromDesigner中自带的控制属性,后面选项选为dispose或exit)
3.关于内部窗口重复打开的问题
可以在一个view的类里面加入一个全局静态变量,例如:
在内部窗口类这么搞:
在主窗口(有打开内部窗口按钮的窗口)中写:
然后由于这个布尔变量是一个全局静态变量,可以直接用类名来调用到其他内部窗口中;然后所有内部窗口都进行上面的操作就可以实现每次只打开一个内部窗口了。
4.其他问题等发现时再填入…