IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

系列文章目录

IDEA上面书写wordcount的Scala文件具体操作

IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍

目录

系列文章目录

前言

一 准备工作

1.1 安装Maven

1.1.1 Maven安装配置步骤

1.1.2 解压相关的软件包

1.1.3 Maven 配置环境变量

1.1.4 配置Maven的私服

1.2 创建一个本地的MySQL数据库和数据表

二 创建Java项目

2.1 方式一 数据库连接池druid

2.1.1 MySQL-connector-java资源分享链接

2.1.2 druid资源链接

2.2 创建Java项目步骤如下

2.2.1 创建项目目录

2.2.2  创建一个新的Java类

2.2.3 导入jar包 

 2.2.4 将jar包加载到library

 2.2.5 编写Java代码

版本一 

版本二

2.3 方式二 配置文件的形式加载

2.3.1 在src目录之下创建配置文件

2.3.2 在配置文件当中添加如下的信息

2.3.3 创建一个demo2的Java文件

 2.3.4 编辑Java代码

三 在IDEA上创建Maven项目来实现上述的功能

3.1 创建项目

 3.2 创建一个Java类

 3.3 编辑Java代码和配置文件

3.4 Java代码模块讲解

3.4.1 Java Scanner 类

3.4.2 系统添加数据模块方法

3.4.3  编辑MySQL与druid依赖

3.4.4 编辑插入数据方法

3.4.5 编辑查询代码

3.4.6  完整的优化后的代码

思考——如何优化上述的Java代码? 

总结


前言

本文主要介绍IDEA项目实践,创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

一 准备工作

1.1 安装Maven

Maven资源分享包

链接:https://pan.baidu.com/s/1D3SHLKTMTTUDYLv45EXgeg?pwd=kmdf 
提取码:kmdf

1.1.1 Maven安装配置步骤

1. 解压 apache-maven-3.6.1.rar 既安装完成
2. 配置环境变量 MAVEN_HOME 为安装 路径,在 Path 添加 %MAVEN_HOME%/bin 目录
3. 配置本地仓库:修改 conf /settings.xml 中的 < localRepository > 为一个指定目录
4. 配置阿里云私服:修改 conf /settings.xml 中的 <mirrors> 标签,为其添加如下子标签

1.1.2 解压相关的软件包

解压你的Maven包,放在你的文件夹里面,配置相关的本地仓库文件

1.1.3 Maven 配置环境变量

 打开Windows1的高级设置,配置相关的环境变量

第一处

MAVEN_HOME

D:\apache-maven-3.9.3

第二处 

 Path

%MAVEN_HOME%/bin

1.1.4 配置Maven的私服

 需要添加的内容如下:

<mirror>  
<id>alimaven</id>  
<name>aliyun maven</name>  
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>          
</mirror>

创建一个本地仓库文件夹【myRepository】你的仓库创建在你安装了Maven的地方。

在notepad++查找本地的【localRepository

没有notepad++也可以使用记事本编辑,只要将内容修改完,并且保存完成即可。

 在setting文件夹里面加入本地仓库位置

<localRepository>D:\apache-maven-3.9.3\myRepository</localRepository>

 查找mirrors位置,修改为阿里的私服。

 添加完成之后记得保存~

编辑完成之后退出。本地仓库就配置完成了。

1.2 创建一个本地的MySQL数据库和数据表

在此之前,需要配置本地MySQL服务的连接如下:

 MySQL以及MySQL workbench的安装与配置【超详细安装教程】

创建数据库和数据表的SQL语句 

// 创建名为 test 的数据库
CREATE DATABASE test;
// 使用 test 数据库
USE test;
// 创建名为 websites 的表
CREATE TABLE `websites` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL DEFAULT '' COMMENT '站点名称',
  `url` varchar(255) NOT NULL DEFAULT '',
  `alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
  `country` char(10) NOT NULL DEFAULT '' COMMENT '国家',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
// 在 websites 中插入数据
INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '2', 'USA'), 
('2', '淘宝', 'https://www.taobao.com/', '13', 'CN'), 
('3', '菜鸟教程', 'http://www.runoob.com', '5892', 'CN'), 
('4', '微博', 'http://weibo.com/', '20', 'CN'), 
('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA'),
('6', 'JueJin', 'https://www.juejin.cn/', '2213', 'CN');

创建之后的数据库如下图所示的界面: 

二 创建Java项目

2.1 方式一 数据库连接池druid

创建步骤如下:

1. 导入jar包(mysql-connection-java.jar,druid.jar),同时加入到类加载路径中
2. 直接创建连接池对象:new对象 DruidDataSource
3. 然后设置属性。
   1. setDriverClassName()
   2. setUrl()
   3. setUsername()
   4. setPassword()
   5. setInitialSize()  //初始连接数
   6. setMaxSize()   //最大连接数
   7. setMaxWait()   //最大等待时间
4. 通过连接池对象,获取数据库连接

方式一的缺点:将MySQL的URL和用户以及密码是写死的,当你要修改的时候不好修改

2.1.1 MySQL-connector-java资源分享链接

MySQL-connector-java-8.0.31版本百度网盘连接

链接:https://pan.baidu.com/s/1A2NtVswiJjvxFB68GZ77Vw?pwd=wcmo 
提取码:wcmo

MySQL-connector-java-5.1.49版本百度网盘连接

链接:https://pan.baidu.com/s/1FPL23h6Ca7_Y0N_HYZSm0Q?pwd=6kwi 
提取码:6kwi

2.1.2 druid资源链接

druid-1.1.12版本

链接:https://pan.baidu.com/s/13Bwl-R3gN0fU5qHAGFHzwA?pwd=gu9g 
提取码:gu9g

2.2 创建Java项目步骤如下

2.2.1 创建项目目录

选择创建Java文件

 继续下一步

 创建你的问价存储位置,此处建议专门写一个存放IDEA项目的文件夹。

2.2.2  创建一个新的Java类

在src文件里面创建一个新的Java类

名字为: com.ambow.druid.DruidDemo

解释——前三个为包名称,后面为类名称。

2.2.3 导入jar包 

在项目里面新建一个文件夹导入前面的两个jar包【MySQL-connector-java-8.0.31和druid-1.1.12

】,需要自己创建一个libs文件夹存放这两个jar包。

 此处记得选择自己的MySQL对应的Java包,下载之后,将两个jar包复制,将其粘贴在libs文件夹里面即可。

 此处点击ok即可。

同上

 2.2.4 将jar包加载到library

在两个jar包上面,鼠标右键,选择as a library加载

 点击OK即可

 2.2.5 编写Java代码

版本一 

package com.ambow.druid;
import java.sql.*;
//方式一: druid的数据库连接池
public class DruidDemo {
    // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
//    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
//    static final String DB_URL = "jdbc:mysql://localhost:3306/test";

    // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";


    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "root";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);

            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, url FROM websites";
            ResultSet rs = stmt.executeQuery(sql);

            // 展开结果集数据库
            while (rs.next()) {
                // 通过字段检索
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");

                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 站点名称: " + name);
                System.out.print(", 站点 URL: " + url);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch (Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (stmt != null) stmt.close();
            } catch (SQLException se2) {
            }// 什么都不做
            try {
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

运行结果如下:

版本二

代码演示

package com.ambow.druid;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
    方式一: 直接创建DruidDataSource ,然后设置属性
 */
public class DruidDemo {
    public static void main(String[] args) throws SQLException {
        DruidDataSource dds = new DruidDataSource();
        dds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dds.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC");
        dds.setUsername("root");
        dds.setPassword("root");

        dds.setInitialSize(5);//初识连接数
        dds.setMaxActive(10);//最大连接数
        dds.setMaxWait(3000);//最大等待时间

        //获取连接
        DruidPooledConnection connection = dds.getConnection();
        System.out.println(connection);

        //获取执行语句对象
        String sql = "select * from websites";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        //获取结果集
        ResultSet rs = pstmt.executeQuery();
        while (rs.next()){
           System.out.println(rs.getInt(1) + "-" + rs.getString(2) + "-" +          
                 rs.getString(3) + "-" +  rs.getInt(4) + "-" +  rs.getString(5));
        }
        /*
            jdbc连接的四个参数:
                driver
                url
                username
                password
         */
    }
}

 运行结果:

2.3 方式二 配置文件的形式加载

  •  导入jar包 mysql-connection-java.jar、druid-1.1.12.jar
  •  定义配置文件
  •  加载配置文件
  •  获取数据库连接池对象
  •  获取连接

此处的代码实现,首先也需要先将druid的jar包放到项目下的lib下并添加为库文件,与前面一样的形式创建。

2.3.1 在src目录之下创建配置文件

文件名称为: druid.properties

PS:Java里面的配置文件为properties类型

2.3.2 在配置文件当中添加如下的信息

将用户以及密码哪些信息写入配置文件 

此处为8.0以上版本的书写方法

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///test?serverTimezone=UTC
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

以下为5.1 版本的写法【举例如下】

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://182.168.1.1/test
username=root
password=root
# ???????
initialSize=5
# ?????
maxActive=10
# ??????
maxWait=3000


//前面的是IP地址以及数据库的名称

2.3.3 创建一个demo2的Java文件

 

 2.3.4 编辑Java代码

此处只是一个获取连接的代码 

package com.ambow.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

/*
    方式二:提取配置文件(把连接数据库的参数,抽取出来)
 */
public class DruidDemo2 {
    public static void main(String[] args) throws Exception {
        //获取当前项目的根目录
        System.out.println(System.getProperty("user.dir"));
        // 加载配置文件
        Properties prop = new Properties();
        //FileInputStream is = new FileInputStream("src/druid.properties");
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        prop.load(is);
        // 获取数据库连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(prop);
        // 获取连接
        Connection connection = ds.getConnection();
        System.out.println(connection);
    }
}

运行结果:

 注意:

System.getProperty("user.dir"),在web项目,返回值就不是项目的根目录了,而是tomcat的bin目录。

三 在IDEA上创建Maven项目来实现上述的功能

3.1 创建项目

在file里面选择创建新的项目,选择Maven项目

 填写项目的名称,以及公司名称

 点击finsh即可。

此处补全一个资源文件夹

 3.2 创建一个Java类

 3.3 编辑Java代码和配置文件

编辑配置文件的方法与2.3.2 一样,此处不再赘述。 

在刚才的类里面编辑Java代码

package com.ambow.druid;

import java.sql.*;
import java.util.Scanner;


public class App {
    static final String JDBC_DRIVER="com.mysql.cj.jdbc.Driver";
    static final String DB_URL="jdbc:mysql://localhost:3306/test";
    static final String USER = "root";
    static final String PASS ="root";
    static Scanner sc =new Scanner(System.in);//成为类成员前面加入static修饰
    public static void main(String[] args) throws SQLException {
//        DruidDataSource dds = new DruidDataSource();
//        dds.setDriverClassName("com.mysql.jdbc.Driver");
//        dds.setUrl("jdbc:mysql://192.168.127.100:3306/db2");
//        dds.setUsername("root");
//        dds.setPassword("Admin2023!");
//        dds.setInitialSize(5);
//        dds.setMaxActive(10);
//        dds.setMaxWait(3000);
//        DruidPooledConnection connection = dds.getConnection();
//        System.out.println(connection);
        //加入循环
        while (true) {
            System.out.println("***********************************");
            System.out.println("*********** 站点管理系统  ***********");
            System.out.println("*********** 1.新增站点   ***********");
            System.out.println("*********** 2.修改站点   ***********");
            System.out.println("*********** 3.删除站点   ***********");
            System.out.println("*********** 4.查询站点   ***********");
            System.out.println("*********** 0.退出系统   ***********");
            System.out.println("**********************************");
            System.out.println("请选择:");
            //静态方法只能访问静态变量
            int choose = sc.nextInt();
            switch (choose){
                case 1:
                    addWebSite();
                    break;
                case  2:
                    modifyWebSite();
                    break;
                case 3:
                    dropWebSite();
                    break;
                case 4:
                    queryWebSite();
                    break;
                case 0:
                    System.out.println("退出系统");
                    System.exit(0);
                    break;
                default:
                    System.out.println("对不起,您的选择有误!");
                    break;
            }
        }
    }
    //        String sql ="select * from websites";
//        PreparedStatement pstmt =connection.prepareStatement(sql);
//        ResultSet rs = pstmt.executeQuery();
//        while (rs.next()){
//            System.out.println(rs.getInt(1) +"-"+ rs.getString(2) +"-"+ rs.getString(3)
//                    +"-"+ rs.getInt(4) +"-"+ rs.getString(5));
//        }
//        rs.close();
//        pstmt.close();
//        connection.close();
//    }
    private static void addWebSite() {
        System.out.println("请输入站点名称:");
        String name = sc.next();
        System.out.println("请输入站点URL:");
        String url = sc.next();
        System.out.println("请输入站点alexa:");
        int alexa = sc.nextInt();
        System.out.println("请输入站点所属国家:");
        String country = sc.next();
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName((JDBC_DRIVER));
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            String sql ="insert into websites values(null,?,?,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,name);
            pstmt.setString(2,url);
            pstmt.setInt(3,alexa);
            pstmt.setString(4,country);
            pstmt.executeUpdate();
            System.out.println("添加站点成功!");
        }catch (SQLException se){
            se.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(pstmt!=null) pstmt.close();
            }catch (SQLException se2){

            }
            try{
                if(conn!=null) conn.close();
            }catch (SQLException se){
                se.printStackTrace();
            }
        }

    }
    private static void modifyWebSite() {
        System.out.println("请输入要修改的站点名称:");
        String name = sc.next();
        System.out.println("请输入新站点URL:");
        String url = sc.next();
        System.out.println("请输入新站点alexa:");
        int alexa = sc.nextInt();
        System.out.println("请输入新站点所属国家:");
        String country = sc.next();
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName((JDBC_DRIVER));
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            String sql ="update websites set url=?,alexa= ?,country=? where name=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,name);
            pstmt.setString(2,url);
            pstmt.setInt(3,alexa);
            pstmt.setString(4,country);
            pstmt.executeUpdate();
            System.out.println("修改站点成功!");
        }catch (SQLException se){
            se.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(pstmt!=null) pstmt.close();
            }catch (SQLException se2){

            }
            try{
                if(conn!=null) conn.close();
            }catch (SQLException se){
                se.printStackTrace();
            }
        }

    }
    private static void dropWebSite() {
        System.out.println("请输入要删除的站点名称:");
        String name = sc.next();
//        System.out.println("请输入站点URL:");
//        String url = sc.next();
//        System.out.println("请输入站点alexa:");
//        int alexa = sc.nextInt();
//        System.out.println("请输入站点所属国家:");
//        String country = sc.next();
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName((JDBC_DRIVER));
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            String sql ="delete from websites where name=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,name);
//            pstmt.setString(2,url);
//            pstmt.setInt(3,alexa);
//            pstmt.setString(4,country);
            pstmt.executeUpdate();
            System.out.println("删除站点成功!");
        }catch (SQLException se){
            se.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(pstmt!=null) pstmt.close();
            }catch (SQLException se2){

            }
            try{
                if(conn!=null) conn.close();
            }catch (SQLException se){
                se.printStackTrace();
            }
        }

    }
    private static void queryWebSite() {
//        System.out.println("请输入要查询的站点名称:");
//        String name = sc.next("name");
//        System.out.println("请输入站点URL:");
//       String url = sc.next("url");
//        System.out.println("请输入站点alexa:");
//        int alexa = sc.nextInt(Integer.parseInt("alexa"));
//        System.out.println("请输入站点所属国家:");
//        String country = sc.next("country");

        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName((JDBC_DRIVER));
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            Statement stmt = conn.createStatement();
            String sql ="SELECT id,name,url FROM websites";
            ResultSet rs = stmt.executeQuery(sql);
            //pstmt = conn.prepareStatement(sql);
//            pstmt.setString(name);
//            pstmt.setString(2,url);
//            pstmt.setInt(3,alexa);
//            pstmt.setString(4,country);
//            System.out.print("name");
//            System.out.print("url");
//            System.out.print("alexa");
//            System.out.print("country");
//            System.out.print("\n");
            //pstmt.executeQuery();
            // System.out.println("查询站点成功!");
            while (rs.next()){
                int id =rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");
                System.out.print("id"+":"+id+"-");
                System.out.print("name"+":"+name+"-");
                System.out.print("url"+":"+url);
                System.out.print("\n");
                System.out.println("查询站点成功!");
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch (SQLException se){
            se.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(pstmt!=null) pstmt.close();
            }catch (SQLException se2){

            }
            try{
                if(conn!=null) conn.close();
            }catch (SQLException se){
                se.printStackTrace();
            }
        }

    }
}

运行结果如下:

 

查看MySQL里面的表信息可以看到信息添加成功了。 

 

 修改站点信息

 删除站点

 删除之后的恢复为原来的情况

最后退出系统。

3.4 Java代码模块讲解

3.4.1 Java Scanner 类

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

下面是创建 Scanner 对象的基本语法:

Scanner s = new Scanner(System.in);

Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取数据前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据。

next() 、nextInt() 、nextLine() 区别

next():

  • 1、一定要读取到有效字符后才可以结束输入。
  • 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

nextLine():

  • 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
  • 2、可以获得空白。

如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取。

nextInt()、nextLine()区别:

  • 1.nextInt()只会读取数值,剩下"\n"还没有读取,并将cursor放在本行中。
  • 2.nextLine()会读取"\n",并结束(nextLine() reads till the end of line \n)。
  • 3.如果想要在nextInt()后读取一行,就得在nextInt()之后额外加上cin.nextLine()

nextInt() 一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,nextInt() 方法会自动将其去掉,只有在输入有效字符之后,nextInt()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,nextInt()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串。
  而nextLine() 方法的结束符只是Enter键,即nextLine() 方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
  可以看到,nextLine() 自动读取了被nextInt() 去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine() 连用时都存在这个问题,解决的办法是:在每一个 next() 、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine() 语句,将被next() 去掉的Enter结束符过滤掉。

此处使用的是scanner对象的nextInt()方法,使用switch-case分支进行判断需要执行的选项是那个。

Scanner sc =new Scanner(System.in);
    int choose = sc.nextInt();
        switch (choose){
                case 1:
                    addWebSite();
                    break;
                case  2:
                    modifyWebSite();
                    break;
                case 3:
                    dropWebSite();
                    break;
                case 4:
                    queryWebSite();
                    break;
                case 0:
                    System.out.println("退出系统");
                    System.exit(0);
                    break;
                default:
                    System.out.println("对不起,您的选择有误!");
                    break;
            }

在新定义的方法上面按住alt+回车既可以出现快捷方式,点击第一个创建一个方法。 

 创建完成之后新增while(true)让程序可以一直执行,程序的中断将会由输入的0来决定退出去。

 完整的这一块代码

public static void main(String[] args) throws SQLException {
        while (true) {
            System.out.println("***********************************");
            System.out.println("*********** 站点管理系统  ***********");
            System.out.println("*********** 1.新增站点   ***********");
            System.out.println("*********** 2.修改站点   ***********");
            System.out.println("*********** 3.删除站点   ***********");
            System.out.println("*********** 4.查询站点   ***********");
            System.out.println("*********** 0.退出系统   ***********");
            System.out.println("**********************************");
            System.out.println("请选择:");
            Scanner sc =new Scanner(System.in);
            int choose = sc.nextInt();
            switch (choose){
                case 1:
                    addWebSite();
                    break;
                case  2:
                    modifyWebSite();
                    break;
                case 3:
                    dropWebSite();
                    break;
                case 4:
                    queryWebSite();
                    break;
                case 0:
                    System.out.println("退出系统");
                    System.exit(0);
                    break;
                default:
                    System.out.println("对不起,您的选择有误!");
                    break;
            }
        }
    }

3.4.2 系统添加数据模块方法

例如以下的方法

private static void dropWebSite() {
        System.out.println("请输入要删除的站点名称:");
        //sc.next方法将不会用到
        //前面设置的sc变量是只能在main方法里面使用,要想使用需要将sc变量放在外面使用
}

解决方法:将sc变量放在main方法外面即可。变成整个类的作用方法

 虽然提出来了,但是scanner的方法仍然不能使用,会出错,原因是sc为成员变量,main是静态的方法,静态的方法只能访问静态的方法,不能访问类里面的变量,需要将scanner变成一个静态的变量。

加入关键字static即可访问其方法

 

 接下来继续编写方法原来实现相关功能

3.4.3  编辑MySQL与druid依赖

官方的网站链接如下:

Maven Repository: Search/Browse/Explore (mvnrepository.com)

在官方网站里面直接搜素需要的依赖即可

 选择mysql搜素,选择访问比较多的即可

 红色框住的是8.0版本以上的,选择自己的对应版本即可。此处小编的版本为8.0的版本,选择这个即可

 

 点击此处蓝色框住的部分即可复制,出现红色的提示即是复制成功

 代码部分

<dependencies>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.31</version>
        </dependency>

</dependencies>

 粘贴过来的显示为红色,如果之前未安装此组件的话,会有一个刷新的图标,点击一下,完成安装,安装完成之后红色部分会变成白色。

 

出现这种情况既是安装完成。 

搜索druid依赖,点击第一个即可

 选择自己的对应版本

 

 代码部分如下:

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

粘贴上述代码即可。

3.4.4 编辑插入数据方法

前面先给用户一个输入区,并且将输入的内容编辑为相关的变量暂时存在内存区,此时的数据并没有保存到数据库里面。

下面加入配置文件原来访问数据库,设置与前面的2.3.2 编辑配置文件相同。

利用类加载器原来加载配置文件,让文件以流的形式读进来,

选择alt+enter,选择第二个,让异常抛出

此处还有异常,将异常的这段代码放在try-catch里面捕获一下抛出

 这样捕获异常

 

捕获完成之后会自动放在catch语句里面 

// 加载配置文件
            Properties prop = new Properties();
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            try {
                prop.load(is);
                // 获取数据库连接池对象
                DataSource ds = DruidDataSourceFactory.createDataSource(prop);
                // 获取连接
                Connection connection = ds.getConnection();

            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

此处创建一个预编译对象

 完成之后使用其方法获取相关的数据,将其插入到数据库里面。

完整的插入代码

private static void addWebSite() {
            System.out.println("请输入站点名称:");
            String name = sc.next();
            System.out.println("请输入站点URL:");
            String url = sc.next();
            System.out.println("请输入站点alexa:");
            int alexa = sc.nextInt();
            System.out.println("请输入站点所属国家:");
            String country = sc.next();

            // 1 加载配置文件
            Properties prop = new Properties();
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            try {
                prop.load(is);
                // 2 获取数据库连接池对象
                DataSource ds = DruidDataSourceFactory.createDataSource(prop);
                // 3 获取连接
                Connection connection = ds.getConnection();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="insert into websites values(null,?,?,?,?)";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置参数
                stmt.setString(1,name);
                stmt.setString(2,url);
                stmt.setInt(3,alexa);
                stmt.setString(4,country);
                stmt.executeUpdate();
                // 获取插入完成的值,一般插入完成之后会出现·插入影响的行数
                // 将返回变量的类型设置为int型
                int row = stmt.executeUpdate();
                //提示一下
                if (row != 0){
                    System.out.println("添加站点成功!");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
}

3.4.5 编辑查询代码

PS:此处为未经优化的代码段 ,后续有优化之后的代码段。

在上述的插入代码的基础之上编辑查询代码即可。

private static void queryWebSite() {
            // 1 加载配置文件
            Properties prop = new Properties();
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            try {
                prop.load(is);
                // 2 获取数据库连接池对象
                DataSource ds = DruidDataSourceFactory.createDataSource(prop);
                // 3 获取连接
                Connection connection = ds.getConnection();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="select * from websites";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置返回的参数,此处的返回值为结果集
                ResultSet rs = stmt.executeQuery();
                // 获取查询到的结果集
                while (rs.next()){
                    // 将结果集拼接起来
                    System.out.println(rs.getInt(1) + "-" + rs.getString(2) + "-" +  rs.getString(3)
                            + "-" +  rs.getInt(4) + "-" +  rs.getString(5));
                }

            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

此处的获取数据库连接可以创建一个DruidUtil类来专门获取数据库连接

工具类的完整代码【此处就是将获取数据库连接的部分一一个类的形式创建,此时可以优化一下之前的代码】

优化之后的插入数据代码

private static void addWebSite() {
            System.out.println("请输入站点名称:");
            String name = sc.next();
            System.out.println("请输入站点URL:");
            String url = sc.next();
            System.out.println("请输入站点alexa:");
            int alexa = sc.nextInt();
            System.out.println("请输入站点所属国家:");
            String country = sc.next();

           try {
                // 3 获取连接,此处使用类方法进行调用。
                Connection connection = DruidUtil.getConn();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="insert into websites values(null,?,?,?,?)";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置参数
                stmt.setString(1,name);
                stmt.setString(2,url);
                stmt.setInt(3,alexa);
                stmt.setString(4,country);
                stmt.executeUpdate();
                // 获取插入完成的值,一般插入完成之后会出现·插入影响的行数
                // 将返回变量的类型设置为int型
                int row = stmt.executeUpdate();
                //提示一下
                if (row != 0){
                    System.out.println("添加站点成功!");
                }
            // 原先的异常处理也就不再需要,直接删除即可
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

优化之后的查询代码

private static void queryWebSite() {
            try {
                // 3 获取连接
                Connection connection = DruidUtil.getConn();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="select * from websites";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置返回的参数,此处的返回值为结果集
                ResultSet rs = stmt.executeQuery();
                // 获取查询到的结果集
                while (rs.next()){
                    // 将结果集拼接起来
                    System.out.println(rs.getInt(1) + "-" + rs.getString(2) + "-" +  rs.getString(3)
                            + "-" +  rs.getInt(4) + "-" +  rs.getString(5));
                }

            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

3.4.6  完整的优化后的代码

package com.ambow.druid;

import java.sql.*;
import java.util.Scanner;

public class work01 {
        static Scanner sc =new Scanner(System.in);
        public static void main(String[] args){
            while(true) {
                System.out.println("***********************************");
                System.out.println("*********** 站点管理系统  ***********");
                System.out.println("*********** 1.新增站点   ***********");
                System.out.println("*********** 2.修改站点   ***********");
                System.out.println("*********** 3.删除站点   ***********");
                System.out.println("*********** 4.查询站点   ***********");
                System.out.println("*********** 0.退出系统   ***********");
                System.out.println("**********************************");
                System.out.println("请选择:");
                Scanner sc = new Scanner(System.in);
                int choose = sc.nextInt();
                switch (choose) {
                    case 1:
                        addWebSite();
                        break;
                    case 2:
                        modifyWebSite();
                        break;
                    case 3:
                        dropWebSite();
                        break;
                    case 4:
                        queryWebSite();
                        break;
                    case 0:
                        System.out.println("退出系统");
                        System.exit(0);
                        break;
                    default:
                        System.out.println("对不起,您的选择有误!");
                        break;
                }
            }
        }
        private static void addWebSite() {
            System.out.println("请输入站点名称:");
            String name = sc.next();
            System.out.println("请输入站点URL:");
            String url = sc.next();
            System.out.println("请输入站点alexa:");
            int alexa = sc.nextInt();
            System.out.println("请输入站点所属国家:");
            String country = sc.next();
           try {
                // 3 获取连接,此处使用类方法进行调用。
                Connection connection = DruidUtil.getConn();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="insert into websites values(null,?,?,?,?)";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置参数
                stmt.setString(1,name);
                stmt.setString(2,url);
                stmt.setInt(3,alexa);
                stmt.setString(4,country);
                stmt.executeUpdate();
                // 获取插入完成的值,一般插入完成之后会出现·插入影响的行数
                // 将返回变量的类型设置为int型
                int row = stmt.executeUpdate();
                //提示一下
                if (row != 0){
                    System.out.println("添加站点成功!");
                }
            // 原先的异常处理也就不再需要,直接删除即可
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        private static void modifyWebSite() {
            System.out.println("请输入要修改的站点名称:");
            String name = sc.next();
            System.out.println("请输入新站点URL:");
            String url = sc.next();
            System.out.println("请输入新站点alexa:");
            int alexa = sc.nextInt();
            System.out.println("请输入新站点所属国家:");
            String country = sc.next();
            try {
                // 3 获取连接
                Connection connection = DruidUtil.getConn();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="update websites set url=?,alexa= ?,country=? where name=?";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置参数
                stmt = connection.prepareStatement(sql);
                stmt.setString(1,name);
                stmt.setString(2,url);
                stmt.setInt(3,alexa);
                stmt.setString(4,country);
                stmt.executeUpdate();
                int row = stmt.executeUpdate();
                //提示一下
                if (row != 0){
                    System.out.println("修改站点成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        private static void dropWebSite() {
            System.out.println("请输入要删除的站点名称:");
            String name = sc.next();
            try {
                // 3 获取连接
                Connection connection = DruidUtil.getConn();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="delete from websites where name=?";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置参数
                stmt.setString(1,name);
                stmt.executeUpdate();
                // 获取插入完成的值,一般插入完成之后会出现·插入影响的行数
                // 将返回变量的类型设置为int型
                int row = stmt.executeUpdate();
                //提示一下
                if (row != 0){
                    System.out.println("删除站点成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        private static void queryWebSite() {
            try {
                // 3 获取连接
                Connection connection = DruidUtil.getConn();
                // 4 执行SQL
                //插入SQL语句,?为占位符
                String sql ="select * from websites";
                //创建PreparedStatement预编译执行对象,将传入的SQL语句读出来。
                PreparedStatement stmt = connection.prepareStatement(sql);
                //设置返回的参数,此处的返回值为结果集
                ResultSet rs = stmt.executeQuery();
                // 获取查询到的结果集
                while (rs.next()){
                    // 将结果集拼接起来
                    System.out.println(rs.getInt(1) + "-" + rs.getString(2) + "-" +  rs.getString(3)
                            + "-" +  rs.getInt(4) + "-" +  rs.getString(5));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

思考——如何优化上述的Java代码? 

优化方案——使用分层将代码分为几个模块

1、视图层

2、持久层 / 数据访问层 Dao -- Data  Access  Object  数据访问层

优化的方案将会在后续的文章当中给出具体的操作。

jdbc是硬编码的方式

SQL语句也是硬编码,缺点是不易维护

 mybatis框架

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/56952.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2 el-carousel轮播图和文字一起改变

vue项目的话 安装一下element依赖 npm i element-ui -S在main入口文件引入element包 我在app文件里边去写的 <template><div class"w"><el-carousel height"460px"><el-carousel-item v-for"item in items" :key"i…

C++之观察者模式(发布-订阅)

目录 模式简介 介绍 优点 缺点 代码实现 场景说明 实现代码 运行结果 模式简介 观察者模式&#xff08;Observer Pattern&#xff09;&#xff0c;也叫我们熟知的发布-订阅模式。 它是一种行为型模式。 介绍 观察者模式主要关注的是对象的一对多的关系&#xff0c; …

C++ 哈希的应用【布隆过滤器】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1、字符串比较2、布隆过滤器的概念3、布隆过滤器的实现3.1、基本结构3.2、插入…

实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览

要进行Office365邮箱的授权对接&#xff0c;你需要先申请一个应用&#xff0c;并获取授权访问令牌。 以下是一个简单的步骤&#xff1a; 登录 Azure 门户&#xff1a;https://portal.azure.com/创建一个新的应用程序&#xff0c;或者使用现有的应用程序。要创建新的应用程序&…

SpringBoot引入MyBatisGenerator

1.引入插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><configuration><!--generator配置文件所在位置--><configuratio…

【CSS】3D卡片效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"card"><img…

Spring:IOC技术、Bean、DI

前言 Spring是一个开源的项目&#xff0c;并不是单单的一个技术&#xff0c;发展至今已形成一种开发生态圈。也就是说我们可以完全使用Spring技术完成整个项目的构建、设计与开发。Spring是一个基于IOC和AOP的架构多层j2ee系统的架构。 SpringFramework&#xff1a;Spring框架…

Jenkins Gerrit Trigger实践

1.创建Gerrit Trigger 2.jenkins master节点生成gerrit用户的密钥 这里的用户名得写登录gerrit后个人信息中的 Username 3.gerrit 配置刚刚jenkins生成密钥的公钥 4.gerrit 用户加入群组 不加这个群组&#xff0c;下一步测试就会报错“User aeshare has no capability conn…

TCP连接的状态详解以及故障排查(五)

同时打开 两个应用程序同时执行主动打开的情况是可能的&#xff0c;虽然发生的可能性较低。每一端都发送一个SYN,并传递给对方&#xff0c;且每一端都使用对端所知的端口作为本地端口。例如&#xff1a; 主机a中一应用程序使用7777作为本地端口&#xff0c;并连接到主机b 888…

UG\NX二次开发 属性值连接到表达式

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 利用表达式参数驱动模型形状实现参数化建模,同时将表达式关联到部件属性中,实现自动更新属性值。这将为建模过程带来更大的灵活性和可扩展性。通过将属性值连接到表达式,可以动态地…

安全测试国家标准解读——函数调用安全、异常处理安全、指针安全

下面的系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解&#xff0c;该标准是2020年4月28日&#xff0c;由国家市场监督管理总局、国家标准化管理委员会发布&#xff0c;2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理&…

Git分布式版本控制工具和GitHub(一)--简介

一.Git概述 1.Git简介 【1】什么是Git? Git就是代码版本管理工具。 【2】为什么要使用Git &#xff08;1&#xff09;版本控制 写代码就是不断写BUG的过程&#xff08;当然我们是不会这么说的&#xff09;&#xff0c;很多时候你写了100行代码之后&#xff0c;突然醒悟&…

安卓音视频多对多级联转发渲染

最近利用自己以前学习和用到的音视频知识和工程技能做了一个android的sdk,实现了本地流媒体ipc rtsp 拉流以及自带mip usb等camera audio节点产生的流媒体通过webrtc sfu的方式进行多对多级联发布共享,网状结构&#xff0c;p2p组网&#xff0c;支持实时渲染以及转推rtmp&#x…

bean作用域和生命周期

Bean 默认情况下是单例状态&#xff08;singleton&#xff09;&#xff0c;也就是所有⼈的使⽤的都是同⼀个对象&#xff0c;之前我们学单例模式的时候都知道&#xff0c;使⽤单例可以很⼤程度上提⾼性能&#xff0c;所以在 Spring 中 Bean 的作⽤域默认也是 singleton 单例模式…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图 tbms

&#xfeff; 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&am…

批量计算直角三角形两个直角边对应斜边的numpy.hypot()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给出多个三角形的两条直角边长度 批量计算出这些三角形的斜边长度 numpy.hypot() [太阳]选择题 以下代码的输出结果是? import numpy as np a np.array([3, 4, 30]) b np.array([4, 3, 40])…

HDFS中数据迁移的使用场景和考量因素

HDFS中数据迁移的使用场景和考量因素 数据迁移使用场景数据迁移要素考量HDFS分布式拷贝工具-DistCpdistcp的优势性能命令 数据迁移使用场景 冷热集群数据同步、分类存储集群数据整体搬迁 当公司业务迅速的发展&#xff0c;导致的当前的服务器数量资源出现临时紧张的时候&#…

解密外接显卡:笔记本能否接外置显卡?如何连接外接显卡?

伴随着电脑游戏和图形处理的需求不断增加&#xff0c;很多笔记本电脑使用者开始考虑是否能够通过外接显卡来提升性能。然而&#xff0c;外接显卡对于笔记本电脑是否可行&#xff0c;以及如何连接外接显卡&#xff0c;对于很多人来说仍然是一个迷。本文将为您揭秘外接显卡的奥秘…

二重积分1

目录 二重积分 二重积分的性质 ​编辑 中值定理 二重积分的计算 方法1&#xff1a;利用直角坐标计算 方法2&#xff1a;利用极坐标进行计算 适用于极坐标的二重积分的特征 对称性和奇偶性的应用 题目 例题1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#x…

0基础学习VR全景平台篇 第76篇:全景相机-圆周率全景相机如何直播推流

圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享8K的高清…