首页
留言板
友链
关于
Search
1
内测“合金弹头”嘿嘿
889 阅读
2
Nginx搭建一个简易的图床
840 阅读
3
Kettle循环遍历结果集作为参数传入转换
822 阅读
4
Apache Dubbo初步认识
437 阅读
5
Maven3.3.9的安装与配置
420 阅读
知识库
好奇猫
日常说
笔记本
登录
/
注册
Search
标签搜索
maven
Spring
vue
Java
Java代码
前端
idea
帆软
MySQL
git
CSS
游戏
Bootstrap
生活
网上冲浪
邮件配置
说说
Nginx
Excel
数据库调优
龙流
累计撰写
61
篇文章
累计收到
18
条评论
首页
栏目
知识库
好奇猫
日常说
笔记本
页面
留言板
友链
关于
搜索到
61
篇与
龙流
的结果
2022-09-22
Spring的声明式事务
声明式事务使用案例《待补充...》声明式事务的属性只读、超时、回滚策略//设置只读事务,该声明式事务中的数据库操作只能是查询,有非查询操作则会报错 //优点:数据库会根据只查询操作进行优化 //设置方法如下,默认为false @Transactional(readOnly = true) /**事务超时属性 * 事务在执行过程中,有可能因为遇到某些问题,导致程序卡住,从而长时间占用数据库资源。 * 而长时间占用资源,大概率是因为程序运行出现了问题(可能是Java程序或MySQL数据库或网络连接等等)。 * 此时这个很可能出问题的程序应该被回滚,撤销它已做的操作,事务结束,把资源让出来,让其他正常程序可以执行。 */ //设置方法如下,默认值为-1 @Transactional(timeout = 3) /** 事务的回滚策略 * 声明式事务默认只针对运行时异常回滚,编译时异常不回滚。可以通过@Transactional中相关属性设置回滚策略 * rollbackFor属性:需要设置一个Class类型的对象 * rollbackForClassName属性:需要设置一个字符串类型的全类名 * noRollbackFor属性:需要设置一个Class类型的对象 * noRollbackForClassName属性:需要设置一个字符串类型的全类名 */ //设置方法如下,value值是数组类型,只有一个值时可以大括号可加可不加 @Transactional(noRollbackFor={xxx.calss})事务的隔离级别有四种;1、读未提交:会产生脏读的问题,操作数据行和数据表都会存在该问题2、读已提交:会产生不可重复读的问题,例如银行卡转账的同时,在ATM机操作取钱;事务1操作时,事务2动作已经执行一半了,但还没有提交,而事务1读取的数据还是事务2没改变的数据3、可重复读:会产生幻读的问题,指的是操作数据表结果集时会幻读,因为可重复读隔离级别是对数据行加锁,不对表加锁。4、串行化:隔离级别最高,但效率最低。
2022年09月22日
63 阅读
0 评论
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日
75 阅读
0 评论
0 点赞
2022-09-17
此内容被密码保护
加密文章,请前往内页查看详情
2022年09月17日
7 阅读
0 评论
0 点赞
2022-08-30
Jquery实现模糊匹配快速选择输入
1.实现这个功能主要是 keyup() 事件,input框的值有变化时,会实时获取input的值value,然后通过ajax发送请求获取匹配的数据keyup()监测键盘松开时事件,所有在模糊匹配进行异步请求时,延时0.8秒内没有操作键盘再发送Html <div class="home_search"> <div class="search_box flex justify-b align-c"> <input type="text" placeholder="搜索科室" class="search_name" /> <button class="search_btn"><img src="/images/search.png" /></button> </div> <!-- 模糊查询框 --> <div class="search-scrollbar"> <ul class="dropdown-menu"> <c:forEach items="${sysKsAll}" var="sysKs"> <li><a>${sysKs.name}</a></li> </c:forEach> </ul> </div> </div>脚本如下: //监控input标签键盘操作 $(".search_box input").keyup(function (event) { last = event.timeStamp; setTimeout(function () { if(last-event.timeStamp==0){ //如果时间差为0(也就是你停止输入0.5s之内都没有其它的keyup事件发生)则做你想要做的事 let value = $(".search_box input").val(); getSearchData(value); } },800); }); //模糊查询请求数据 function getSearchData(value) { $.ajax({ url:'/keshigaikuang/searchKs', type: 'get', dataType: 'json', data: {searchVal: value}, success: function (data) { if (data.success){ let html = ""; for (let i = 0; i < data.sysKs.length; i++) { html += "<li><a>"+ data.sysKs[i].name +"</a></li>" } $(".dropdown-menu").html(html); } } }); }
2022年08月30日
252 阅读
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日
69 阅读
0 评论
0 点赞
2022-08-10
将对象交由Spring管理
Spring框架的两大主要功能:IOC容器、AOP面向切面编程。在spring里采用注解方式@Service、@Component这些,实际上管理的是类,把这些类交给spring来负责实例化。把对象交给spring管理,举个例子:最常见的在配置文件里定义一个bean,或者JavaConfig的方式就是在@Configure标签 标注的类里的 @Bean对象。这些Bean已经new出来了。这些对象往往是与业务无关的基础组件。比如datasource的bean、redis连接池的bean。个数是有限的。方法一:XML配置bean经典配置场景就是在xml配置文件中配置数据库和数据库连接池配置<bean ...> </beam>方法二:Spring Boot中常用@Bean注解本质和XML配置方法相同。所有用XML配置文件的方法都可以用这个方法改写。@Bean 作业在方法上 //此处返回的是一个Spring的配置Bean,与xml的等价方法三:BeanFacoty registerSingleton这时候大家是否会有个疑问,XML配置Bean是传统的spring mvc里常用的将对象交给spring来管理的方法,@Bean是spring boot里将对象交给spring来管理的方法。那为什么还要有这个先实现BeanFactoryPostProcessor的方法呢?因为这种方法可以用来做这件事情,但是不仅仅可以做这件事情。它神通广大,不仅可以将一个对象交给spring管理,还可以将已经交给spring管理的对象拿出来进行修改,还有其他各种的spring初始化的干预都可以做。所以用它来仅仅注册一个Bean有点杀鸡用牛刀的味道。详细文档参考如下关于@Component与@Controller、@Service、Repository后三个注解他们的作用和属性与Component是一模一样,负责把类交给spring,让spring来负责实例化@Controller:一般用在表现层@Service:一般用在业务层@Repository:一般用在持久层属性value的值,用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母为小写用于注入的注解 @Autowired:作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功@Qualifier:作用:在按照类型注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(为什么?)@Resource:作用:直接按照bean的id注入。它可以独立使用用于改变作用范围的 @Scope:作用:用于指定bean的作用范围属性value:指定范围的取值。常用取值:singleton prototype在Spring框架中遇到的错误记录
2022年08月10日
192 阅读
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日
84 阅读
0 评论
0 点赞
2022-07-08
maven爆红【已经把依赖的jar包拷进自己的本地仓库了】
本地仓库导入jar包,之前不太了解,一直以为直接将别人仓库的目录复制过来就可以了,所以就踩了坑。有时候项目能启动,有时候pom文件就是报红找不到坐标文件解决办法:1、使用maven命令安装:例如:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -Dfile=D:\ojdbc6.jar2、设置maven配置文件settings.xml<mirror> <id>central</id> <name>central</name> <url>file://本地仓库路径</url> <mirrorOf>*</mirrorOf> </mirror>
2022年07月08日
188 阅读
0 评论
0 点赞
2022-06-14
Kettle循环遍历结果集作为参数传入转换
kettle入门就不详细说明了,记录一下结合业务需求开发一个kettle工作流定时抽取数据。简单描述就是:‘Kettle循环遍历结果集作为参数传入转换’图文说明暂时参考链接
2022年06月14日
822 阅读
0 评论
0 点赞
2022-06-09
idea 根据数据库生成JavaBean
原文参考链接java – 如何基于JDBC结果集创建表
2022年06月09日
113 阅读
0 评论
0 点赞
1
2
3
...
7