目录
#、SSM框架中Controller接收前端传过来的数据的几种方式
#、JVM
1. .java文件编译成------>ClassFile----->类加载器(classloader)
对象的引用在栈里,对象的实例保存在堆里。
new生成实例。
.getClass返回类的模板class。
.getClassLoader返回classloader类加载器。
2.加载器
a、虚拟机自带的加载器
b、启动类(根)加载器(Bootstrap ClassLoader)
c、扩展类加载器 (Extention ClassLoader) .getClassLoader().getParent()
位置:\jre\lib\ext
d、应用程序加载器 (Application ClassLoader) .getClassLoader()
3.双亲委派机制:
好处:a为了安全b保证不会加载重复类
原理:User ClassLoader开始从app-exc-boot的顺序往上找这个类,一直找到根加载器,若有,则执行已有的类,若没有,在按照boot-exc-app的顺序往下找。
如果都无法加载,就会触发findclass,抛出classNotFoundException.
4.沙箱安全机制:限制程序运行的环境。
组成的基本组件:字节码校验器、类加载器
5.natice本地方法栈:JNI:java native innerface。专门开辟了一块内存空间:native method stack
6.PC寄存器:Program Counter Regiser
7.方法区:
静态变量,常量,类信息(构造方法,接口定义),运行时的常量池存在方法区中,但是,实例变量存在堆内存中,与方法区无关
常量池:
#、线程
进程是资源分配的最小单位,线程是CPU调度的最小单位
#、认识git
#、git的常用命令
linux常用命令
pwd显示当前所在目录
clear清屏
ll显示当前目录的所有文件
git init 初始化仓库
#、Mybatis
1.resultMap的作用:当数据库中的字段名称和实体类对象的属性名不一致时,可以进行转换
2.当前查询的结果没有对象一个表的时候,可以自定义一个结果集
3.sql:sql语句片段,将公共的部分抽取出来。通过include标签引用sql语句
4.动态sql举例之新增
<!-- prefix前缀,suffix后缀,suffixOverrides去掉多余字符串-->
<insert id="addBook2" parameterType="Books">
insert into ssmbuild.books
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="bookName != null">
bookName,
</if>
<if test="bookCounts != null">
bookCounts,
</if>
<if test="detail != null">
detail,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="bookName != null">
#{bookName},
</if>
<if test="bookCounts != null">
#{bookCounts},
</if>
<if test="detail != null">
#{detail},
</if>
</trim>
</insert>
5.动态sql之更新:<set>标签里用if-test,set标签可以自动去掉最后面的逗号。
#、项目学习:
ModelAndView:
既包含视图信息,也包含模型数据。IndexController.java 做修改,将前端URL传参,在控制台输出参数值,并在视图层输出username;
<context:component-scan base-package="com.ycy.controller" />扫描有注解的文件
配置(ApplicationContext-mvc.xml设置扫描控制层等和ApplicationContext.xml是mybatis的一套配置)
-》实体类
-》ModelAndView .setViewName指定跳转的页面/跳转到指定的页面.addObject设置需要返回的值
-》dao/mapper 定义方法的接口
-》user.xml sql语句
-》service/serviceimpl service:接收controller的请求。转换并调用 impl是sql的具体实现
-》 Controller层:接收前端的数据并处理后返回页面
#、eclipse快捷键:
查找接口的实现类:ctrl+T
删除行: Ctrl+D
恢复或反撤销: Ctrl+Y
跳至指定行: Ctrl+L
重命名变量名或方法名: Alt+Shift+R
格式化: Ctrl+Shift+F
优化Imports: Ctrl+Shift+O 删除多余
自动补全提示: Alt+/
单行注释:Ctrl+/
多行注释:Ctrl+Shift+/
查找类: Ctrl+Shift+T
查找文件: Ctrl+Shift+R
查看类/方法实现: Ctrl+T
生成Getter/Setter/构造器等: Alt+Shift+S
上下移动代码行: Alt+↑,↓
大小写切换 Ctrl+Shift+X,Y
上下移动选中的行:Alt+Up/Down
前一个/后一个单词:Ctrl+Right/Left
上下滚屏:Alt+Up/Down
#、运算符
与&&
或||
1.位移运算符<< 和>
- >> 右移 把二进制的第一个操作数向右移动第二个操作数个位数,移出的数据不要,剩下的二进制转为十进制
- 8<<3 --> 8*2^3
- << 左移 把二进制的第一个操作数向做移动第二个操作数个位数,空余位补0,转为十进制
- 8>>3 --> 8/2^8
bigInteger的testBit
1<<1可以看做是1*2,结果为2。1<<2可以看做是1*2的2次方,结果为4。1<<3可以看做是1*2的3次方,结果为8。
2.&与运算符:二进制同一位置的两个数字对比。两个都是1为1,一个是0为0;
3.|或运算符:二进制同一位置的两个数字对比。有一个是1为1;两个都是0为0;
4.^位异或运算符 : 比较统一位置的两个数,相同为0,不同为1;
5.~位取反运算符: 将0改为1,将1改为0;
#、进制转换:
1.二进制转换十进制:
abcd.efg(2)=d*2^0+c*2^1+b*2^2+a*2^3+e*2^-1+f*2^-2+g*2^-3(10)
2.十进制转换二进制:
#、SSM框架中Controller接收前端传过来的数据的几种方式
1.使用form表单的参数入参
@RequestMapping(value="/add",method=RequestMethod.POST)
public String addJq(String userName,String passWord){
Jq jq = new Jq(userName,passWord);
System.out.println("String方法:"+jq.toString());
jqservice.insertjq(jq);
return "roles";
}
2.通过bean的方法接收参数
@RequestMapping(value="/add",method=RequestMethod.POST)
public String addJq(Jq jq){
Jq jq1 = new Jq(jq.getUserName(),jq.getPassWord());
System.out.println("String方法:"+jq1.toString());
jqservice.insertjq(jq1);
return "roles";
}
3.使用@RequestParam注解接收参数
@RequestMapping(value="/add",method=RequestMethod.POST)
public String addJq(@RequestParam("userName")String userName,@RequestParam("passWord")String passWord){
Jq jq = new Jq(userName,passWord);
System.out.println("String方法:"+jq.toString());
jqservice.insertjq(jq);
return "roles";
}
4.使用@ModelAttribute注解获取POST请求的FORM表单数据
@RequestMapping(value="/add",method=RequestMethod.POST)
public String addJq(@ModelAttribute("jq")Jq jq){
Jq jq1 = new Jq(jq.getUserName(),jq.getPassWord());
System.out.println("String方法:"+jq1.toString());
jqservice.insertjq(jq1);
return "roles";
}
5.通过HttpServletRequest接收
@RequestMapping(value="/add",method=RequestMethod.POST)
public String addJq(HttpServletRequest request){
Jq jq1 = new Jq(request.getParameter("userName"),request.getParameter("passWord"));
System.out.println("String方法:"+jq1.toString());
jqservice.insertjq(jq1);
return "roles";
}
6.用request.getQueryString() 获取spring MVC get请求的参数,只适用get请求
#、mysql常用的函数
1.聚合函数
AVG(表达式) 返回表达式中所有的平均值。仅用于数字列并自动忽略NULL值。
COUNT(表达式) 返回表达式中非NULL值的数量。可用于数字和字符列。
COUNT(*) 返回表中的行数(包括有NULL值的列)。
MAX(表达式) 返回表达式中的最大值,忽略NULL值。可用于数字、字符和日期时间列。
MIN(表达式) 返回表达式中的最小值,忽略NULL值。可用于数字、字符和日期时间列。
SUM(表达式) 返回表达式中所有的总和,忽略NULL值。仅用于数字列。
2.日期函数
-- 获取当前日期
select CURRENT_DATE;
-- 获取当前时间
SELECT CURRENT_TIME;
-- 获取当前日期和时间
SELECT CURRENT_TIMESTAMP;
#、java中的集合
一、collection和Map:黄色为集合的接口,蓝色为集合的实现类
Collection
Map
接口名称 | 作用 |
Iterator 接口 | 集合的输出接口,主要用于遍历输出(即迭代访问)Collection集合中的元素,Iterator对象被称之为迭代器。迭代器接口是集合接口的父接口,实现类实现Collection时就必须实现Iterator接口。 |
Collection 接口 | 是 List、Set 和 Queue 的父接口,是存放一组单值的最大接口。所谓的单值是指集合中的每个元素都是一个对象。一般很少直接使用此接口直接操作。 |
Queue 接口 | Queue 是 Java 提供的队列实现,有点类似于 List。 |
Dueue 接口 | 是 Queue 的一个子接口,为双向队列。 |
List 接口 | 是最常用的接口。是有序集合,允许有相同的元素。使用 List 能够精确地控制每个元素插入的位置,用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,与数组类似。 |
Set 接口 | 不能包含重复的元素。 |
Map 接口 | 是存放一对值的最大接口,即接口中的每个元素都是一对,以 key➡value 的形式保存。 |
对于 Set、List、Queue 和 Map 这 4 种集合,Java 最常用的实现类分别是 HashSet、TreeSet、ArrayList、ArrayDueue、LinkedList 和 HashMap、TreeMap 等。下表是这些常用集合的实现类:
类名称 | 作用 |
HashSet | 为优化査询速度而设计的 Set。它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,实现比较简单 |
TreeSet | 实现了 Set 接口,是一个有序的 Set,这样就能从 Set 里面提取一个有序序列 |
ArrayList | 一个用数组实现的 List,能进行快速的随机访问,效率高而且实现了可变大小的数组 |
ArrayDueue | 是一个基于数组实现的双端队列,按“先进先出”的方式操作集合元素 |
LinkedList | 对顺序访问进行了优化,但随机访问的速度相对较慢。此外它还有 addFirst()、addLast()、getFirst()、getLast()、removeFirst() 和 removeLast() 等方法,能把它当成栈(Stack)或队列(Queue)来用 |
HsahMap | 按哈希算法来存取键对象 |
TreeMap | 可以对键对象进行排序 |
二、Collection详解:
1.list集合:
a.ArrayList类:数组实现,有序可重复。线程不安全。
实现了可变数组的大小,存储在内的元素称为元素。使用ArrayList创建的集合,实现对集合中的元素进行快速的随机访问,但是,增删速度相对较慢。
b.LinkedList类:链表实现,有序可重复。线程不安全。
优点是便于向集合中插入或者删除元素,但是随机访问慢。
c.Vector类:数组实现,线程安全。
2.set集合:不允许存放重复元素
a.HashSet:无序,不同步,线程不安全,元素值可以是null。
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据该 hashCode 值决定该对象在 HashSet 中的存储位置。如果有两个元素通过 equals() 方法比较返回的结果为 true,但它们的 hashCode 不相等,HashSet 将会把它们存储在不同的位置,依然可以添加成功。
b.TreeSet:
TreeSet 类同时实现了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以实现对集合进行自然排序,因此使用 TreeSet 类实现的 Set 接口默认情况下是自然排序的,这里的自然排序指的是升序排序。
3.Map集合:
Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键(key)对象和一个值(value)对象。用于保存具有映射关系的数据。
a.HashMap 类;
键值对,Key不能重复,但是value可以重复,key的实现就是HashSet。
b.TreeMap类:
对key排好序的Map。key就是TreeSet。
#、遍历map的三种方法:
1.for循环遍历:
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "1");
map.put("C语言入门教程", "2");
for (Map.Entry<String, String> entry : map.entrySet()) {
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey + ":" + mapValue);
}
}
2.增强for循环for-each遍历:
Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "1");
map.put("C语言入门教程", "2");
// 打印键集合
for (String key : map.keySet()) {
System.out.println(key);
}
// 打印值集合
for (String value : map.values()) {
System.out.println(value);
}
//键和值同时打印
for (String k : map.keySet()) {
System.out.println(k+":"+map.get(k));
}
3.使用迭代器Iterator遍历:
Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "1");
map.put("C语言入门教程", "2");
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ":" + value);
}
#、ZooKeeper
统一配置管理、统一命名服务、分布式锁、集群管理
#、springboot常用注解
1.@SpringBootApplication
包含@Configuration、@EnableAutoConfiguration、@ComponentScan。
通常用在主类上。
2.@Repository
用于标注数据访问组件,即DAO层组件。
3.@Service
用于标注业务层组件。
4.@RestController
用于标注控制层组件(如struts的action标签),包含@ResponseBody和@Controller。
5.@ResponseBody
表示该方法的返回结果直接写入HTTP response body中
一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中,比如异步获取json数据,加上@ResponseBody后,会直接返回json数据。
6.@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
7.@ComponentScan
组件扫描。相当于<context: component-scan>,将扫描到这些注解的类:@Component、@Controller和@Service注册为Bean。
8.@Configuration
指出该类是bean的配置数据源,相当于xml中的<beans></beans>,一般加在主类上。
9.@Bean
相当于xml中的<bean></bean>,放在方法的上面,而不是类。意思是产生一个bean,并交给spring进行管理。
10.@EnableAutoConfigruation
让springboot根据应用所声明的依赖来对spring框架进行自动配置,一般加在主类上。
11.@AutoWired
按照类型bytype方式,把配置好的Bean拿来用,完成属性,方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
当加上(required = false)时,就算找不到bean也不会报错。
12.@Qualifier
当有多个同一类型的bean时,可以用@Qualifier("name")类指定,与@AutoWired配合使用。
13.@Resource(name = "name",type = "type")
没有括号内容,默认为byName查找,与@AutoWired类似。
14.@RequestMapping
此注解是一个用来处理请求地址映射的注解,用于类或者方法上。用于类上,表示类中的所有相应请求的方法都是以该地址作为父路径。
该注解有六个属性:
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
value:指定请求的实际地址,指定的地址可以是URI Template 模式
method:指定请求的method类型, GET、POST、PUT、DELETE等
consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
15.@RequestParam
用在方法的参数前面。
16.@PathVariable
路径变量,用于方法的参数前面,参数名与请求地址的大括号的参数名一致。
17.@Profiles
一种隔离应用配置的方式,并让这些配置在特定环境下生效。
任何@Component或@Configuration都能被@Profiles标记,从而限制它的加载时机。