MVC、三层架构、数据库连接池、Spring JDBC

MVC模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
最简单的、最经典就是JSP(view) +Servlet(controller) + JavaBean(model)
视图和逻辑隔离开来
image

  1. 当控制器收到来自用户的请求
  2. 控制器调用JavaBean完成业务
  3. 完成业务后通过控制器跳转JSP页面的方式给用户反馈信息
  4. JSP个 用户做出响应。

控制器是核心
M(Model) 模型 JavaBean
V(View) 视图 html jsp Thymeleaf volicity freemaker
C(Control) 控制器 Servlet,Controller,Action

JavaBean:一种规范,表达实体和信息的规范,便于封装重用
1、所有属性为private
2、提供默认构造方法
3、提供getter和setter
4、实现serializable接口

三层架构

三层架构和MVC不同,三层架构只指后端的过程。
image

Controller任务: 从页面拿数据,交给service,再从service拿到数据,交给界面。

Lombok

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

使用Lombok可以简化操作,通过注解的方式就能代替get,set,构造参数等代码。
使用方法

  1. pom.xml添加依赖
<!--Lombok简化POJO-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.14</version>
  <scope>provided</scope>
</dependency>
  1. 实体类写注解
    常见注解:
@Data//生成get,set,无参构造方法,哈希等等等等。
@Getter//生成get
@Setter//生成set
@NoArgsConstructor//无参
@AllArgsConstructor//带参(全参)

写入后,结构界面(idea左下角)可以看到,写入注解后项目已经有需要的方法。

数据库连接池

数据库连接池作用(线程池作用是一样的)
1、限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或崩溃
2、数据库连接不需要每次都去创建或销毁,节约了资源
3、数据库连接不需要每次都去创建,响应时间更快。

常见数据库连接池:

  1. C3P0:数据库连接池技术
  2. Druid:数据库连接池实现技术,由阿里巴巴提供的

使用方法:

  1. pom.xml添加依赖
<!--Lombok简化POJO-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.14</version>
  <scope>provided</scope>
</dependency>
  1. 更改JDBCUtil类
package com.situ.hotel.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtil {
    // 1. 声明静态数据源成员变量
    private static DataSource ds;

    // 2. 创建连接池对象
    static {
        // 加载配置文件中的数据
        InputStream inputStream = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
        Properties properties = new Properties();
        try {
            properties.load(inputStream);
            // 创建连接池,使用配置文件中的参数
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 3. 定义公有的得到数据源的方法
    public static DataSource getDataSource() {
        return ds;
    }

    // 4. 定义得到连接对象的方法
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    // 5.定义关闭资源的方法
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
            }
        }

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

    // 6.重载关闭方法
    public static void close(Connection conn, Statement stmt) {
        close(conn, stmt, null);
    }
}
  1. 利用配置文件配置数据库
    在resources目录下新建druid.properties,内容如下:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=UTF-8
username=root
password=数据库密码
initialSize=5
maxActive=10
maxWait=3000

Spring JDBC

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

1、update():执行DML语句。增、删、改语句
2、query():查询结果,将结果封装为JavaBean对象
query的参数:RowMapper,一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
3、queryForObject:查询结果,将结果封装为对象
一般用于聚合函数的查询

使用方法:

  1. pom.xml添加依赖
<!--druid连接池-->
<!--jdbcTemplate-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.1.2.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.1.2.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>4.1.2.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.1.2.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.1.1</version>
  <scope>compile</scope>
</dependency>
  1. 更改dao层代码

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;

public class UserDaoImpl implements IUserDao {
    private  JdbcTemplate template =new JdbcTemplate(JDBCUtil.getDataSource());
    @Override
    public List<User> selectAll() {
        String sql = "select id,name,password,email,phone from user";
        List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
        return list;
    }

    @Override
    public List<User> selectByPage(Integer offset, Integer limit) {
        String sql = "select id,name,password,email,phone from user limit ?,?";
        List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class), offset, limit);
        return list;
    }

    @Override
    public Long selectTotalCount() {
        String sql = "select count(*) from user";
        Long totalCount = template.queryForObject(sql, Long.class);
        return totalCount;
    }

    @Override
    public Integer deleteById(Integer id) {
        String sql = "delete from user where id=?";
        int count = template.update(sql, id);
        return count;
    }
}
posted @ 2022-12-17 14:44  kingwzun  阅读(144)  评论(0编辑  收藏  举报