MVC、三层架构、数据库连接池、Spring JDBC
MVC模式
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
最简单的、最经典就是JSP(view) +Servlet(controller) + JavaBean(model)
视图和逻辑隔离开来
- 当控制器收到来自用户的请求
- 控制器调用JavaBean完成业务
- 完成业务后通过控制器跳转JSP页面的方式给用户反馈信息
- 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不同,三层架构只指后端的过程。
Controller任务: 从页面拿数据,交给service,再从service拿到数据,交给界面。
Lombok
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用Lombok可以简化操作,通过注解的方式就能代替get,set,构造参数等代码。
使用方法
- pom.xml添加依赖
<!--Lombok简化POJO-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<scope>provided</scope>
</dependency>
- 实体类写注解
常见注解:
@Data//生成get,set,无参构造方法,哈希等等等等。
@Getter//生成get
@Setter//生成set
@NoArgsConstructor//无参
@AllArgsConstructor//带参(全参)
写入后,结构界面(idea左下角)可以看到,写入注解后项目已经有需要的方法。
数据库连接池
数据库连接池作用(线程池作用是一样的)
1、限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或崩溃
2、数据库连接不需要每次都去创建或销毁,节约了资源
3、数据库连接不需要每次都去创建,响应时间更快。
常见数据库连接池:
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供的
使用方法:
- pom.xml添加依赖
<!--Lombok简化POJO-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<scope>provided</scope>
</dependency>
- 更改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);
}
}
- 利用配置文件配置数据库
在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:查询结果,将结果封装为对象
一般用于聚合函数的查询
使用方法:
- 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>
- 更改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;
}
}