实现if-else
<choose> <when test="item.tdName == 'hor_acceleration'"> '0' as horAcceleration, </when> <otherwise> hor_acceleration as horAcceleration, </otherwise></choose>
批量插入和批量更新
批量插入<insert id="insertTgAfterCorrectData"> insert into dtjc_tg_after_correct_data( id, left_low ) values <foreach item="item" index="index" collection="list" separator=","> ( #{item.id}, #{item.left_low} ) </foreach> </insert>
批量更新更新多条数据,每条数据都不一样背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据(更准确的说是一条 ...
批量插入大数据
思路分析批量插入这个问题,我们用 JDBC 操作,其实就是两种思路吧:
用一个 for 循环,把数据一条一条的插入(这种需要开启批处理)。
生成一条插入 sql,类似这种 insert into user(username,address) values(‘aa’,‘bb’),(‘cc’,‘dd’)…。到底哪种快呢?
我们从两方面来考虑这个问题:
插入 SQL 本身执行的效率。
网络 I/O。
先说第一种方案,就是用 for 循环循环插入:
这种方案的优势在于,JDBC 中的 PreparedStatement 有预编译功能,预编译之后会缓存起来,后面的 SQL 执行会比较快并且 JDBC 可以开启批处理,这个批处理执行非常给力。
劣势在于,很多时候我们的 SQL 服务器和应用服务器可能并不是同一台,所以必须要考虑网络 IO,如果网络 IO 比较费时间的话,那么可能会拖慢 SQL 执行的速度。
再来说第二种方案,就是生成一条 SQL 插入:
这种方案的优势在于只有一次网络 IO,即使分片处理也只是数次网络 IO,所以这种方案不会在网络 IO 上花费太多时间。
当 ...
and() 和 or()的嵌套使用
and 里面嵌套 or 如下使用
QueryWrapper<ErrorData> ew = new QueryWrapper<>();ew.eq("dcjh_id", csrwInfo.getCsrwID()).and(wrapper -> wrapper.eq("wtlx", "0").or().eq("wtlx", "1"));// where dcjh_id = '' and (wtlx = '0' or wtlx = '1'),注意:这里是一个lambda表达式List<ErrorData> dataList = errorDataService.list(ew);
判断字符串相等时的注意事项
mybatis 映射文件中,if 标签判断字符串相等,两种方式:
因为 mybatis 映射文件,是使用的 ognl 表达式,所以在判断字符串 sex 变量是否是字符串 Y 的时候,
<if test="sex=='Y'.toString()"><if test = 'sex== "Y"'>
注意:不能使用
<if test="sex=='Y'">and 1=1</if>
因为 mybatis 会把’Y’解析为字符,所以不能这样写 会报 NumberFormatException
MyBatis 是使用的 OGNL 表达式来进行解析的,这个地方有一个坑需要注意下,单引号内有一个字符的情况下,OGNL 会将其以 java 中的 char 类型进行解析,那么此时 char 类型与参数 String 类型用等号进行比较的时候结果都是 false。解决方案也很简单,就是讲 test 中的单个字符用双引号括起来。
<wher ...
项目的jar包都正常引用了,但是build时就是提示jar包不存在的解决办法
如题,编译和打包都是正常的,pom 文件中依赖存在并且没有报错。找到相应包的引用位置,也能正常访问包中的内容。而且提示的一般都是基础的 jar 包找不到,比如单元测试用到的 jar 包等。。。
情形一:
其他同事提交代码时把 idea 中的 .iml 文件也一起提交了,该文件中配置的 jdk lib 路径与自己电脑中的该路径不一致。
解决方法很简单,执行一下 maven update 即可,也可以手动修改 .iml 文件中的该路径。
情形二:
排除情形一出现的原因,或使用情形一中的方法解决无效时,可以使用以下命令更新不完整依赖:
mvn -U idea:idea
需要注意的是,该命令使用的插件早在 13 年就已经停止维护,所以有可能出现各种问题,比如我遇到过的空指针异常。
情形三:
使用情形二中的方法解决无效时,可以使用以下方法再次尝试
ctrl + alt + shift + s 或 在界面菜单选择 File —> Project Structure
点击 Libraries 找到提示不存在的 jar 包(这里以 junit 为例),选中,然后右键打开菜单,选择 Conver ...
使用QueryWrapper关于时间日期比较的问题
首先明确。springmvc 默认不支持将前台传过来的日期/日期时间字符串在到达 controller 层之前直接转成 Date/LocalDate/LocalDateTime 类型的,所以接收还是要用字符串类型接收
mp 的条件构造器不支持时间日期字符串与 mysql 的 date/datetime 类型的字段的比较
所以在比较的时候。要这么写
//query:startDate->String,endDate->String,例子:2020-08-01//jcrq:mysql->date类型的// 应该同样适用2020-08-01 08:00:00的字符串和mysql中datetime类型的比较// 可以这么理解。统一转成时间戳再进行比较QueryWrapper<TSjfxJcjl> qw = new QueryWrapper<>();qw .apply(!StringUtils.isEmpty(query.getStartDate()), "UNIX_TIMESTAMP(jcrq) >= UNIX_TIM ...
常用api整理
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArraypublic static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObjectpublic static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBeanpublic static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArraypublic static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合public static final String toJSON ...
自带的分页插件的使用
建一个 page 对象传入前台的 page,和 limit 参数(推荐使用泛型,限定返回的参数类型,例子的话应该是 Page\)
调用 dao 或者 service 层时传入 page 对象
Page pages = new Page(Integer.valueOf(page), Integer.valueOf(limit));List<Map> list = dtjcXmGeneralreportService.getCxList(pages, csrwId,xlId,xb,ppbzId,Integer.valueOf(topSpeed));
service 接口层
List<Map> getCxList(Page pages, String csrwId, String xlId, String xb,String bz,Integer topSpeed);
service 层
@Override public List<Map> getCxList(Page pages, String csrwId, String xlId, String x ...
DATE_FORMAT()和STR_TO_DATE()
常用的 DATE_FORMAA()格式
DATE_FORMAT(updatetime,'%Y-%m-%d') -- 把mysql的datetime格式化成2021-09-23的字符串格式DATE_FORMAT(updatetime,'%Y-%m-%d %H:%i:%S') -- 把mysql的datetime格式化成2021-09-07 09:30:37的字符串格式
常用的 STR_TO_DATE()格式
STR_TO_DATE('2015-09-01 00:00:00','%Y-%m-%d %H:%i:%s') -- 把字符串转为datetimeg
mysql在导入.sql文件的时候报错 1067 - Invalid default value for LOCK_TIME
推荐使用以下的方式永久修改
编辑 mysql 的配配置文件 my.cnf
在[mysqld]下面添加如下列:
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
any 和 all 关键字
A = any('a','b') 等价于 A = 'a' or A = 'b'A = all('a','b') 等价于 A = 'a' and A = 'b'
总结 :any 相当于用 or 链接后面括号里的子元素,all 相当于用 and 链接后面括号里面的子元素
mysql常见的函数和问题的汇总
注意 mysql 里面关于字符串的截取下标一般都是从 1 开始
Substring(‘str’,a,b) 注意:a 是起始位置,b 是要截取得长度。且下标从 1 开始 ,如果 a 是 0,那么无论 b 是多少都返回一个空串
Round(num,a) num 如果为字符串,那么返回的也是数字。如果 num 为’a’或者’b’这种非数字类型的字符串,那么会把这种字符串当成数字 0 ,并且 a 是 0,那么就是 0 ,a 是 1,就是 0.0 。
注意:如果 num 是整数(round(2234,2)),那么无论 a 是多少,返回的都是整数(2234),如果 num 是整数型的字符串(round(‘2234’,3)),那么返回的就是带 0 的小数(2234.000)。
注意:abs(25.0)=>25.0 abs(‘25.0’) =>25
INSTR(str,substr) / instr(源字符串, 目标字符串) 获取子串第一次出现的索引,如果没有找到,则返回 0(下标从 1 开始)
使用 union all 链接两个查询结果的时候,如果链接查询结果要有各自的顺序并且总结 ...
mysql建表的几个必备字段
id(主键)
码表(在基础字典表中该字段是必须的)
排序(在基础字典表中该字段是必须的)
创建人
创建时间
修改时间
逻辑删除字段
mysql建立新用户和授权
需求:只允许某个用户访问某个库# 建立用户user能在任何ip登录,并且密码是passwdcreate user 'user'@'%' identified by 'passwd';# 授权:授予user用户能用密码passwd从任何ip登录并且有访问ctoms_test数据库任何资源的所有权限grant all privileges on ctoms_test.* to user@'%' identified by 'passwd'; # 刷新权限flush privileges;# 查看自己刚刚建立的用户SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
union和union all 关键字
区别 1:取结果的交集
union: 对两个结果集进行并集操作, 不包括重复行,相当于 distinct, 同时进行默认规则的排序;
union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;
区别 2:获取结果后的操作
union: 会对获取的结果进行排序操作
union all: 不会对获取的结果进行排序操作
区别 3:
union 看到结果中 ID=3 的只有一条select * from student2 where id < 4unionselect * from student2 where id > 2 and id < 6
union all 结果中 ID=3 的结果有两个
select * from student2 where id < 4union allselect * from student2 where id > 2 and id < 6
总结
union all 只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用 union all 的 ...
mysql dump导入sql脚本后表中的数据中文乱码
解决办法:加上—default-character-set=utf8 参数即可
mysql的安装
mysql8
查看是否有安装过 mysql
rpm -qa | grep -i mysql
使用rpm -e命令将上个命令中包列表全部删除
然后删除相关服务
chkconfig --list | grep -i mysqlchkconfig --del mysql
删除 mysql
yum -y remove MySQL-*yum -y remove MySQLyum remove mysql mysql-server mysql-libs compat-mysql51
一般用 rpm -e 的命令删除 mysql,这样表面上删除了 mysql,可是 mysql 的一些残余程序仍然存在,并且通过第一步的方式也查找不到残余,而 yum 命令比较强大,可以完全删除 mysql.(ps:用 rpm 删除后再次安装的时候会提示已经安装了,这就是 rpm 没删除干净的原因)
把所有出现的目录统统删除
find / -name mysql
查找 mysql 的一些目录,把所有出现的目录删除,可以使用 rm -rf 路径,删除时请注意,一旦删除无法恢复。
删除配置文件
rm -rf /etc/ ...
区间查询
取交集的区间查询两个区间段只要有交集就查出来
<if test='(startTime != "" and startTime != null) and (endTime == null or endTime == "")'> AND csrw.endtime >= #{startTime}</if><if test='(startTime == "" or startTime == null) and (endTime != null and endTime != "")'> AND csrw.createtime <= #{endTime}</if><if test='(startTime != "" and startTime != null) and (endTime != null and endTime != ...
开放远程连接
5.7先连接到本地数据库
切换到 mysql 数据库
use mysql
使用以下命令可以更改远程连接的设置
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
刷新权限
flush privileges;
查询 user 表看看是否生效,如果 ‘%’ ‘root’ 在第一行证明生效了
select host,user from user;