文章目录
- 习惯配置
- 0 Java踩坑记录
- 1. .xml文件的注释规范:` `
- 2. 错误提示:invalid bound statement (not found)
- 3. 弄清楚标注以及区别,如`@RequestParam`、`@PathVariable`、`@RequestParam`、`@RequestBody`、`@GetMapping` 详见1
- 4. `.xml`里的`sql`语句的某个变量取1可以过,取0不行
- 5. 【mybatis】There is no setter for property named xxx in DTO。(增加返回的变量)
- 6. sql语句查询较慢的改进策略:
- 7. 手动分页
- 8. Dao层的两个变量以上记得在变量前加`@Param()`
- 9. 解决sql的`'_'`为通配符的问题
- 10. 注意controller里加`@ResponseBody`
- 11. 注意变量类型
- 12. java String数字 转 Byte
- 13. java中逗号分隔的字符串和List相互转换
- 14. 时间戳转日期
- 15. JSONArray 要用for循环(不能用forEach)
- 16.截取特定两个标记之间的字符串
- 17. 判断字符串是否为整型且转换
- 18. 为 MySQL 的查询结果添加排名字段
- 19. Error running 'GatewayAdminServiceApplication': Command line is too long. Shorten command line for G
- 1 Java学习笔记
- 2 git 踩坑实录
- 3 mybatis plus 笔记
习惯配置
0 Java踩坑记录
1. .xml文件的注释规范:<!--//thomas 加于0417-->
注: 用快捷键ctrl+/
或者ctrl+shift+/
更为方便
2. 错误提示:invalid bound statement (not found)
解决方法: 检查mapper.java 接口中的方法名和 mapper.xml 中的statement 的 id 是否保持一致。
3. 弄清楚标注以及区别,如@RequestParam
、@PathVariable
、@RequestParam
、@RequestBody
、@GetMapping
详见1
4. .xml
里的sql
语句的某个变量取1可以过,取0不行
解决方法: 检查对应数据库中,对应变量的数据类型。具体方法,右击有该字段的表,点击对象信息,再点击DDL查看。
5. 【mybatis】There is no setter for property named xxx in DTO。(增加返回的变量)
解决方法:
1. 在Dao.xml
里ResultMap
中增加相应的变量;
2. 在DTO.java中生成set 和 get 函数(不用也没关系)。
3. 前两部已经解决,更好的方法是生成入DO文件中。
6. sql语句查询较慢的改进策略:
- 查询条件加索引或组合索引
- 参考:https://blog.csdn.net/helloHuaKai/article/details/80526733
- ALTER TABLE `table_name` ADD INDEX index_name ( `column` );
7. 手动分页
rows = Arraylist.stream().skip((page-1)*size).limit(size).collect(Collectors.toList());
PageBean初始化
8. Dao层的两个变量以上记得在变量前加@Param()
9. 解决sql的'_'
为通配符的问题
1、SELECT * FROM dbo.tb_Test
2、SELECT * FROM dbo.tb_Test WHERE name LIKE ‘%c_%’
3、SELECT * FROM dbo.tb_Test WHERE name LIKE ‘%c_%’ escape ‘’
4、SELECT * FROM dbo.tb_Test WHERE name LIKE ‘%c_wd’ escape ‘’
以上是我的测试数据,只有第四个符合要求(escape ‘’)
10. 注意controller里加@ResponseBody
11. 注意变量类型
12. java String数字 转 Byte
Byte
newByte
= Byte.valueOf(String
)
13. java中逗号分隔的字符串和List相互转换
1、将逗号分隔的字符串转换为List
String str = “a,b,c”;
List result = Arrays.asList(str.split(","));
2、将List转换为逗号分隔的字符串
(1) 利用Guava的Joiner
List list = new ArrayList();
list.add(“a”);
list.add(“b”);
list.add(“c”);
String str = Joiner.on(",").join(list);
(2)利用Apache Commons的StringUtils
List list = new ArrayList();
list.add(“a”);
list.add(“b”);
list.add(“c”);
String str = StringUtils.join(list.toArray(), “,”);
14. 时间戳转日期
https://www.runoob.com/java/date-timestamp2date.html
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main{
public static void main(String[] args){
Long timeStamp = System.currentTimeMillis(); //获取当前时间戳
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); // 时间戳转换成时间
System.out.println("格式化结果:" + sd);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒");
String sd2 = sdf2.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
System.out.println("格式化结果:" + sd2);
}
}
15. JSONArray 要用for循环(不能用forEach)
16.截取特定两个标记之间的字符串
参考:https://blog.csdn.net/m0_37865510/article/details/81099002
1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。
2、int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
3、int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引。
4、int lastIndexOf(String str, int startIndex) :从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字符串的索引。
17. 判断字符串是否为整型且转换
StringUtils.isNumeric(param)
int paramInt = Integer.parseInt(param);
18. 为 MySQL 的查询结果添加排名字段
https://www.oschina.net/question/12_63477
SET @counter=0;
SELECT @counter:=@counter+1 AS Rank,LastName,Roll_no as Roll FROM Students ORDER BY Roll_no ASC;
--也就是把临时变量, 放在from 子句里.
SELECT @counter:=@counter+1 AS Rank,LastName,Roll_no as Roll FROM Students,(SELECT @counter:=0) AS t
ORDER BY Roll_no ASC;
--不用临时变量, 用表的自关联
SELECT
(SELECT COUNT(ROLL_NO) FROM Students WHERE s.ROLL_NO <= ROLL_NO) AS Rank,
s.LastName, s.Roll_no AS Roll
FROM Students s
ORDER BY s.Roll_no ASC
19. Error running ‘GatewayAdminServiceApplication’: Command line is too long. Shorten command line for G
解决方案:
https://blog.csdn.net/weixin_43689480/article/details/100983585
1 Java学习笔记
1. 去除黄色警告线(由于代码重复)
参考:https://blog.csdn.net/ligh_sqh/article/details/79384839
2. 标注的含义
-
@RequestMapping :@RequestMapping 注解可以在控制器类的级别和/或其中的方法的级别上使用,在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。
-
@GetMapping与@PostMapping :区别在于处理的请求,前者只能处理get请求,后者只能处理post请求。
@PostMapping和@RequestBody搭配使用,且不用@PathVariable(@GetMapping用),用@RequestParam(@GetMapping也用)。
- 哪一些情况下,浏览器会发送get请求
a. 直接在浏览器地址栏输入某个地址
b. 点击链接
c. 表单默认的提交方式 - 哪一些情况下,浏览器会发送post请求?
a. 设置表单method = “post” - get请求的特点
a. 请求参数会添加到请求资源路劲的后面,只能添加少量参数(因为请求行只有一行,大约只能存放2K左右的数据)(2K左右的数据,看起来也不少。。。)
b. 请求参数会显示在浏览器地址栏,路由器会记录请求地址 - post请求的特点
a. 请求参数添加到实体内容里面,可以添加大量的参数(也解释了为什么浏览器地址栏不能发送post请求,在地址栏里我们只能填写URL,并不能进入到Http包的实体当中)
b. 相对安全,但是,post请求不会对请求参数进行加密处理(可以使用https协议来保证数据安全)。
- @RequestParam:
@RequestParam
也是一个接口,其中定义的接口方法value,name, required和defaultValue。作用:将请求参数区数据映射到功能处理方法的参数上。
@RequestParam
支持下面四种参数:- defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
- name 绑定本次参数的名称,要跟URL上面的一样
- required 这个参数是不是必须的
- value 跟name一样的作用,是name属性的一个别名
- @PathVariable:用来获得请求url中的动态参数的,请求URL中的模板变量映射到功能处理方法的参数上。
要在mapping
里加{}
,如:@RequestMapping("/hello/{id}")
public String getDetails(@PathVariable(value=“id”) String id,
@RequestParam(value=“param1”, required=true) String param1,
@RequestParam(value=“param2”, required=false) String param2){
…
} - @ResponseBody:responseBody表示服务器返回的时候以一种什么样的方式进行返回, 将内容或对象作为 HTTP 响应正文返回,值有很多,一般设定为json
- @RequestBody:一般是post请求的时候才会使用这个请求,把参数丢在requestbody里面
- @PathParam:这个注解是和spring的
pathVariable
是一样的,也是基于模板的,但是这个是jboss包下面的一个实现,上面的是spring的一个实现,都要导包 - @QueryParam:
@QueryParam
是 JAX-RS 本来就提供的,和Spring的RequestParam
作用一致
3. 各个文件的含义
知识点:
- MVC:Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码
M: model(模型),表示应用程序核心(比如数据库记录列表);
V: view(视图),显示数据(数据库记录);
C: controller(控制器), 处理输入(写入数据库记录)。 - controller:一般都把业务的逻辑写在里面;
- service(interface):接口类似于抽象类,可以实现多态;
- serviceImpl:类使用implements关键字实现接口。
- dao.java:DAO类都是进行数据操作的类,是对于数据库中的数据做增删改查等操作的代码。DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口。
- dao.xml:用于存放sql语句,实现功能。
4. JSONArray、JSONObject和Object的区别
list<object>
可以放入JSONObject类型元素
JSONObject的数据是用 { } 来表示的,
例如: { “id” : “1”, “courseID” : “123”, “title” : “Machine learning”, “content” : null }
Object 转 JSONObject(这样就可以用get取值了)
JSONObject userInfos = JSONObject.parseObject(JSON.toJSONString(userInfo));
而JSONArray,顾名思义是由JSONObject构成的数组,用 [ { } , { } , … , { } ] 来表示
例如: [ { “id” : “1”, “courseID” : “123”, “title” : “提交Machine learning” } , { “id” : “2”, “courseID” : “234”, “title”: “Deep learning” } ] ;
表示了包含2个JSONObject的JSONArray。
Object 转 JSONArray(这样就可以用for循环取值了)
JSONArray lesseeInfos = JSONArray.parseArray(JSON.toJSONString(userLesseeInfos));
Object 是 Java 类库中的一个特殊类。(代码中看起来JSONObject相似,但其实类型不一样)
5. @RequestMapping、@GetMapping和@PostMapping的区别
https://blog.csdn.net/magi1201/article/details/82226289
-
@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解
具体来说,@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。 -
@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解
具体来说,@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
6. @Override的解释
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1、可以当注释用,方便阅读; 2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。 举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
7. 深入理解接口和抽象类
https://www.cnblogs.com/dolphin0520/p/3811437.html
8. Java springboot框架mapper中sql查询语句中的foreach应用
https://blog.csdn.net/qq_39181017/article/details/83149820
<select id="selectProvinceByStoreNumber" parameterType="java.util.List" resultType="cn.smb.web.store.model.StoreEntity">
SELECT
province,
storeNumber
FROM
store
where storeNumber in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
9. 转list数组
(1)String 转 list
- 方法一
Arrays.asList(xxx, xxx)
- 方法二
List<String> status = Stream.of(xxx, xxx).collect(Collectors.toList());
(2)object转list数组
参考:https://blog.csdn.net/antony9118/article/details/71023009
// 对List进行json的转化
String jsonStr = JSON.toJSONString(tableInfoVO.getFieldInfo())
// 把json转化回list
List<FiledInfoVO> filedInfoVOList = JSON.parseArray(jsonStr,FiledInfoVO.class)
(3)JSONArray转list
JSONArray数据格式
参考:https://blog.csdn.net/qq_35868412/article/details/90179873
https://blog.csdn.net/weixin_42365088/article/details/99761931
{
"Request_ID": "621217",
"UID": "10001",
"Request_Date_Time": "20190509103029",
"ID": "['261','6','401']",
"Multi": "[{'MSI':'1440466106507','sex':'男','age':'18'},
{'MSI':'1440466106507','sex':'女','age':'17'}]"
}
JSONArray multi = request.getJSONArray("Multi");
JSONArray转list
JSONArray array = new JSONArray();
List<EventColAttr> list = JSONObject.parseArray(array.toJSONString(), EventColAttr.class);
(3)json字符串中是list
{
"Request_ID": "621217",
"UID": "10001",
"Request_Date_Time": "20190509103029",
"ID": "['261','6','401']",
"Multi": [{'MSI':'1440466106507','sex':'男','age':'18'},
{'MSI':'1440466106507','sex':'女','age':'17'}]
}
Object multi = request.get("Multi");
JSONArray multi2 = JSONArray.parseArray(JSON.toJSONString(multi));
10. sql中的按条件筛选字段(CASE用法)
CASE
WHEN `表字段1`=`某值1` THEN
`返回这个字段1`
CASE
WHEN `表字段2`=`某值2` THEN
`返回这个字段2`
END `统一为这个字样`
- where中加条件
WHERE ***
AND (CASE WHEN (条件)-加括号
THEN 怎么样
ELSE 怎么样 END)
11. json字符串转list
“[“a”, “b”]” -> [“a”, “b”]
try{
List<String> list = JsonUtil.getGlobalObjectMapper().readValue(system.getIp(), new TypeReference<List<String>>(){});
}
catch (IOException e){
logger.info("error", e)
}
2 git 踩坑实录
1. 不小心Commit了但还没push代码
https://www.cnblogs.com/ningkyolei/p/4334990.html
a)git log
b)git reset --hard commit_id
3 mybatis plus 笔记
Wrapper<类型> test = new EntityWrapper();
test.eq("key1", value1)
.and()
.eq("key2", value2);
类型2 test2;
update(test2, test1); //test1 是条件 更新test2