Java -@NotEmpty、@NotBlank、@NotNull 三种区别

@NotEmpty

用在集合类上面 加了@NotEmpty的String类、Collection、Map、数组,是不能为null或者长度为0的(String Collection Map的isEmpty()方法)

@NotBlank

只用于String,不能为null且trim()之后size>0

@NotNull

用在基本类型上,如Integer、Double。用在集合数组时,不能为null,但可以为empty,没有Size的约束(size = 0)

if(string.IsNullOrEmpty(licencePlate.Trim()))

Java -关于po bo vo pojo dao 概念:

1、PO(bean,entity)等命名:

persistant object持久对象,数据库表中的记录在java对象中的显示状态
最形象的理解就是一个PO就是数据库中的一条记录。
好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。

2 、BO(service,manager,business等命名):

​ 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。
形象描述为一个对象的形为和动作,当然也有涉及到基它对象的一些形为和动作。比如处理

一个人的业务逻辑,有睡觉,吃饭,工作,上班等等形为还有可能和别人发关系的形为。
这样处理业务逻辑时,我们就可以针对BO去处理。

3、VO(from也有此写法) :

value object值对象
主要体现在视图的对象,对于一个WEB页面将整个页面的属性封装成一个对象。然后用一个VO对象在控制层与视图层进行传输交换。

4、pojo:

POJO有一些private的 参数 作为对象的属性。然后针对每个 参数 定义了get和set方法作为访问的接口

​ POJO是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。

  • 一个POJO持久化以后就是PO 。
  • 直接用它传递、传递过程中就是DTO
  • 直接用来对应表示层就是VO

5、DTO

DTO(Data Transfer Object,数据传送对象)是解决这个问题的比较好的方式。DTO是一个普通的Java类,它封装了要传送的批量的数据。当客户端需要读取服务器端的数据的时候,服务器端将数据封装在DTO中,这样客户端就可以在一个网络调用中获得它需要的所有数据。

PO、BO、VO、DTO、POJO、DAO的区别:

**(一)**PO

​ persistant object持久对象

​ 最形象的理解就是一个PO就是数据库中的一条记录。

​ 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。

(二) BO****:

​ business object业务对象

​ 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。

​ 比如一个简历,有教育经历、工作经历、社会 关系等等。

​ 我们可以把教育经历对应一个PO,工作经历对应一个PO,社会 关系对应一个PO。

​ 建立一个对应简历的BO对象处理简历,每个BO包含这些PO。

​ 这样处理业务逻辑时,我们就可以针对BO去处理。

(三) VO

​ value object值对象

​ ViewObject表现层对象

​ 主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。

(四) DTO

​ Data Transfer Object数据传输对象

​ 主要用于远程调用等需要大量传输对象的地方。

​ 比如我们一张表有100个字段,那么对应的PO就有100个属性。

​ 但是我们界面上只要显示10个字段,

​ 客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,

​ 这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO

(五) POJO

​ plain ordinary java object 简单java对象

​ 个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。

一个POJO持久化以后就是PO

直接用它传递、传递过程中就是DTO

直接用来对应表示层就是,所以一个pojo可能有三种变黄

(7条消息) DTO(转)_dchjmichael的专栏-CSDN博客_dto

JavaBean

基本解释:

1、JavaBean是公共Java类,但是为了编辑工具识别,需要满足至少三个条件:

  1. 有一个public默认构造器(例如无参构造器,)
  2. 属性使用public 的get,set方法访问,也就是说设置成private,同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
  3. 需要序列化,实现Serializable 接口,用于实现bean的持久性。

(1)包命名:全部字母小写。

(2)类命名:每个单词首字母大写。

(3)属性名:第一个单词全部小写,之后每个单词首字母大写。

(4)方法名:与属性命名方法相同。

(5)常量名:全部字母大写。

Druid

1、什么是druid?

​ Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!

2、Druid的组成部分:

​ 它包括四个部分:

2、Druid是一个JDBC组件,它包括三个部分:

1、基于Filter-Chain模式的插件体系。

2、 DruidDataSource 高效可管理的数据库连接池。

3、SQLParser

3、Druid的功能

1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。

4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

Druid: 1、充当数据库连接池。 2、可以监控数据库访问性能 3、获得SQL执行日志

4、配置详解:

DRUID连接池的实用 配置详解

5、配置Druid
1、 properties 文件配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#sqlserver配置文件
#连接sqlserver2008r2注册驱动程序字符串
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
#与数据库建立连接的字符串,连接数据库,注意是127.0.0.1,DatabaseName=“自己建立的数据库名称”
url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=pyyzyy
username=jwz
password=jwz123456
#初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大超时时间 单位是毫秒
maxWait=10000

#配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis = 300000
testWhileIdle = true

#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis = 60000

#判断连接是否可用 申请连接时是否有效,归还连接时是否有效
testOnBorrow = false
testOnReturn = false

#打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements =true
maxPoolPreparedStatementPerConnectionSize = 20

2、java 读取文件配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    static DruidDataSource druidplugin;
static{
druidplugin= MainConfig.createSQLserverDruidPlugin();
druidplugin.start();
}

public static Connection getConnection() {
try {
return druidplugin.getDataSource().getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}

private static Properties properties = new Properties();
// 加载连接池驱动
static {
try {
InputStream in = MsSQLUtil.class.getClassLoader().getResourceAsStream("Sqlserver.properties");
properties.load(in);
}catch (Exception e){
e.printStackTrace();
}
}
//仿造 Prop prop
public static DruidDataSource createSQLserverDruidPlugin() {

DruidDataSource dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
//配置防火墙
WallFilter wallFilter = new WallFilter(); // 加强数据库安全
wallFilter.setDbType("sqlserver");
druidPlugin.addFilter(wallFilter);
//统计监控的过滤器
StatFilter statFilter=new StatFilter();
statFilter.setMergeSql(true);
statFilter.setLogSlowSql(true);
statFilter.setSlowSqlMillis(Duration.ofMillis(1000).toMillis());
//添加 StatFilter 才会有统计数据
druidPlugin.addFilter(statFilter);
//
// 2.日志插件
// 保存DruidDataSource的监控记录,设置打印日志周期,默认使用DruidDataSourceStatLoggerImpl
// DruidPlugin未暴露setTimeBetweenLogStatsMillis(),只能使用properties方法设置
druidPlugin.setConnectionProperties("druid.timeBetweenLogStatsMillis="+ Duration.ofHours(24).toMillis());
Slf4jLogFilter slf4jLogFilter = new Slf4jLogFilter();
slf4jLogFilter.setConnectionLogEnabled(false);
slf4jLogFilter.setResultSetLogEnabled(false);
slf4jLogFilter.setStatementParameterSetLogEnabled(false);
slf4jLogFilter.setConnectionLogEnabled(false);
slf4jLogFilter.setResultSetCloseAfterLogEnabled(false);
slf4jLogFilter.setConnectionCloseAfterLogEnabled(false);
slf4jLogFilter.setStatementParameterClearLogEnable(false);
slf4jLogFilter.setStatementPrepareAfterLogEnabled(false);
slf4jLogFilter.setStatementPrepareCallAfterLogEnabled(false);
slf4jLogFilter.setStatementCreateAfterLogEnabled(false);
slf4jLogFilter.setStatementCloseAfterLogEnabled(false);
//设置输出执行后的日志 带执行耗时等信息
slf4jLogFilter.setStatementExecuteAfterLogEnabled(false);
//设置批量操作执行后的日志 带执行耗时等信息
slf4jLogFilter.setStatementExecuteBatchAfterLogEnabled(false);
//设置查询操作执行后的日志 带执行耗时等信息
slf4jLogFilter.setStatementExecuteQueryAfterLogEnabled(false);
//设置更新 插入 删除 操作执行后的日志 带执行耗时等信息
slf4jLogFilter.setStatementExecuteUpdateAfterLogEnabled(false);
//输出完整的SQL 将值替换掉问号,这个仅在开发模式下有效
slf4jLogFilter.setStatementExecutableSqlLogEnable(DEV_MODE);
druidPlugin.addFilter(slf4jLogFilter);
return druidPlugin;
}


3、连接池关闭操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    /**
* 释放资源
*
* @param connection
* @param preparedStatement
* @param resultSet
* @return
*/
public static boolean closeRecource(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
// 先开最后关闭
boolean flag = true;
if (resultSet != null) {
try {
resultSet.close();
// GC回收
resultSet = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if (connection != null) {
try {
connection.close();
connection = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
return flag;
}

6、spring配置连接、监控数据等

(3条消息) DRUID 连接池的使用、配置详解肖朋伟-CSDN博客druid连接池详解

7、配置依赖导入:
1
<druid.version>1.1.5</druid.version>

Swagger-文档API学习

Swagger文档API学习–API注解 | 妃子笑 (shengouqiang.cn)Swagger文档API学习–API注解 | 妃子笑 (shengouqiang.cn)

Guava学习

(37条消息) Guava学习入门_过往记忆大数据-CSDN博客
Guava学习之ArrayListMultimap
https://iteblog.blog.csdn.net/article/details/12062457