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>
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/15761338.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步