JAVA实训

项目开发

流程

问题定义---可行性分析---需求分析---概要设计---详细设计(数据库设计)---编码(开发)---测试---上线---运维

数据选型

系统: win Linux mac
开发语言: c.....
开发工具: idea...
.....

三层架构

image

  • 先做dao,因为持久,不轻易改变。
  • 然后做controller,获取数据 逻辑
  • 最后业务层

实体类

封装。

点击查看代码
package com.qf.domain;

public class User {
    private  Integer id;//用户id;
    private  String username;//用户名
    private String password;//密码
    private String avatar;//头像
    private String nickname;//昵称
    /*
     * 无参
     */
    public User() {
        super();
    }
    public User(Integer id, String username, String password, String avatar, String nickname) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.avatar = avatar;
        this.nickname = nickname;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer 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;
    }
    public String getAvatar() {
        return avatar;
    }
    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }



}

dao层

先写接口,再写实现类

面向过程Dao

UserDao接口

package com.qf.dao;

import com.qf.domain.User;

public interface UserDao {
    //增删改 (int类型的值)
    boolean addUser(User user);
    boolean deleteById(int id);//根据id删除用户
    boolean updateById(User user);//根据id修改用户
    //根据用户名和密码查询
    User selectByUserNameAndPassword(String username,String password);
//根据用户条件查询
//List<User> selectUserByUserTools(User user);
}

UserDaoImpl类

//未测试

package com.qf.dao.impl;
import com.qf.dao.UserDao;
import com.qf.domain.User;
import com.qf.utils.DbUtil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//用户dao的实现类
public class UserDaoImpl implements UserDao {
@Override
public boolean addUser(User user) {
//jdbc连接流程
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db_accountSystem?serverTimezone=Asia/Shanghai&CharacterEncoding=utf-8","root",
"root");
//3.执行sql语句增删改查
String sql = "insert into t_user values(null,?,?,?,?)";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//executeUpdate 执行增删改的 返回为int类型
// executeQuery执行查询的 返回为resultSet
// execute 执行是否成功 返回int类型
//设置问号的值
preparedStatement.setString(1,user.getUsername());
preparedStatement.setString(2,user.getPassword());
preparedStatement.setString(3,user.getAvatar());
preparedStatement.setString(4,user.getNickname());
int i = preparedStatement.executeUpdate();
//关闭连接 释放资源
//resultSet.close();
preparedStatement.close();//关闭执行对象
conn.close();//关闭连接对象
if(i>0)
return true;
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
} @
Override
public boolean deleteById(int id) {
//jdbc连接流程
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db_accountSystem?serverTimezone=Asia/Shanghai&CharacterEncoding=utf-8",
"root",
"root");
//3.执行sql语句增删改查
String sql = "delete from t_user where id = ?";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//executeUpdate 执行增删改的 返回为int类型
// executeQuery执行查询的 返回为resultSet
// execute 执行是否成功 返回int类型
//设置问号的值
preparedStatement.setInt(1,id);
int i = preparedStatement.executeUpdate();
//关闭连接 释放资源
//resultSet.close();
preparedStatement.close();//关闭执行对象
conn.close();//关闭连接对象
if(i>0)
return true;
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public boolean updateById(User user) {
Connection connection = DbUtil.getConnection();
String sql = "update t_user set username=?,password=?,avatar=?,nickname=? where id = ?";
PreparedStatement statement = DbUtil.getStatement(sql);
try {
statement.setString(1,user.getUsername());
statement.setString(2,user.getPassword());
statement.setString(3,user.getAvatar());
statement.setString(4,user.getNickname());
statement.setInt(5,user.getId());
int i = statement.executeUpdate();
//调用关闭方法
DbUtil.close(connection,statement,null);
if(i>0)
return true;
return false;
} catch (SQLException e) {
throw new RuntimeException(e);
}
} @
Override
public User selectByUserNameAndPassword(String username, String password) {
return null;
}
}

jdbc的使用

  1. 导入驱动文件(数据库厂商提供)
    低版本的驱动对应低版本的数据库,高版本的驱动对应高版本的数据库,高版本的向下兼容

导入jar包
选择file->projec Structure
image
2. 建立连接connection

 Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3307/db_accountSystem?serverTimezone=Asia/Shanghai&CharacterEncoding=utf-8",
                    "root",
                    "usbw");

注意:

高版本数据库默认了时区,需要人工设置
设置方法:
?serverTimezone=GMT%2B8//意思为:标准时区+8时区
或者?serverTimezone=Asia/Shanghai//上海

  1. 获取执行对象 statement(PreparedStatement 预编译的执行对象)
//增加sql语句
String sql = "insert into t_user values(null,?,?,?,?)";
PreparedStatement preparedStatement=conn.prepareStatement(sql);
  1. 执行sql语句(execute方法 )
//executeUpdate 执行增删改的 返回为int类型
// executeQuery执行查询的 返回为resultSet
// execute 执行是否成功 返回int类型
//设置问号的值
preparedStatement.setString(1,user.getUsername());
preparedStatement.setString(2,user.getPassword());
preparedStatement.setString(3,user.getAvatar());
preparedStatement.setString(4,user.getNickname());
int i = preparedStatement.executeUpdate();
  1. 遍历结果进行处理(resultSet 填充到对象中)
  2. 关闭连接(后打开的先关闭)
//关闭连接 释放资源
//resultSet.close();
preparedStatement.close();//关闭执行对象
conn.close();//关闭连接对象

面向对象JDBC

封装的dbutil

package com.qf.utils;

import java.sql.*;

public class DbUtil {
    private static Connection conn;
    private static PreparedStatement preparedStatement;

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3307/db_accountSystem?serverTimezone=Asia/Shanghai&CharacterEncoding=utf-8",
                    "root",
                    "usbw");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        return conn;
    }

    public static PreparedStatement getPreparedStatement(String sql) {

        try {
            preparedStatement = conn.prepareStatement(sql);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return preparedStatement;
    }

    /*
     * 关闭连接对象
     * */
    public static void close(Connection conn1, Statement statement1, ResultSet resultSet1) {
        {
            try {
                if (resultSet1 != null) resultSet1.close();//关闭连接
                if (statement1 != null) statement1.close();
                preparedStatement = null;//清空该类
                if (conn1 != null) conn1.close();
                conn = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

高级面向对象JDBC

抽取数据库连接的配置文件

利用properties文件抽取对应的mysql连接参数作为配置文件
db.properties

#数据库连接的配置文件
jdbcDriver=com.mysql.cj.jdbc.Driver
jdcUrl=jdbc:mysql://localhost:3307/db_accountSystem?serverTimezone=Asia/Shanghai&CharacterEncoding=utf-8
jdbcUser=root
jdbcPassword=usbw

读取配置书写帮助类

DbUtil

package com.qf.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.*;
import java.util.Properties;

/**
 * 封装sql连接及关闭的相关代码
 */
public class DbUtil {
    private static Connection conn;
    private static PreparedStatement preparedStatement;

    //抽取数据库连接
    static {
        //读取properties文件里面的数据
        Properties properties = new Properties();//存储对应的配置文件里面的数据
        //1.加载驱动
        try {
            FileInputStream in = new FileInputStream("D:\\EndWork2\\src\\db.properties");//利用流读取文件里面的数据
            properties.load(in);//将文件的内容加载到properties里
            //根据key获取properties里面的属性值
            String jdbcDriver = properties.getProperty("jdbcDriver");
            String jdbcUrl = properties.getProperty("jdbcUrl");
            String jdbcUser = properties.getProperty("jdbcUser");
            String jdbcPassword = properties.getProperty("jdbcPassword");

            Class.forName(jdbcDriver);
            //2.建立连接
            conn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 封装的返回连接对象的方法
     */
    public static Connection getConnection() {
        return conn;
    }

    /**
     * 封装的返回执行对象的方法
     */
    public static PreparedStatement getPreparedStatement(String sql) {

        try {
            preparedStatement = conn.prepareStatement(sql);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return preparedStatement;
    }

    /*
     * 关闭连接对象
     * */
    public static void close(Connection conn1, Statement statement1, ResultSet resultSet1) {
        {
            //关闭连接 释放资源
            try {
                if (resultSet1 != null) resultSet1.close();//关闭连接
                if (statement1 != null) statement1.close();
                preparedStatement = null;//将该类原本的值还原为空
                if (conn1 != null) conn1.close();
                conn = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

页面书写(GUI)

GUI概述: 图形化界面。
利用后台编码编写页面,通常会借用一些包来构建。
JAVA中用于构建GUI的包是
awt包(老版本),swing包(新版本)。

参考JDK
JDK API

入门案例

package com.qf.views;

import javax.swing.*;
import java.awt.*;

/*
登录的页面类
继承了JFrame 意思是当前是窗口类
* */
public class LoginView extends JFrame {
    public static void main(String[] args) {
        //创建窗口
        LoginView loginView=new LoginView();

        loginView.setLayout(new BorderLayout());

        //设置窗口的大小
      //  loginView.setSize(430,333);
        //设置对应的位置机器大小
        loginView.setBounds(500,500,430,333);
        //设置标题
        loginView.setTitle("酒家管理系统");
        //设置对应的关闭
        loginView.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置输入框
        TextField textField=new TextField();
        textField.setBounds(500,500,100,20);
        loginView.add(textField);

        //设置按钮
        Button SignButton=new Button("Sign");
        SignButton.setBackground(Color.blue);
        SignButton.setBounds(85,200,235,35);
        loginView.add(SignButton);

        Button SignUpButton=new Button("Sign up");
        SignUpButton.setBackground(Color.gray);
        SignUpButton.setBounds(105,250,200,25);
        loginView.add(SignUpButton);
        
        //设置显示
        loginView.setVisible(true);
    }
}

常用布局

边框布局

概述:
可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。
每个区域最多只能包含一个组件,并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER。
当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一。
测试代码:

 loginView.setLayout(new BorderLayout());
        loginView.add(new Button("North"),BorderLayout.NORTH);
        loginView.add(new Button("South"), BorderLayout.SOUTH);
        loginView.add(new Button("CENTER"),BorderLayout.CENTER);
        loginView.add(new Button("East"), BorderLayout.EAST);
        loginView.add(new Button("West"), BorderLayout.WEST);

测试代码样式
image

盒子布局

概述:
运行一行或一列中进行相关的布局
一行多个: X_AXIS
一列多个: Y_AXIS
测试代码:

  JPanel jPanel=new JPanel();
        Container contentPane = loginView.getContentPane();
        loginView.setLayout(new BoxLayout(contentPane,BoxLayout.X_AXIS));
        contentPane.add(new Button("1"));
        contentPane.add(new Button("2"));
        contentPane.add(new Button("3"));

测试代码样式
image

表格布局

就是表格那..
测试代码:

 //表格布局
        loginView.setLayout(new GridLayout(3,2));
        loginView.add(new Button("1"));
        loginView.add(new Button("2"));
        loginView.add(new Button("3"));
        loginView.add(new Button("4"));
        loginView.add(new Button("5"));
        loginView.add(new Button("6"));

测试代码样式
image

FlowLayout 流式布局

(针对按钮的默认布局)

Swing组件介绍

JFanel: 顶级窗口对象 类似与html的div
JPanel:容器对象

JPasswordField: 密码输入框
JTextField: 文本输入框
JTextArea : 文本域

JTable: 表格
JScrollBar: 滚动条
JRadioButton:单选按钮
JCheckbox: 复选框
JList: 下拉列表
Jlabel: 显示文本小组件
JDialog: 创建对话弹窗组件
JMenu: 菜单栏

Box:盒子 不受布局影响的布局

static Box createHorizontalBox() 创建一个从左到右显示其组件的 Box。(放在一行)
static Component createHorizontalGlue() (放在一列)创建一个横向 glue 组件。

解决JButton.setBounds()不生效

直接使用JButton.setBounds()设置了按钮的大小和在父组件中的位置:SignButton.setBounds(85,200,235,35);
运行时UI设置并不生效。
原因:
该方法需要在布局管理器为空时才奏效。
所以:
提前指定布局管理器为空即可:
loginView.setLayout(null);

FXML

类似于html,一种便于调试的xml形式的代码书写方式

设置页面运行入口

package com.qf;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

//视图页面运行的入口
public class MainApplication extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws IOException {
        //设置窗口标题
         primaryStage.setTitle("欢迎登录");
         //加载对应的fxml成为一个节点
        Parent root = FXMLLoader.load(getClass().getResource("views\\LoginView.fxml"));//相对路径
       //将加载的节点变为根节点,可选择设置窗口的大小
        Scene scene = new Scene(root);
        //设置节点
        primaryStage.setScene(scene);
       //设置显示
        primaryStage.show();
    }
}

设置界面

设置图片

 <HBox alignment="CENTER">
       <ImageView fitHeight="150" fitWidth="200" pickOnBounds="true" preserveRatio="true">
           <image>
               <Image url="@../images/welcome.png"/>
           </image>
       </ImageView>
     </HBox>

设置输入框

 <HBox alignment="CENTER">
        <Label text="用户名" />
        <TextField promptText="请输入用户名" />
     </HBox>

设置密码输入框

 <HBox alignment="CENTER">
       <Label text="密码" />
       <PasswordField promptText="请输入密码" />
     </HBox>

设置按键

<HBox alignment="CENTER">
       <Button text="登录" />
       <Button text="注册" />
     </HBox>

连接动作

loginController

package com.qf.controller;
import javafx.fxml.FXML;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
//登录控制类
public class LoginController {
@FXML
private TextField usernameInput;//接收jfx里面的组件 名字必需要和对于的fxml里面的组
件名一样
@FXML
private PasswordField passwordInput;//接收jfx里面的组件
//登录的方法
//在对于fxml里面调用必须带一个#
@FXML
void login(){
System.out.println("点击了登录");
System.out.println(usernameInput.getText());
System.out.println(passwordInput.getText());
}
//注册的方法
@FXML
void register(){
System.out.println("点击注册");
System.out.println(usernameInput.getText());
System.out.println(passwordInput.getText());
}
}

loginView.fxml

<?xml version="1.0" encoding="UTF-8"?>
<!--导包-->
<!--页面代码主体-->
	<?import javafx.scene.control.*?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.*?>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0"
xmlns="http://javafx.com/javafx/8.0.2-internal"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.qf.controller.LoginController" spacing="20">
<children>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<!-- <ImageView image="@../images/welcome.png" fitHeight="300"
fitWidth="300"></ImageView>-->
<ImageView fitHeight="150.0" fitWidth="200.0"
pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../images/welcome.png"/>
</image>
</ImageView>
</HBox>
<HBox alignment="CENTER" spacing="15">
<Label text="用户名:" />
<TextField fx:id="usernameInput" promptText="请输入用户名" />
</HBox>
<HBox alignment="CENTER" spacing="15">
<Label text="密 码:" />
<PasswordField fx:id="passwordInput" promptText="请输入密码" />
</HBox>
<HBox alignment="CENTER" spacing="40">
<Button text="注册" onAction="#register" />
<Button text="登录" onMouseClicked="#login" />
</HBox>
</children>
</VBox>
posted @ 2022-01-04 09:35  kingwzun  阅读(68)  评论(0编辑  收藏  举报