问题描述 注销LeetCode后进入LeetCode网站时不弹出登录框

我之前有使用QQ登录LeetCode,等我绑定邮箱的时候,才发现原来我之前有账户。
所以QQ登录时创建的账户我就注销掉了。
然后我打算登录原来的旧账户,但是奇怪的事情发生了。

在当前浏览器中,LeetCode的登录框无法弹出。如果换一个浏览器,则LeetCode的登录框可以弹出。

原因 原来账户的cache没清理掉

阅读全文 »

问题描述

我之前的项目用到的jar包都放在lib目录中,最近我打算升级成Maven项目。

但是直接在Maven中填写依赖时,运行时出现了问题。经过调试,我发现这是由于有些jar包没有被Maven导入造成的。

但是用到的jar包挺多的,密密麻麻的,人眼是很难查找到底丢失了那个jar包。

解决方案

1、先不用Maven管理jar包

先不使用Maven导入jar包,直接从原来项目的lib目录中复制全部的jar包到,Maven项目的lib目录中。

这样是可以完美运行的,和原来的项目一样。

2、逐步替换jar包

成功运行之后,把Maven项目的lib中的jar包逐个替换成pom依赖即可。

image-20210827155546255

面向对象和面向过程的区别

抽象类和接口的区别

重载和重写区别

简单SQL语句

JSP如何嵌入java代码

要说到,JSP最终转换为Servlet

企业云盘

如果有文件服务器,则存储到文件服务器,否则就存储到当前服务器的路劲。

Redis五个基本类型

字符串,哈希,列表,集合

image-20210827155846268

创建Mybatis Generator配置文件

image-20210829211230965
image-20210829211255484

引入外部配置文件

MyBatis Generator config 是可以引入外部配置文件的,路径为相对于当前配置文件的路径。
<generatorConfiguration>下按下alt+/启动代码提示,然后选择properties

image-20210829211525479

然后在生成的properties标签里面按下alt+/,选择resource

image-20210829211610728

输入properties文件的相对于MybatisGenerator配置文件的相对路径:

1
2
3
4
<generatorConfiguration>
<properties resource="db.properties" />
...
</generatorConfiguration>

image-20210829211751581

如果配置正确的话,按下Ctrl+鼠标左键,点击properties的文件名,可以跳转到properties文件。

配置context

http://mybatis.org/generator/configreference/context.html

<generatorConfiguration>

1
2
3
4
5
6
<generatorConfiguration>
<properties resource="db.properties" />
<context id="context1" defaultModelType="flat" targetRuntime="MyBatis3Simple" >
...
</context>
</generatorConfiguration>
context属性值 描述
id 随便填,保证多个 context的id 不重复就行
defaultModelType 可以不填,默认值 conditionalflat表示一张表对应一个po
targetRuntime 可以不填,这个配置会影响生成的mapper.java和mapper.xml的内容。默认值 MyBatis3,常用的还有 MyBatis3Simple

context的targetRuntime属性

MyBatis3

targetRuntime = MyBatis3,生成的 dao 和 mapper.xml 如下

MyBatis3Simple

targetRuntime = MyBatis3Simple,生成的 dao 和 mapper.xml 如下,接口会少很多,只包含最最常用的

context标签的属性 就讲完了,唯一需要注意的就是targetRuntime的值,该配置成什么看个人喜好

context子标签

context的子元素必须按照以下给出的个数、顺序配置。(是的,没错 MyBatis Generator 对配置的循序还有要求)

  1. property (0..N)
  2. plugin (0..N)
  3. commentGenerator (0 or 1)
  4. jdbcConnection (需要connectionFactory 或 jdbcConnection)
  5. javaTypeResolver (0 or 1)
  6. javaModelGenerator (至少1个)
  7. sqlMapGenerator (0 or 1)
  8. javaClientGenerator (0 or 1)
  9. table (1..N)

plugin

plugin标签可以配置一个插件,
具体有哪些插件可用,详见:http://mybatis.org/generator/reference/plugins.html

给生成的PO类添加equasl和hashCode方法

1
2
3
4
5
6
7
8
<generatorConfiguration>
<properties resource="db.properties" />
<context id="context1" defaultModelType="flat" targetRuntime="MyBatis3Simple" >
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<!-- <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin> -->
...
</context>
</generatorConfiguration>

这个插件给生成的Java模型对象增加了equals和hashCode方法

commentGenerator

http://mybatis.org/generator/configreference/commentGenerator.html

默认会生成注释和时间戳

commentGenerator用来配置生成的注释。默认是生成注释的,并且会生成时间戳,如下

如果你想要保留注释和时间戳,可以不配置 commentGenerator

不保留时间戳

如果你不想保留时间戳,需要如下配置

1
2
3
4
<commentGenerator>
<!-- 不希望生成的注释中包含时间戳 -->
<property name="suppressDate" value="true"/>
</commentGenerator>

保留数据库表中字段的注释信息

默认生成的注释是不会有 数据库 表中字段的注释,如果你想知道每个字段在数据库中的含义(前提是数据库中对应表的字段你添加了注释),可以如下配置

1
2
3
4
<commentGenerator>
<!-- 添加 db 表中字段的注释 -->
<property name="addRemarkComments" value="true"/>
</commentGenerator>

不生成注释信息

MyBatis Generator生成注释无用信息太多了,所以一般都选择不生成注释

1
2
3
4
<commentGenerator>
<!-- 是否不生成注释 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>

目前的配置信息如下:

1
2
3
4
5
6
7
8
9
10
<generatorConfiguration>
<properties resource="db.properties" />
<context id="context1" defaultModelType="flat" targetRuntime="MyBatis3Simple">
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
...
</context>
</generatorConfiguration>

jdbcConnection

http://mybatis.org/generator/configreference/jdbcConnection.html

MyBatis Generator 需要链接数据库,所以需要配置 jdbcConnection.

1
2
3
4
5
6
7
8
<jdbcConnection
connectionURL="${dataSource.jdbcUrl}"
driverClass="${dataSource.driverClass}"
password="${dataSource.password}"
userId="${dataSource.user}">
<!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true -->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>

jdbcConnection的属性

connectionURL,driverClass,属性值${xxx}里面的xxx是,外部配置文件db.properties中的key名称,我的properties文件内容如下,根据你自己的properties文件填写即可。

1
2
3
4
5
6
7
8
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/mybatis
dataSource.user=root
dataSource.password=root
dataSource.maxPoolSize=20
dataSource.maxIdleTime = 1000
dataSource.minPoolSize=6
dataSource.initialPoolSize=5

你也可以写死,如下所示:

1
2
3
4
5
6
7
8
<jdbcConnection
connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis"
driverClass="com.mysql.jdbc.Driver"
password="root"
userId="root">
<!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true -->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>

那就不需要配置<properties resource="db.properties"/>

mysql8需要配置

这里面值得注意的是<property name="nullCatalogMeansCurrent" value="true"/>,因为我用的 mysql-connector-java 版本是 8.0.17,如果不配置这一项,会找不到对应的数据库,官网对此的解释是:

具体原因参考这篇文章 MyBatis Generator踩坑与自救

javaTypeResolver

http://mybatis.org/generator/configreference/javaTypeResolver.html
javaTypeResolver 是配置 JDBC 与 java 的类型转换规则,或者你也可以不用配置,使用它默认的转换规则。
就算配置也只能配置 bigDecimal 类型和时间类型的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<javaTypeResolver>
<!--是否使用 bigDecimal,默认false。
false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal-->
<property name="forceBigDecimals" value="true"/>
<!--默认false
false,将所有 JDBC 的时间类型解析为 java.util.Date
true,将 JDBC 的时间类型按如下规则解析
DATE -> java.time.LocalDate
TIME -> java.time.LocalTime
TIMESTAMP -> java.time.LocalDateTime
TIME_WITH_TIMEZONE -> java.time.OffsetTime
TIMESTAMP_WITH_TIMEZONE -> java.time.OffsetDateTime
-->
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>

javaModelGenerator

http://mybatis.org/generator/configreference/javaModelGenerator.html

配置 po类 生成的包路径和项目路径,如下

1
2
3
4
5
6
7
<javaModelGenerator targetPackage="com.po"
targetProject="MyBookAppFenLi">
<!-- 是否让schema作为包的后缀,默认为false -->
<property name="enableSubPackages" value="true" />
<!-- 是否针对string类型的字段在set方法中进行修剪,默认false -->
<!-- <property name="trimStrings" value="true" /> -->
</javaModelGenerator>

sqlMapGenerator

http://mybatis.org/generator/configreference/sqlMapGenerator.html
配置 Mapper.xml 文件的生成目录

1
2
3
<sqlMapGenerator targetPackage="com.mapper" targetProject="MyBookAppFenLi">
<!--<property name="enableSubPackages" value="false"/>-->
</sqlMapGenerator>

javaClientGenerator

http://mybatis.org/generator/configreference/javaClientGenerator.html
配置Mapper接口 XxxMapper.java 文件的生成目录

1
2
3
<javaClientGenerator targetPackage="com.wqlm.boot.user.dao" targetProject="src/main/java" type="XMLMAPPER">
<!--<property name="enableSubPackages" value="false"/>-->
</javaClientGenerator>

type属性值

context targetRuntime is MyBatis3
type属性值 描述
ANNOTATEDMAPPER The generated objects will be Java interfaces for the MyBatis 3.x mapper infrastructure. The interfaces will be based on annotations and MyBatis 3.x SqlProviders. No XML mapper files will be generated.The ANNOTATEDMAPPER requires MyBatis version 3.0.4 or higher.
MIXEDMAPPER The generated objects will be Java interfaces for the MyBatis 3.x mapper infrastructure. The interfaces will be based on a mix of annotations and XML. An annotation will be used where a simple annotation will work. This client will not generate and Sql Provider, so all complex dynamic SQL will be generated in XML.The MIXEDMAPPER requires MyBatis version 3.0.4 or higher.
XMLMAPPER The generated objects will be Java interfaces for the MyBatis 3.x mapper infrastructure. The interfaces will be dependent on generated XML mapper files.

context targetRuntime is MyBatis3Simple

type属性值 描述
ANNOTATEDMAPPER The generated objects will be Java interfaces for the MyBatis 3.x mapper infrastructure. The interfaces will be based on annotations and MyBatis 3.x SqlProviders. No XML mapper files will be generated.The ANNOTATEDMAPPER requires MyBatis version 3.0.4 or higher.
XMLMAPPER The generated objects will be Java interfaces for the MyBatis 3.x mapper infrastructure. The interfaces will be dependent on generated XML mapper files.

table

http://mybatis.org/generator/configreference/table.html
一个 table 对应一张表,如果想同时生成多张表,需要配置多个 table

1
2
3
4
5
6
7
<table schema="" tableName="tb_user" domainObjectName="User"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false"
selectByExampleQueryId="false">
<!--是否使用实际列名,默认为false -->
<!--<property name="useActualColumnNames" value="false" /> -->
</table>

domainObjectName

domainObjectName属性表示生成的PO类的类名,如果domainObjectName不配置时,它会按照帕斯卡命名法将表名转换成类名

enableXXXByExample属性

enableXXXByExample 默认为true,但只有在targetRuntime="MyBatis3"时才生效

生效时,会在po下多生成一个 XxxExample.java 的文件,如下

一个简单的user的Example帮助类有470行,我一般不会去用,如上全设置为false

targetRuntime="MyBatis3Simple"时,enableXXXByExample 不管为true、还是false 都不生效。

完整配置

/MyBookAppFenLi/src/MybatisGeneratorConfig.xml
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="db.properties" />

<!-- id="context1" id可以随便写,不要重复就行了 -->
<!-- defaultModelType="flat" flat表示一张数据库表 生成一个po类 -->
<!-- targetRuntime="MyBatis3Simple" 表示生成mapper的方式,MyBatis3Simple表示生成dao接口和xml -->
<context id="context1" defaultModelType="flat" targetRuntime="MyBatis3Simple">

<!-- 具体插件,详见http://mybatis.org/generator/reference/plugins.html -->
<!-- 插件:自动生成equals,hashCode方法 -->
<!-- <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin> -->
<!-- 插件: 自动生成toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- 自动生成注释设置 -->
<commentGenerator>
<!-- 不希望生成的注释中包含时间戳 -->
<!-- <property name="suppressDate" value="true" /> -->
<!-- 添加 数据库 表中字段的注释 -->
<!-- <property name="addRemarkComments" value="true" /> -->
<!-- 是否不生成注释 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>

<jdbcConnection connectionURL="${dataSource.jdbcUrl}"
driverClass="${dataSource.driverClass}" password="${dataSource.password}"
userId="${dataSource.user}">
<!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true -->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- <javaTypeResolver> -->
<!--是否使用 bigDecimal,默认false。
false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal -->
<!-- <property name="forceBigDecimals" value="true" /> -->
<!--默认false
false,将所有 JDBC 的时间类型解析为 java.util.Date
true,将 JDBC 的时间类型按如下规则解析
DATE -> java.time.LocalDate
TIME -> java.time.LocalTime
TIMESTAMP -> java.time.LocalDateTime
TIME_WITH_TIMEZONE -> java.time.OffsetTime
TIMESTAMP_WITH_TIMEZONE -> java.time.OffsetDateTime
-->
<!-- <property name="useJSR310Types" value="true" /> -->
<!-- </javaTypeResolver> -->

<!-- PO类生成 -->
<javaModelGenerator targetPackage="com.domain"
targetProject="MyBookAppFenLi">
<!-- 是否让schema作为包的后缀,默认为false -->
<property name="enableSubPackages" value="true" />
<!-- 是否针对string类型的字段在set方法中进行修剪,默认false -->
<!-- <property name="trimStrings" value="true" /> -->
</javaModelGenerator>
<!-- Mapper.xml生成 -->
<sqlMapGenerator targetPackage="com.mapper"
targetProject="MyBookAppFenLi">
<!-- 是否让schema作为包的后缀,默认为false -->
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口生成 -->
<javaClientGenerator targetPackage="com.mapper"
targetProject="MyBookAppFenLi" type="XMLMAPPER" />
<!-- schema为数据库名,oracle需要配置,mysql不需要配置。
tableName为对应的数据库表名
domainObjectName 是要生成的实体类名(可以不指定)
enableXXXByExample 默认为 true, 为 true 会生成一个对应Example帮助类,帮助你进行条件查询,不想要可以设为false
-->
<!-- 数据库表和PO类的映射 -->
<table schema="" tableName="tb_user" domainObjectName="User"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false"
selectByExampleQueryId="false">
<!--是否使用实际列名,默认为false -->
<!--<property name="useActualColumnNames" value="false" /> -->
</table>
<table schema="" tableName="tb_book" domainObjectName="Book"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false"
selectByExampleQueryId="false">
<!--是否使用实际列名,默认为false -->
<!--<property name="useActualColumnNames" value="false" /> -->
</table>
</context>
</generatorConfiguration>

Eclipse运行MyBatisGenarator

在MybatisGenarator的配置文件上右键,选择 Run As,然后选择Run MyBatis Generator即可。
image-20210829222745789

生成的效果

PO类

Book.java

/MyBookAppFenLi/src/com/domain/Book.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package com.domain;

import java.util.Date;

public class Book {
private Integer id;

private String name;

private String author;

private Date publicationdate;

private String publication;

private Double price;

private String image;

private String remark;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

public Date getPublicationdate() {
return publicationdate;
}

public void setPublicationdate(Date publicationdate) {
this.publicationdate = publicationdate;
}

public String getPublication() {
return publication;
}

public void setPublication(String publication) {
this.publication = publication;
}

public Double getPrice() {
return price;
}

public void setPrice(Double price) {
this.price = price;
}

public String getImage() {
return image;
}

public void setImage(String image) {
this.image = image;
}

public String getRemark() {
return remark;
}

public void setRemark(String remark) {
this.remark = remark;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", name=").append(name);
sb.append(", author=").append(author);
sb.append(", publicationdate=").append(publicationdate);
sb.append(", publication=").append(publication);
sb.append(", price=").append(price);
sb.append(", image=").append(image);
sb.append(", remark=").append(remark);
sb.append("]");
return sb.toString();
}
}

User.java

/MyBookAppFenLi/src/com/domain/User.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
73
74
75
76
77
78
79
package com.domain;

public class User {
private Integer id;

private String loginname;

private String password;

private String username;

private String phone;

private String address;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getLoginname() {
return loginname;
}

public void setLoginname(String loginname) {
this.loginname = loginname;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", loginname=").append(loginname);
sb.append(", password=").append(password);
sb.append(", username=").append(username);
sb.append(", phone=").append(phone);
sb.append(", address=").append(address);
sb.append("]");
return sb.toString();
}
}

mapper接口

BookMapper.java

/MyBookAppFenLi/src/com/mapper/BookMapper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.mapper;

import com.domain.Book;
import java.util.List;

public interface BookMapper {
int deleteByPrimaryKey(Integer id);

int insert(Book record);

Book selectByPrimaryKey(Integer id);

List<Book> selectAll();

int updateByPrimaryKey(Book record);
}

UserMapper.java

/MyBookAppFenLi/src/com/mapper/UserMapper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.mapper;

import com.domain.User;
import java.util.List;

public interface UserMapper {
int deleteByPrimaryKey(Integer id);

int insert(User record);

User selectByPrimaryKey(Integer id);

List<User> selectAll();

int updateByPrimaryKey(User record);
}

Mapper.xml

BookMapper.xml

/MyBookAppFenLi/src/com/mapper/BookMapper.xml
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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.BookMapper">
<resultMap id="BaseResultMap" type="com.domain.Book">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="author" jdbcType="VARCHAR" property="author" />
<result column="publicationdate" jdbcType="DATE" property="publicationdate" />
<result column="publication" jdbcType="VARCHAR" property="publication" />
<result column="price" jdbcType="DOUBLE" property="price" />
<result column="image" jdbcType="VARCHAR" property="image" />
<result column="remark" jdbcType="VARCHAR" property="remark" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from tb_book
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.domain.Book">
insert into tb_book (id, name, author,
publicationdate, publication, price,
image, remark)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{author,jdbcType=VARCHAR},
#{publicationdate,jdbcType=DATE}, #{publication,jdbcType=VARCHAR},
#{price,jdbcType=DOUBLE},
#{image,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR})
</insert>
<update id="updateByPrimaryKey" parameterType="com.domain.Book">
update tb_book
set name = #{name,jdbcType=VARCHAR},
author = #{author,jdbcType=VARCHAR},
publicationdate = #{publicationdate,jdbcType=DATE},
publication = #{publication,jdbcType=VARCHAR},
price = #{price,jdbcType=DOUBLE},
image = #{image,jdbcType=VARCHAR},
remark = #{remark,jdbcType=VARCHAR}
where id = #{id,jdbcType=INTEGER}
</update>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer"
resultMap="BaseResultMap">
select id, name, author, publicationdate, publication, price, image, remark
from tb_book
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="BaseResultMap">
select id, name, author, publicationdate, publication, price, image, remark
from tb_book
</select>
</mapper>

UserMapper.xml

/MyBookAppFenLi/src/com/mapper/UserMapper.xml
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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.domain.User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="loginname" jdbcType="VARCHAR" property="loginname" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="address" jdbcType="VARCHAR" property="address" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from tb_user
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.domain.User">
insert into tb_user (id, loginname, password,
username, phone, address
)
values (#{id,jdbcType=INTEGER}, #{loginname,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
#{username,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
#{address,jdbcType=VARCHAR}
)
</insert>
<update id="updateByPrimaryKey" parameterType="com.domain.User">
update tb_user
set loginname = #{loginname,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR},
username = #{username,jdbcType=VARCHAR},
phone = #{phone,jdbcType=VARCHAR},
address = #{address,jdbcType=VARCHAR}
where id = #{id,jdbcType=INTEGER}
</update>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer"
resultMap="BaseResultMap">
select id, loginname, password, username, phone, address
from tb_user
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="BaseResultMap">
select id, loginname, password, username, phone, address
from tb_user
</select>
</mapper>

生成动态SQL配置

动态生成需要把设置为,并设置为

1
2
3
4
5
6
7
8
9
<context id="context1" defaultModelType="flat" targetRuntime="MyBatis3">
...
<!-- Mapper接口生成 -->
<!-- type="XMLMAPPER"SQL实现写在Xml文件 -->
<!-- type="ANNOTATEDMAPPER"SQL实现写在Mapper接口文件 -->
<javaClientGenerator targetPackage="com.mapper"
targetProject="MyBookAppFenLi" type="ANNOTATEDMAPPER" />
...
</context>
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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="db.properties" />
<context id="context1" defaultModelType="flat" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>

<jdbcConnection connectionURL="${dataSource.jdbcUrl}"
driverClass="${dataSource.driverClass}" password="${dataSource.password}"
userId="${dataSource.user}">
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- PO类生成 -->
<javaModelGenerator targetPackage="com.domain"
targetProject="MyBookAppFenLi">
<property name="enableSubPackages" value="true" />
</javaModelGenerator>
<!-- Mapper.xml生成 -->
<sqlMapGenerator targetPackage="com.mapper"
targetProject="MyBookAppFenLi">
<!-- 是否让schema作为包的后缀,默认为false -->
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- Mapper接口生成 -->
<!-- type="XMLMAPPER"SQL实现写在Xml文件 -->
<!-- type="ANNOTATEDMAPPER"SQL实现写在Mapper接口文件 -->
<javaClientGenerator targetPackage="com.mapper"
targetProject="MyBookAppFenLi" type="ANNOTATEDMAPPER" />
<!-- 数据库表和PO类的映射 -->
<table schema="" tableName="tb_user" domainObjectName="User"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false"
selectByExampleQueryId="false">
<!--是否使用实际列名,默认为false -->
<!--<property name="useActualColumnNames" value="false" /> -->
</table>
<table schema="" tableName="tb_book" domainObjectName="Book"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false"
selectByExampleQueryId="false">
<!--是否使用实际列名,默认为false -->
</table>
</context>
</generatorConfiguration>

参考资料

https://juejin.cn/post/6844903982582743048

期刊采编系统

车货对接系统

路线(id,起点,出发时间,终点,到达时间,载重,乘宽高,pid)

中孚软件可以投
中科创达

金智教育 中科创达, 焦点科技, 海康威视 华苏

数据结构

查找

B-树和B+树

面经分享

image-20210828105253316

MYSQL索引机制

PPT

image-20210828142632378

image-20210828143158440

image-20210828144440672

左模糊索引不会失效,全模糊索引会失效

问SQL优化你知道吗?

  • 能有嵌套查询的就不要用连接查询

  • 如果一定要用连接查询,尽量先减少连接的数据量

  • 尽量不要使索引失效

索引的优化

mysql锁机制

image-20210828145322045

频繁增删改查就用InnoDB

image-20210828145645204

image-20210828145814792

华为OV?14k

设计模式

需求1:切换到其他程序之后,改变窗体的透明度

问题

问题,刚开始使用鼠标事件来实现,鼠标进入窗体时不透明,鼠标移出窗体时透明。
但是这种方式有问题,当鼠标进入文本框的时候,窗体也透明了。
这说明虽然文本框也是在窗体里面,但从鼠标从窗体移动到文本框的时候,java认为鼠标退出了窗体。

解决方案

鼠标进入窗体的时候,设置透明度为1.0f,或文本框得到焦点的时候设置透明度为1.0f
这样就做到了窗体不透明的效果。

然后加入一个线程来判断窗体是否在活动。
当从窗体,移动到其他程序时,窗体就不活动了,这个时候就可以让窗体透明了。

需求2:窗体不活动的时候收起文本域

虽然离开窗体之后,窗体会变得不透明,但是显示程序输出内容的文本域依然占据着空间,如果程序输出的内容过多,则会占据大量的显示区域。
所以我希望离开窗体之后就把把文本域收起。
如何实现,在线程体中,把textarea所在的滚动面板设置为不可见,然后再重绘窗体即可。

需求3:鼠标悬停在窗体上的时候不透明

此时并不是活动窗口,

项目

社团管理系统

中小学生选课系统

使用缓存
学生选课,不要选一个,就入库一个,而是先写到缓存,然后再批量入库。

用户-角色-权限系统

设计的时候是通用的,可以整合到其他项目中。

用户表

不要设计太多信息,

1
|userid|password|status|

设置其他系统的时候,再加入用户详细表详细表的userid和用户表的userid一样就行了。

User(userid,password,status)

角色表

Role(role_id,role_name,pid)

用户角色表

UserRole(id,userid,roleid)

权限表

控制请求URI,对应的权限,例如管理员可以进入/adimin/*后的URL
普通用户只能进入/user/*这类的URL
operation

Operation(opid,title,URI)

角色-权限表

父亲角色,
RoleOperation(id,roleid,opid)

权限在哪里验证的,

  • 拦截器
  • AOP,对所有Web层的处理做切片

与其他系统整合

在权限系统的在上面的表上加入app_id,表示其他系统的id.

单点登录?

企业云盘系统

用户决策权限

部门表

部门有子部门,部门拆分和并。
Department(id,dname,pid)

文件夹表

folder(id,name,icon,pid,creator,部门id,公共空间id)

文件信息表

file(fid,name,type,size,forlderID,creator,部门id,空间id,filepath)

员工登录系统的时候可以看到那些文件?

  • 公司公共空间
  • 部门公共空间
  • 个人空间
  • 分享空间(只能查看)

使用虚拟文件夹

部门拆分,如何拆分文件。

员工离职,员工的私人信息,如何删除。

问卷调查系统

题库

题干表(tid,title,…),可以加入[type]
选项表(sid,title)
题目表(id,tid,sid,sort),sort表示题目选型的顺序。

试卷库

试卷(id,name,创建者,介绍)
试卷题目表(id,paperid,题目id,sort)
约束表(id,sid,perperID,题目id)。如果sid选中,则perperID后面的就不显示

调查

调查表(nid,title主题,目标,创建者,起始时间,paperid使用那些问卷去调查,样本ID)
回收表(id,nid哪次调查的,paperid问卷ID,题目ID,回答,用户ID,时间)

约束表,当选择一些选项的时候,后面的选型要动态调整。

其他

简历不要写求职意向?

你的项目哪里来的?
老师接的项目,让学生做的。老师把项目让几个学生做,然后挑写的好的。

有层级关系的如何设计表

地址表

1
2
3
4
5
6
7
8
9
10
|id|title|pid|
|:--|:--|:---|
|0|中国|-1|
|1|江苏|0|
|2|安徽|0|
|3|南京|1|
|4|扬州|1|
|5|镇江|1|
|10|栖霞区|3|
|11|玄武区|3|

查询省:

1
select * from add where pid=0

查询江苏省下的市:

1
select * from add where pid=1

查询安徽省下的市:

1
select * from add where pid=2

评论表

情况已经变了

疫情之后,转线上了。
在线笔试,
在线面试

线下

image-20210826190502917

不能过于随意,

拖鞋x

短裤x

衣服朴素,不能有巨大标语,不能有脏话。

不能过于正式

不要穿正装,西装皮鞋x

image-20210826190847465

如果时间有冲突,的时候一定要先和hr协调好时间。

如果真的迟到了,先和hr沟通,直接说,不好意思,有事冲突了,看能不能换一下时间。

要先协调好,要能从容的过去。

image-20210826191248448

正常

image-20210826191334323

image-20210826191416888

image-20210826191539487

看下巴,

偶尔眼神交流可以。

不要一直等着。

不要和面试官握手

image-20210826191807372

面试官,在你离开之后,才会打分。要留最后的好印象。

image-20210826191846819

面试完之后,朋友圈不要屏蔽hr,朋友圈内容要积极。

image-20210826192132971

image-20210826192237526

一分钟左右

把自己学习的心路历程说一下,就OK.

我叫xx,来自默默学院。

我对编程比较感兴趣,自学了那些那些那些。

不管那个公司的面试的自我介绍,都是这些,不要变来变去。

image-20210826192538289

我们公司加班比较多

我们公司不怎么加班。

回答都是,

既然我选择了软件开发,我就对加班有心理准备。

我么加班比较多,你能加班多少小时,加班费有多少。

答案:只要我身体受得了,没问题。

加班的情况

  • 硬性加班
    • 业务多,有事干,优化产品。
    • 出事故,需要马上处理
  • 其他加班
    • 培训,交流,讲自己的工作内容(防止跑路后人无法接盘)。
    • 刚入职,干的都是边边角角的事情,
      • 先熟悉业务处理流程
      • 琐碎的事情多,改的代码少,看的多。
      • 可以看公司的其他业务流程,(这样才是提升自己的机会)

image-20210826193805537

我之前学编程,觉得很难,经过不断的学习,提高了编程能力,觉得有点成就感。

image-20210826193925482

尽量积极,阳光,不要写无聊的事情。

image-20210826194107541

多多少少要了解一下。

image-20210826194145451

这个问题是仅次于加班的问题

我未来两到三年的时间,争取做到公司的技术骨干。

提高技术水平。

两年内不要跳槽

跳槽的情况

  • 不能忍受。领导不行,团队不行
  • 有更好的机会

不跳槽的情况

  • 有前景,有盼头。
  • 没找到机会(两到三年后不到30K的就先不要动)工资不翻倍先不要动。

image-20210826194729288

问,你什么时候开始学的编程?

答:大二上,开始接触Java编程,然后再慢慢一点点开始学。

或者自我接收里面说,大一接触c语言,大二开始基础Java编程,然后学了那些那些,做了那些那些。

image-20210826194956087

优点,你可以随便说。

缺点,道德上面不能说

X:我爱贪图小便宜(错)

X:我爱背后依赖别人(错)

可以说性格缺点,我比较啰嗦,我敏感。

细心强迫症

我心里强迫,强迫症(这种写代码最好)

不能收粗心

更不能说,粗心(超级错误),对于细节不够关注(简历上术语书写错误)

大大咧咧

马大哈

丢三落四

(这样性格的人不能写代码)

image-20210826195512226

可以直接拒绝,直接说我就喜欢写代码。你从代码做起,后面可以转其他。

短期轮岗可以接受

前端,测试,产品经理,运维,这些你后面有的是机会去做。

image-20210826195820782

直接回答,说我的技术能力是瞒足贵公司要求的。

image-20210826195916185

要了解对方工资的薪资水平

看准网,校园Offer网,问张。

给你多少就是多少。

面试官问这个是可以用来否定你

很多公司都是一口价,半年的试用期内,会根据第一次定的薪水,调薪。

好的在薪水上加,差的人在薪水上减薪,更差的滚蛋。

先看对方的薪酬,不要说得很准,说一个范围。百分之20的范围内。

如果他们薪酬是11,可以说12到14K。或者10-13K。

结构化面试都是,给定薪酬段匹配。

总结:

  1. 提前了解
  2. 说薪酬段

image-20210826200550737

没什么要问的,等贵公司通知。

没什么要问的,等入职。

不要乱问?

如:

  • 你们公司几号发工资
  • 我入职之后怎么请病假
    • 事假,病假怎么请?

  • 你们老总

问点对自己和公司都有帮助的

入职之前我需要做什么准备

入职之前我提前去实习吗

我最迟什么时候能接受到通知,最迟什么时候发Office

我需要提前去公司附近租房吗,(不要问公司提供住宿吗)low,

我实习期间会有师傅带吗。

image-20210826201131516

态度

例如让你转到其他城市去是否可以。

例如让你转语言,例如转到Go,C#,

  • 答,可以,带薪学习。不要犹犹豫豫

我们的层次(海康,小米,vivo,oppo),大厂

自信

不要显得无精打采,没精神。

不要说不会或不知道

面试官一定会问到你不知道的,为了测试你的边界。

要换种说法,要积极的。

积极回答不知道

暂时没有接触到

暂时没有学到这块

还没有深入到这个程度。

我还没来得及学到这个地方就

image-20210826202244567

如果技术上与面试官有争执,不要认怂,说我印象中的是这样的,我回去查一下。

非技术问题,回到的一定要正向积极的。

你的领导让你做一件事,但是可能造成公司损失。你是做,还是不做。

不干,积极向领导说明这样对公司有害。

不干,积极向领导说明,要求向更上层的领导请示是否有害。

干,可能是我的眼界不够,才会觉得是有害的。

一定要总结

要求:

  • 及时
    • 面试完,就总结
      • 线上面试结束就总结。
      • 线下面试到安全的地方就总结。
  • 细致
    • 要精确到最细致的问题,问的是那个具体的问题。
    • 你怎么回答的
  • 可视化
    • 要整理成册

建议:

  • 发到群里,保留问题,自己的回答可以删掉

过一段时间,要回看总结,要看到进步,要看到里面问的共性

这个共性,就是你下次要说的关键点。下次在这个地方就要多注意将。