JAVA实训
项目开发
流程
问题定义---可行性分析---需求分析---概要设计---详细设计(数据库设计)---编码(开发)---测试---上线---运维
数据选型
系统: win Linux mac
开发语言: c.....
开发工具: idea...
.....
三层架构
- 先做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的使用
- 导入驱动文件(数据库厂商提供)
低版本的驱动对应低版本的数据库,高版本的驱动对应高版本的数据库,高版本的向下兼容。
导入jar包
选择file->projec Structure
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
//上海
- 获取执行对象 statement(PreparedStatement 预编译的执行对象)
//增加sql语句
String sql = "insert into t_user values(null,?,?,?,?)";
PreparedStatement preparedStatement=conn.prepareStatement(sql);
- 执行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();
- 遍历结果进行处理(resultSet 填充到对象中)
- 关闭连接(后打开的先关闭)
//关闭连接 释放资源
//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);
测试代码样式
盒子布局
概述:
运行一行或一列中进行相关的布局
一行多个: 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"));
测试代码样式
表格布局
就是表格那..
测试代码:
//表格布局
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"));
测试代码样式
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>