首页 > 数据库 >01-三层架构之查询数据库数据

01-三层架构之查询数据库数据

时间:2023-05-08 09:35:23浏览次数:58  
标签:01 架构 java music slj 查询数据库 import com public

一、后台操作流程

1.创建数据库

CREATE DATABASE wyy_music;

USE wyy_music;

DROP TABLE IF EXISTS `tb_music`;
CREATE TABLE `tb_music` (
  `music_id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, -- 歌曲ID
  `music_name` VARCHAR(255) NOT NULL, -- 歌曲名称
  `music_album_name` VARCHAR(255), -- 专辑名称
  `music_album_picUrl` VARCHAR(255), -- 专辑图片路径
  `music_mp3Url` VARCHAR(255), -- 歌曲播放路径
  `music_artist_name` VARCHAR(255), -- 歌手名称
  `sheet_id` INT(11) DEFAULT NULL -- 对应的歌单ID
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO tb_music VALUES ('1', '光年之外', '光年之外', 'https://imgessl.kugou.com/stdmusic/20161229/20161229233400375274.jpg', 'https://webfs.tx.kugou.com/202109061310/31fb3f36e2048b2172a70e327bbfc8e3/KGTX/CLTX001/f87095bff0de7c636c3a3b8aac702d76.mp3', 'G.E.M.邓紫棋','1');
INSERT INTO tb_music VALUES ('2', '夜空中最亮的星', '世界', 'https://imgessl.kugou.com/stdmusic/20150719/20150719010047203836.jpg', 'https://webfs.ali.kugou.com/202109061306/1b30ae27a5749debd602507b3bf1fea6/G202/M04/1B/13/aocBAF55G0-ADd0HAD2Y88Efqbw072.mp3', '逃跑计划','1');
INSERT INTO tb_music VALUES ('3', '只要平凡', '只要平凡', 'https://imgessl.kugou.com/stdmusic/20180622/20180622194005815458.jpg', 'https://webfs.ali.kugou.com/202109061309/edb2e89d90e66b9d125950dba107e9eb/KGTX/CLTX001/38aead7ed546b0736791ebb25c3a3951.mp3', '张杰/张碧晨','2');

2.在IDEA中创建maven工程并导入依赖

<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.20</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
    </dependencies>

3.创建db.properties文件,配置数据库

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/wyy_music
username=root
password=1234

4.编写工具类

package com.slj.util;

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

import java.io.InputStream;
import java.sql.*;
import java.util.Objects;
import java.util.Properties;


public class JdbcUtil {

    //声明一个DruidDataSource对象
    private static DruidDataSource ds;
    //声明一个ThreadLocal对象 本地线程对象,线程安全,不需要加锁,提高执行效率
    private static final ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<>();

    //静态代码块,在类加载时只执行一次,我们可以在这里初始化数据源对象
    //整个项目中只需要一个数据源对象就可以 数据源内部有个连接池对象,我们之后获取连接可以从连接池中获取
    static {
        try {
            //读取database.properties属性文件获取到输入流对象
            InputStream inputStream = JdbcUtil.class.getResourceAsStream("/db.properties");
            //创建Properties对象
            Properties properties = new Properties();
            //属性文件中的内容就读取到properties中了
            properties.load(inputStream);
            //根据properties文件创建数据源
            ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //获取连接的方法 getConnection
    public static Connection getConnection() {
        //从THREAD_LOCAL获取连接对象
        Connection connection = THREAD_LOCAL.get();
        if (Objects.isNull(connection)) {
            try {
                connection = ds.getConnection();
                // 第一次获取到连接对象 connection 就放到THREAD_LOCAL,以后再取的时候里面就有值了
                THREAD_LOCAL.set(connection);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

    //关闭资源的方法
    private static void close(Connection connection) {
        if (Objects.nonNull(connection)) {
            try {
                connection.close();
                //关闭连接后 把THREAD_LOCAL中的对象清除掉,一定不能忘记
                THREAD_LOCAL.remove();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5.编写实体类

package com.slj.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 实体类
 * 有了lombok依赖,直接使用注解方式
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Music {
    private Integer musicId;
    private String musicName;
    private String musicAlbumName;
    private String musicAlbumPicurl;
    private String musicMp3url;
    private String musicArtistName;
    private String sheetId;
}

6.编写持久层(dao层)

package com.slj.dao;

import com.slj.entity.Music;

import java.util.List;

public interface MusicDao {
    /**
     * 查询所有
     *
     * @return
     */
    List<Music> queryAll();
}

7.编写DaoImpl

package com.slj.dao.impl;

import com.slj.dao.MusicDao;
import com.slj.entity.Music;
import com.slj.util.JdbcUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class MusicDaoImpl implements MusicDao {
    private QueryRunner queryRunner = new QueryRunner();

    /**
     * 查询所有信息
     *
     * @return
     */
    @Override
    public List<Music> queryAll() {
        //1.获取连接
        Connection connection = JdbcUtil.getConnection();

        //2.SQL语句
        String sql = "select music_id as musicId,music_name as musicName," +
                "music_album_name as musicAlbumName,music_album_picUrl as musicAlbumPicurl," +
                "music_mp3Url as musicMp3url,music_artist_name as musicArtistName," +
                "sheet_id as sheetId from tb_music";

        //3.调用方法
        try {
            return queryRunner.query(connection, sql, new BeanListHandler<>(Music.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

8.编写业务逻辑层(service层)

package com.slj.service;

import com.slj.entity.Music;

import java.util.List;

public interface MusicService {
    /**
     * 查询所有歌曲
     *
     * @return
     */
    List<Music> findAll();
}

9.编写ServiceImpl

package com.slj.service.impl;

import com.slj.dao.MusicDao;
import com.slj.dao.impl.MusicDaoImpl;
import com.slj.entity.Music;
import com.slj.service.MusicService;

import java.util.List;

public class MusicServiceImpl implements MusicService {
    private MusicDao musicDao = new MusicDaoImpl();

    //调用dao层方法
    public List<Music> findAll() {
        return musicDao.queryAll();
    }
}

10.编写页面层(Controller层)

package com.slj.controller;

import com.alibaba.fastjson2.JSON;
import com.slj.entity.Music;
import com.slj.service.MusicService;
import com.slj.service.impl.MusicServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/findAllController.do")
public class FindAllController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //调用service层处理核心业务逻辑
        MusicService musicService = new MusicServiceImpl();
        List<Music> all = musicService.findAll();

        //将Java数据转换成Json数据
        String jsonString = JSON.toJSONString(all);
        //返回给前端
        response.getWriter().write(jsonString);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

11.编写过滤器(处理请求响应字符乱码问题)

package com.slj.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "*.do")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /**
         * 设置编码
         */

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init.......");
    }

    @Override
    public void destroy() {
        System.out.println("destroy.......");
    }
}

12.查询结果(tomcat服务器)

 二、介绍一个电脑自带浏览器的插件(可以进行测试哦)

 

 

标签:01,架构,java,music,slj,查询数据库,import,com,public
From: https://www.cnblogs.com/shilj/p/17372205.html

相关文章

  • ABB高压模块5SHY3545L0014 3BHB013085R0001
    W;① ⑧0 3 01  7 ⑦ ⑦ 59ABB高压模块5SHY3545L0014  3BHB013085R0001 5SHY3545L00163BHB020720R00023BHE039203R0101GVC736CE101  5SHY3545L00093BHB013085R00013BHE009681R0101GVC750BE1017、流年寂寞,寂寞流年。彼岸花开正盛,此时的我从围城里......
  • 01-计算机基础
    0.目标了解硬件&操作系统&软件(应用系统)之间的关系。了解常见的操作系统都有哪些。了解编译器和解释器的区别和作用。了解编程语言进行分类了解Python解释器的种类了解CPython解释器的版本1.计算机基础1.1基础概念计算机的组成计算机是由多个硬件组合而成。......
  • Tomcat总体架构,启动流程与处理请求流程
    系列文章目录和关于我参考书籍《Tomcat架构解析》一丶Tomcat总体架构本文沿袭《Tomcat架构解析》中启发式的方式来总结Tomcat总体架构1Server假设当前我们要编写一个web应用服务器,web应用服务器最基本的功能是接受客户端发送的请求数据并进行解析,完成相关的业务处理,然后将......
  • 架构设计概要
    架构设计的5大要素高性能高可用:限流、降级、灾备可扩展:增加防腐层(接口适配器层)、IOC、可伸缩安全性:物理安全性、系统安全性、数据安全性 架构设计原则合适优于业界领先简单优于复杂演化优于一步到位 架构设计的主要内容搞清楚内部元素关系元素的种类:系统、子系统、模......
  • ZJOI2018树--等价类相关计算
    ZJOI2018树节点1作为树的根。对于\(i\in[2,n]\),独立地从\([1,i)\)中等概率随机选取一个节点作为\(i\)的父亲。通过上面的方法独立的随机生成\(k\)棵\(n\)个节点的有根树\(T_1\)至\(T_k\),他们两两同构的概率是多少。denote\(s(t)\)thewaysassignnu......
  • 2.ansible常用的模块01
    1.模块?模块实际上就是脚本,是ansible调用的对象,主要是用来通过调用它去远程执行某些命令功能。2.常用的模块2.1shell模块ansible默认的模块是command,其中shell模块与command模块区别:1.command模块的命令不启动shell,直接通过ssh执行命令......
  • Vulnhub-dpwwn01-WP
    前言点击>>下载靶机靶机kalilinux:ip地址为192.168.20.200靶机探测使用nmap探测靶机nmap192.168.20.0/24靶机ip为192.168.20.131使用nmap进行详细扫描nmap-A-p-192.168.20.131点击查看扫描结果rootin/home/kalivia☕v17.0.6…➜nmap-A-p-192.168.2......
  • 分布式架构整体框架
    文章目录一、分布式整体框架图1.架构eg12.架构eg2二、什么是分布式系统?1.什么是分布式系统?2.分布式系统的挑战3.分布式系统特性与衡量标准4.组件、理论、协议5.概念与实现6.总结三、分布式学习最佳实践:从分布式系统的特征开始(附思维导图)1.分布式特征的思维导图2.分布式系统的一般特......
  • poj018(2)
    再贴一版poj1018,其实与之前的那一版差不多,只是去掉了注释,这样可能看起来会舒服一点packagecom.njupt.acm;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.util.Arrays;importjava.util.Scanner;publicclassTestPOJ1018{pu......
  • poj1018(1)
    其实这道题我也没有完全的弄明白,糊里糊涂就ac了 大致题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths和价格prices。现在每种设备都各需要1个,考虑......