按天按月按年统计
mysql中dateTime字段提供了 date_format 函数进行格式化该字段显示成期望形式
DATE_FORMAT(date,format) 函数用于以不同的格式显示日期/时间数据。
格式 | 描述 |
---|---|
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时(00-23) |
%h | 小时(01-12) |
%I | 小时(01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天(001-366) |
%k | 小时(0-23) |
%l | 小时(1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时(hh:mm:ss) |
%U | 周(00-53)星期日是一周的第一天 |
%u | 周(00-53)星期一是一周的第一天 |
%V | 周(01-53)星期日是一周的第一天,与 %X 使用 |
%v | 周(01-53)星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天(0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
我们常用的
按年统计就可以 group by date_format(date字段列名, “%Y”)
按月统计就可以 group by date_format(date字段列名, “%Y-%m”)
按天统计就可以 group by date_format(date字段列名, “%Y-%m-%d”)
按季度统计可以 使用 quarter() 函数,直接计算当天时间为哪个季度季度 (1,2,3,4)
group by concat(date_format(date字段列名, ‘%Y-’),quarter(date字段列名) );
concat拼接 这样每个日期会被处理 成 2021-1 这种形式(1是第几季度)
insert into task(id,size) VALUES (1,10),(2,10);
若是这种情况,存在主键冲突会报错并中断执行。
insert IGNORE into task(id,size) VALUES (1,10),(2,10);
忽略失败,继续执行。存在主键冲突的数据不插入
多数据源配置
多数据源配置Mybatis分别扫描不同的mapper xml目录。在resource/mapper中 多配置几个模块,不同的数据源扫描不同的模块。
1.首先pom依赖,一般已经运用druid链接池就不再需要配置
2.数据源的配置 项目如果利用nacos,就在nacos 配置多个数据源,如果userName和password都一样,只用配置多个url。如果密码账号不同可以配置多套数据源(自己区分好就行了)。
master 数据源配置
master.datasource.url=jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf8
slave 数据源配置
slave.datasource.url=jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf8
datasource.username=root
datasource.password=123456
datasource.driverClassName=com.mysql.jdbc.Driver
3.一个数据源我们需要声明一个MyBatisConfig类,这个类作用:
a.连接数据库生成 dataSource数据源 对象供我们操作数据库
b.将dataSource注入生成一个专属该数据源的sqlSessionFactory
c.将dataSource注入生成一个专属该数据源的DataSourceTransactionManager 管理事务
在头部加上注解 @Configuration
@MapperScan(basePackages = “com.rdcrm.task.daoStatistic”, sqlSessionFactoryRef = “slaveSqlSessionFactory”)
让mybatis不同数据源扫描指定的dao,进行目录隔离
此时已经完成,在不同的dao下xml语句其实就是操作不同的数据源的表
事务注解Transactional失效
问题:
利用spring的事务注解Transactional,数据插入数据库中。发现异常情况,数据库的事务并未生效。
原因:
经过排查发现,是因为多数据源导致。配置了多个数据源之后,TransactionalManager并未配置,导致只有一个spring默认生成的TransactionalManager只会让主库事务生效。另一个库的数据事务通过另一个库的事务管理者并不能使得它的事务生效。
解决方案:
重写TransactionConfig,给两个dataSource都生成一个DataSourceTransactionManager。直接
new DataSourceTransactionManager(dataSource);进行生成,然后配置一个bean的那么。
使用Transactional注解时候主动声明使用的DataSourceTransactionManager的beanName进行配置使用该数据源的事务管理。
json类型使用
CREATE TABLE test_json (id int,v JSON);
DROP TABLE test_json;INSERT into test_json VALUES(1,'{"120":120}'),(2,'{"120":120,"130":140}'),(3,'{"120":120,"130":140,"140":180}');
SELECT * FROM test_json
SELECT *,v->'$."140"' FROM test_json WHERE (v->'$."140"') IS NOT NULL
elt 使用尽量排除非范围内的数据
Mybatis相关错误
Mybatis查出可以返回主键id
useGeneratedKeys=“true” 获取到数据库自动生成的主键ID
keyProperty=“pid” 对应是 parameterType中PFileInform对象的pid属性,insert语句执行结束则可以从该对象取出id
<insert id="savePFile" parameterType="com.demo.fileupload.enity.PFileInform" useGeneratedKeys="true" keyProperty="pid">insert into part_fileinform(psize,pMD5)values(#{psize},#{pMD5})
</insert>
//java代码 取出返回的 主键id
fileMapper.savePFile(pFileInform);
pid = pFileInform.getPid();
JDBC数据类型 和 Java 数据 类型对应关系
错误:
No enum constant org.apache.ibatis.type.JdbcType.String
原因:
Mybatis中配置resultMap时候必须符合JdbcType枚举类型,没有String类型
DB类型与Java类型对应表
DB Type | JAVA Type |
---|---|
CHAR | String |
VARCHAR | String |
LONGVARCHAR | String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | boolean |
BOOLEAN | boolean |
TINYINT | byte |
SMALLINT | short |
INTEGER | int |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
CLOB | Clob |
BLOB | Blob |
解决方法:
1.String换成VARCHAR就行了
Mybatis查询结果为null,dao层用int接收
错误:
Mapper method attempted to return null from a method
with a primitive return type (int).
原因:
Mybatis查询结果返回为null,但是dao层对应的是返回结果类型 为int,int不能为null,但是Integer可以接收null,初值为0
解决方法:
1.将dao层的int转换为Integer
Mybatis接收Java对象参数,无法对应 其属性的值
错误:
Parameter ‘fname’ not found. Available parameters are [fileInform, param1]
原因:
dao层传入的是对象,但是加了@Param(“”)注解,导致无法找到对象的属性
解决方法:
1.将dao层的方法@Param(“”)注解删除
Mybatis int字段=0时候判断 != ‘’ 不成立
错误:
当参数int status = 0时候
条件不成立
原因:
Mybatis把int值为0,该 ==‘’ 值为true
解决方法:
删除 != ‘’ 条件