首页
留言板
友链
关于
Search
1
内测“合金弹头”嘿嘿
1,116 阅读
2
Nginx搭建一个简易的图床
1,056 阅读
3
Kettle循环遍历结果集作为参数传入转换
1,013 阅读
4
Maven3.3.9的安装与配置
556 阅读
5
Maven打包插件与idea
523 阅读
知识库
好奇猫
日常说
笔记本
登录
/
注册
Search
标签搜索
maven
Spring
vue
Java
Java代码
前端
idea
帆软
MySQL
git
CSS
游戏
Bootstrap
生活
网上冲浪
邮件配置
说说
Nginx
Excel
数据库调优
龙流
累计撰写
61
篇文章
累计收到
34
条评论
首页
栏目
知识库
好奇猫
日常说
笔记本
页面
留言板
友链
关于
搜索到
39
篇与
笔记本
的结果
2023-03-01
Vue实现点击列勾选或取消前面的复选框
示例说明<table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>手机号</th> </tr> </thead> <tbody> <tr v-for="c in tableData"> <td><input :id="c.id" v-model="checkItemIds" type="checkbox" :value="c.id"></td> <td><label :for="c.id">{{c.name}}</label></td> <td><label :for="c.id">{{c.age}}</label></td> <td><label :for="c.id">{{c.phone}}</label></td> </tr> </tbody> </table> <script> Vue app = new Vue({ /** ...省略具体Vue属性和方法函数; 渐进式Vue方案 */ }) </script>实现原理1、在<input>标签中使用id属性绑定c.id2、使用<label>标签:for="c.id"双向绑定id值,包裹插值属性值双向绑定在复选框选中多个数据项后,id值会以数组的形式存进checkItemIds数组中
2023年03月01日
187 阅读
0 评论
0 点赞
2023-02-27
搭建自己的内网穿透服务
内网穿透:就是让外部的用户可以访问没有公网ip例如局域网内部的地址。缺点:就是你还是要有一个公网ip,在公网ip服务器上搭建映射服务,映射到目标地址!开始1、一台公网IP的服务器(示例:xx.bbb.xx.bbb)2、下载frp,我的系统是centos7,下载的是linux_amd64,如果想在电脑上实现就用windows,按需下载(githup地址:https://github.com/fatedier/frp/releases)3、将对应压缩包上传到服务器,然后解压tar -zxvf frp_0.47.0_linux_amd64.tar.gz4、服务器端配置,首先进入解压目录 cd frp_0.42.0_linux_amd64 ,然后编辑配置文件 vi frps.ini按i进行内容修改,修改内容如下,最后Esc键,输入:wq 回车即退出保存。[common] # 服务端口,这个一般不要改它 bind_port = 7000 # 设置仪表盘端口 dashboard_port = 7500 # 设置仪表盘访问的用户名密码 dashboard_user = admin dashboard_pwd = admin # frp支持 TCP、UDP、HTTP、HTTPS 等多种协议的穿透 # HTTP协议穿透只需要再增加一个vhost_http_port配置,这个端口号可随意配置服务器的闲置端口,这里使用8000 vhost_http_port = 80005、阿里云控制台安全组规则中开放7000、7500、8000端口6、使用以下指令启动frp服务端 ./frps -c ./frps.ini或使用nohup ./frps -c frps.ini >> frps.log 2>&1 &让程序在后台运行并将日志输出到指定文件比如frps.log7、浏览器查看部署情况 http://你的ip:7500服务端配置完成,开始客户端配置1、解压windows版压缩包到指定目录2、修改frpc.ini[common] server_addr = 服务器的公网IP server_port = 7000 [ssh] #这个名字可以随便改 type = tcp #通常tcp,udp按需修改 local_ip = 127.0.0.1 #一般不修改 local_port = 22 #外界连接本机的哪个端口 remote_port = 15000 #外界可以通过哪个端口访问进来 #外界通过 公网IP + remote_port ---访问---> local_ip + local_port #如:访问1.2.3.4:15000 实质访问 127.0.0.1:22 [web] type = http local_port = 8080 custom_domains = 公网IP或公网ip的解析域名3、在本地Windows找到安装目录,在上面的输入框中输入cmd,进入安装目录的命令行输入frpc.exe -c frpc.ini命令运行程序4、公网访问测试现在可以在公网通过公网IP和server_port访问本地web服务了
2023年02月27日
326 阅读
0 评论
0 点赞
2022-12-28
MySQL 8的SQL脚本为什么不能导入到MySQL 5中
原因:不可忽视的MySQL字符集 MySQL8.0的默认字符集编码为utf8mb4_0900_ai_ci而MySQL5.x中没有utf8mb4_0900_*的字符集这些字段每个意义,代表着什么含义:uft8mb4 表示用 UTF-8 编码方案,每个字符最多占4个字节。utf8mb3也是Unicode字符集的UTF-8编码,每个字符使用一到三个字节。(utf8: utf8mb3的别名)0900 就是Unicode 校对算法版本。(Unicode归类算法是用于比较符合Unicode标准要求的两个Unicode字符串的方法)。ai指的是口音不敏感。也就是说,排序时e,è,é,ê和ë之间没有区别,不区分重音。ci表示不区分大小写。排序时p和P之间没有区别。再了解一下一些场景下 utf8 和 utf8mb4 的问题点:utf8编码最多支持3字节的数据,而emoji表情符, 偏生字是4个字节的utf8无法存储的,致辞延伸出utf8mb4字符集解决这个问题。日常常用的字符集:utf8mb4_bin:将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内utf8mb4_general_ci:ci即case insensitive,不区分大小写。没有实现Unicode排序规则,在遇到某些特殊语言或字符集,排序结果可能不一致。但在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。utf8mb4_unicode_ci:是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。字符集配置mysql字符集如何设置,更改操作:1)my.cnf配置文件信息,建议初始化时就设置好。[mysqld]character-set-server = utf8mb4collation-server = utf8mb4_unicode_cicharacter-set-client-handshake = FALSE #此处是忽略客户端的字符集,使用服务器的设置2)init_connect=‘SET NAMES utf8mb4’ #服务器为每个连接的客户端执行的字符串,对于一些超级管理源就不生效的3)字符集变更,包含库,表,column的变更。都可以完全的拥有自己的字符集。##更改DATABASE ALTER DATABASE `db1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ##更改TABLE ALTER TABLE `t1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ##更改column字段 ALTER TABLE `t1` modify `name` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '昵称';4)日常字符集检查工作:SELECT b.SCHEMA_NAME, b.DEFAULT_CHARACTER_SET_NAME, b.DEFAULT_COLLATION_NAME ,a.TABLE_NAME, a.TABLE_COLLATION FROM information_schema.SCHEMATA b left join information_schema.TABLES a on b.SCHEMA_NAME =a. TABLE_SCHEMA WHERE b.SCHEMA_NAME not in ('information_schema' ,'mysql','performance_schema', 'sys') ORDER BY TABLE_SCHEMA,TABLE_NAME ;通过多方便设置,更改操作,检查。字符集不再是隐藏问题。字符集对于数据库的影响字符集对整个数据库影响面还是比较可观的。库更改 对于原先存在的表字段 都不影响 依次类推。所以数据库>表>字段 都可以单独设置字符集。常见问题1:有索引 没有走 因为进行了 字符集隐式转换常见问题2:在尾随空格方面不同字符串值(CHAR、VARCHAR和TEXT)的比较与其他排序规则在尾随空格方面不同。For example, ‘a’ and 'a ’ 作为不同的字符串比较,而不是相同的字符串。对于字符集排序来说,字符串末尾的空格也有对应的处理。注意:在选择使用utf8mb4_0900 字符集之后空格 就需要处理。常见问题3:对于数据的大小写敏感除了lower_case_table_names之外,怎样有效使用大小写字符集设置,采用ut8mb4_bin字符集 既可,查询和数据插入解决。常见问题4:表情符,偏生字常见错误代码:1366 Incorrect string value: ‘\xF0\x9F\x99\x82’ for column ‘name’ at row 2指定Utf8mb4字符集,再配合character-set-client-handshake属性图片备注:对于jdbc来说没有utf8mb4这样的字符集说法。不可忽视的MySQL字符集https://blog.51cto.com/u_15127623/2856333
2022年12月28日
205 阅读
0 评论
0 点赞
2022-12-06
登录拦截资源管理问题
说明
2022年12月06日
140 阅读
0 评论
0 点赞
2022-11-20
【VUE】process.env详解
process 是个全局变量使用的时候可以直接使用process.env 是 Node.js 中的一个环境对象。其中保存着系统的环境的变量信息。可使用 Node.js 命令行工具直接进行查看。模式的应用有了模式的概念,就可以根据不同的环境配置模式,就不用每次打包时都去更改 vue.config.js 文件了。比如在测试环境和生产环境, publicPath参数 (部署应用包时的基本 URL) 可能不同。遇到这种情况就可以在 vue.config.js 文件中,将 publicPath 参数设置为:publicPath: process.env.BASE_URL设置之后,再在各个 .env.[mode] 文件下对 BASE_URL 进行配置就行了,这样就避免了每次修改配置文件的尴尬。其他的配置也是同理。Tips: 即使不是生产环境,也可以将模式设置为 production ,这样可以获得 webpack 默认的打包优化。————————————————版权声明:本文为CSDN博主「Lucky@Dong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/zzddada/article/details/122556869也就是说 只有是VUE_APP开头的才会被识别,其他的都不行
2022年11月20日
288 阅读
0 评论
0 点赞
2022-11-11
表单重复提交问题
网络延迟时,重复点击表单多次提交bug解决方案:1、数据设置字段唯一:对表单中的某个字段在数据库中设置唯一性,这样多次提交,因为是重复值则不能保存数据。2、提交成功后,重定向:这样当前页面不会在进行刷新进行重复提交3、使用javaScript,在前端进行标记位,点击提交后不可用提交按钮4、
2022年11月11日
152 阅读
0 评论
0 点赞
2022-11-09
JavaWeb前端技术细节记录
1、关于ajax技术? ajax的优点有: 1、提高了性能和速度减少客户端和服务器之间的流量传输,同时减少了双方响应的时间,响应更快,因此提高了性能和速度。 2、交互性能好可以异步与后台服务器发送数据,并返回数据到前台 3、异步调用客户端浏览器在开始渲染之前避免等待所有数据到达 4、节省带宽基于Ajax的应用程序使用较少的服务器带宽,因为无需重新加载完整的页面。 5、使用XMLHttpRequestXMLHttpRequest在Ajax Web开发技术中起着重要作用。XMLHttpRequest是由Microsoft设计的特殊JavaScript对象。XMLHttpRequest对象调用作为异步HTTP请求到服务器以传输数据。它用于向非Ajax页面发出请求。 6、拥有开源JavaScript库 : JQuery,Prototype,Scriptaculous等。 7、AJAX通过HTTP协议进行通信。 ajax的缺点有: 1、不安全,因为所有的文件都是从客户端进行下载 2、网络延迟影响用户体验 3、禁用JavaScript的浏览器无法使用 4、由于安全限制,产生的跨域问题,相较传统经典web应用程序更复杂2、ajax内部的主要参数有哪些?① async:要求为boolean类型,异步为true(默认),同步为false。 ② url:要求为string类型的参数,发送请求的地址。 ③ type:要求为Stirng类型,请求方式post或get。 ④ data:要求为object或stirng类型,发送到服务器的数据。 ⑤ dataType:要求为String 类型,预期服务器返回的数据类型。 ⑥ beforeSend:要求为function类型的参数。例如添加自定义HTTP头 ⑦ timeout:要求为number类型,设置请求超时时间(毫秒)。 ⑧ cache:要求为boolean类型,默认为true,是否从浏览器缓存中加载信息。 3、cookie和session关系,原理cookie是存储在客户端的, session是存储在服务的的,cookie相比session不安全些session原理: 客户端a访问服务器时,服务器生成进行session对象生成然后保存在服务器中,同时会产生一个sessionid返回给客户端cookie中。 session会话有声明周期,可以通过设置session属性,设置session过期时间或者是关闭浏览器结束一次会话session也会失效Jquery的常用选择器有哪些?首先,Jquery选择器主要分为基本选择器,层级选择器,过滤选择器和表单选择器具体的: 基本选择器:具体示例见手册文档或百度 层级选择器: 过滤选择器: 表单选择器:
2022年11月09日
117 阅读
1 评论
0 点赞
2022-09-22
Spring与Junit整合编写测试类
相关依赖<!-- Spring测试相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-fest</artifactId> <version>5.3.1</version> </dependency> <!--junit测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1</version> </dependency>大概思路Spring框架集成的测试环境,不在需要去获取IOC容器,再通过ioc容器获取容器中的组件,然后再使用组件;通过Spring集成的junit,直接使用依赖注入,注入所需要的组件创建测试类//指定当前测试类在Spring的测试环境中执行,此时就可以通过注入的形式直接获取IOC容器中的bean @RunWith(SpringJunit4ClassRunner.class) //设置Spring测试环境的配置文件 @ContextConfiguration(class:spring*.xml) public class Test01(){ @Autowired private Xxx xxx; @Test public void TestMethod(){ xxx.method(); } }
2022年09月22日
100 阅读
0 评论
0 点赞
2022-08-23
Spring框架知识点(最基础的实现)
Spring的优点性能好、易于测试、代码可重用高。Spring,是轻量级的框架,其基础版本只有2MB左右的大小。Spring框架的核心特性是可以用于开发任何Java应用程序,但是在JavaEE 平台上构建web应用程序是需要扩展的。Spring框架的目标是使J2EE开发变得更容易使用,通过启用基于POJO编程模型来促进良好的编程实践。思想:例如在jdbc中实现事务控制,无法实现代码的封装,因为使用jdbc控制事务是面向对象的思想,操作事务的提交、事务的回滚是分布在业务执行过程不同条件下的;而Sping的声明式事务是基于AOP面向切面的编程思想,Spring FrameworkSpring基础框架,可以视为Spring基础设施,基本上任何其他Spring项目都是以Spring Framework为基础的。Spring Framework特性·非侵入式: 使用Spring Framework开发应用程序时,Spring对应用程序本身的结构影响非常小。对领域模型可以做到零污染; 对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化。 这就使得基于Spring Framework开发应用程序时结构清晰、简洁优雅。 ·控制反转IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。 ·面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。 ·容器: Spring IOC是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。 ·组件化: Spring实现了使用简单的组件配置组合成一个复杂的应用。在Spring中可以使用XML和Java注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。 ·声明式: 很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。 ·一站式: 在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且Spring旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在Spring Framework的基础上全部使用Spring,来实现。获取IOC,通过IOC获取管理的对象案例假如新建一个空项目 -> 要实现案例目标,获取IOC容器中的对象 -> 最基础的实现方式,用配置文件的方式,所以要新建配置文件,在resource目录下右键新建xml,如果idea右键菜单栏中没有Spring配置的xml可选项,是因为pom中还未引入spring-context的Dependency导入maven坐标如下:spring-context 5.2.10.RELEASE稳定版<dependencies> < !--基于Maven依赖传递性,导入spring-context依赖即可导入 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> <!--junit测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </ dependencies>1、首先配置对象到IOC容器中,有xml和注解两种方式xml: 在Spring的xml配置文件,名字约定俗成叫applicationContext.xml,在配置文件中使用bean标签,配置id属性、class属性<bean id="xxxx" class="全类名"></bean>注解:@Component @Controller @Service @Repository @RestControler更多详细2、测试用例public class HelloWorld(){ public void sayHello(){ System.out.println("hello world!"); } }@Test public void test(){ //获取IoC容器 ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取IoC容器中的bean HelloWorld helloworld = (HelloWorld)ioc.getBean("helloworld"); helloworld.sayHello();Spring获取bean的三种方式1、通过name获取 2、通过class type获取 3、同时通过name和type获取 如果组件类实现了接口,根据接口类型可以获取bean吗? 可以,前提是bean唯一 如果一个接口有多个实现类,这些实现类都配置了bean,根据接口类型可以获取bean吗? 不行,因为bean不唯—依赖注入之setter注入如我们将对象注入Spring容器中时,可以通过对象属性的getter()为属性设置属性值如实际配置如下:可以为Student类中的属性设置属性值<bean id="studentTwo" class="com.hlongliu.spring.pojo.Student"> <property name="sid" value="1001"></property> <property name="sname" value="张三"></property> <property name="age" value="23"></property> <property name="gender" value="男"></property> </bean>依赖注入之构造器注入如 实际配置如下:<bean id="studentThree" class="com.hlongliu.spring.pojo.Student"> <constructor-arg value="1002"></constructor-arg> <constructor-arg value="李四"></constructor-arg> <constructor-arg value="24"></constructor-arg> <constructor-arg value="女" name="gender"></constructor-arg> </bean>代理模式场景public class CalculatorImpl implements calculator { @Override public int add(int i, int j){ System.out.println(日志,方法: add,参数:"+i+","+j); int result = i + j; System.out.println("方法内部,result: "+result); system.out.println("日志,方法:add,结果:"+result); return result; } @Override public int sub(int i, int j) { System.out.println("日志,方法: sub,参数:"+i+","+j); int result - i - j; System.out.println("方法内部,result: "+result); system.out.println("日志,方法:sub,结果:"+result); return result; } }①现有代码缺陷针对带日志功能的实现类,我们发现有如下缺陷:·对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力·附加功能分散在各个业务功能方法中,不利于统一维护②解决思路解决这两个问题,核心就是:解耦。我们需要把附加功能从业务功能代码中抽取出来。③困难解决问题的困难:要抽取的代码在方法内部,靠以前把子类中的重复代码抽取到父类的方式没法解决。所以需要引入新的技术。代理模式概念:二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来一一解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。静态代理创建静态代理类public class CalculatorStaticProxy implements Calculator { //将被代理的目标对象声明为成员变量 private Calculator target; public CalculatorStaticProxy(Calculator target) { this.target = target; } @Override public int add(int i, int j){ //附加功能由代理类中的代理方法来实现 System.out.println("[日志] add 方法开始了,参数是:" +i + ","+ j); //通过目标对象来实现核心业务逻辑 int addResult = target.add(i,j); System.out.println(" [日志] add方法结束了,结果是: " + addResult); return addResult; } }静态代理确实实现了解耦,但是由于代码都写死了,完全不具备任何的灵活性。就拿日志功能来说,将来其他地方也需要附加日志,那还得再声明更多个静态代理类,那就产生了大星重复的代码,日志功能还是分散的,没有统一管理。提出进一步的需求:将日志功能集中到一个代理类中,将来有任何日志需求,都通过这一个代理类来实现。这就需要使用动态代理技术了。动态代理动态代理有两种:1、jdk动态代理,要求必须有接口,最终生成的代理类和目标类实现相同的接口在com.sun.proxy包下,类名为$proxy22、cglib动态代理,最终生成的代理类会继承目标类,并且和目标类在相同的包下/** *目标类接口 */ public interface Calculator{ int add(int i, int j); int sub(int i, int j); } /** *目标类 */ public class CalculatorImpl implments Calculator { @Override public int add(int i, int j){ return i+j; } @Override public int sub(int i, int j){ return i-j; } } /** 动态代理核心 *生产代理对象 */ public class GenerateProxy(){ private Object target; public GenerateProxy(Object target){ this.target = target; } public Object getProxy(){ /** *newProxyInstance():创建一个代理实例 *共有三个参数 * ClassLoad 类加载器 Class<?>[] 目标对象 */ ClassLoad classLoad = this.getClass().getClassLoad(); Class<?>[] interfaces = target.getClass().getInterface(); InvocationHandler h = new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy代表代理对象,method代表要执行的方法,args代表执行方法的参数 Object result = method.invoke(target,args); return result; } } return Proxy.newProxyInstance(classLoad,interfaces,h); } } /** *测试 */ public class ProxyTest{ @Test public void testProxy(){ GenerateProxy generateProxy = new GenerateProxy(new CalculatorImpl()); Calculator proxy = (Calculator)generateProxy.getProxy(); proxy.add(1,2); } } 使用Maven快速创建基础Java项目,不选择骨架设置项目基本信息生成webapp资源路径设置配置web项目配置文件web.xmlweb.xml内容<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>spring和其他框架合并配置文件<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 包扫描 --> <context:component-scan base-package="com.dldata.home.service.impl,com.dldata.home.dao"/> <!-- 导入数据库配置文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据库 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 创建session工厂--> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!-- 告诉spring mybatis接口位置--> <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dldata.home.dao"/> </bean> <!-- 事务管理--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> </beans>
2022年08月23日
98 阅读
0 评论
0 点赞
2022-07-14
java的Strem流和Lambda写法
1、首先知道哪些方式可以生成Stream流Collection体系集合,使用默认的straem()生成流;(eg: ArrayList->method:Stream stream())Map体系集合,把Map转成Set集合,间接的生成流; (Map->method:Set keySet())数组,通过Stream接口的静态方法Stream.of(T... values)生成流2、Stream流中间操作方法方法名说明Stream filter(Predicate predicate)用于对流中的数据进行过滤Stream limit(long maxSize)返回此流中的元素组成的流,截取前指定参数个数的数据Stream skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流static Stream concat(Stream a, Stream b)合并a和b两个流为一个流Stream distinct()返回由该流的不同元素(根据Object.equals(Object) )组成的流Stream sorted()返回由此流的元素组成的流,根据自然顺序排序Stream sorted(Comparator comparator)返回由该流的元素组成的流,根据提供的Comparator进行排序Stream map(Function mapper)返回由给定函数应用于此流的元素的结果组成的流IntStream mapToInt(ToIntFunction mapper)返回一个IntStream其中包含将给定函数应用于此流的元素的结果3、Stream流的收集操作【应用】概念 对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中。常用方法 R collect(Collector collector) 把结果收集到集合中工具类Collectors提供了具体的收集方式方法名说明public static Collector toList()把元素收集到List集合中public static Collector toSet()把元素收集到Set集合中public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中代码实例public class CollectDemo { public static void main(String[] args) { //创建List集合对象 List<String> list = new ArrayList<String>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); /* //需求1:得到名字为3个字的流 Stream<String> listStream = list.stream().filter(s -> s.length() == 3); //需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历 List<String> names = listStream.collect(Collectors.toList()); for(String name : names) { System.out.println(name); } */ //创建Set集合对象 Set<Integer> set = new HashSet<Integer>(); set.add(10); set.add(20); set.add(30); set.add(33); set.add(35); /* //需求3:得到年龄大于25的流 Stream<Integer> setStream = set.stream().filter(age -> age > 25); //需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历 Set<Integer> ages = setStream.collect(Collectors.toSet()); for(Integer age : ages) { System.out.println(age); } */ //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成 String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"}; //需求5:得到字符串中年龄数据大于28的流 Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28); //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值 Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1]))); Set<String> keySet = map.keySet(); for (String key : keySet) { Integer value = map.get(key); System.out.println(key + "," + value); } } }
2022年07月14日
101 阅读
0 评论
0 点赞
1
2
...
4