All posts by 龙生
AspectJ入门
AOP的实现方式有两种:
AOP框架在编译阶段,就对目标类进行修改,得到的class文件已经是被修改过的。生成静态的AOP代理类(生成*.class文件已经被改掉了,需要使用特定的编译器)。以AspectJ为代表 —— 静态AOP框架。
AOP框架在运行阶段,动态生成AOP代理(在内存中动态地生成AOP代理类),以实现对目标对象的增强。它不需要特殊的编译器。以Spring AOP为代表。—— 动态AOP框架。
SpringAOP学习--Spring事务简介及原理
事务简介
前篇介绍了SpringAOP,Spring事务是SpringAOP一个典型的应用。
事务即数据库事务,指同一批次对数据的读写要么全成功,要么全失败,用以保证数据的一致性,是关系统数据库核心功能。编程中通过设置事务手动提交,然后根据情况选择提交事务或者回滚事务。
数据库中事务使用:
BEGIN;#开始事务
update table_name set name=’XXX’ where id=’XXX’;#执行数据库操作
COMMIT; #提交
ROLLBACK;#回滚
从HttpServletRequest中获取上传文件及参数的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
try { //下面这句必须加,不然报错 MultipartResolver resolver = new CommonsMultipartResolver(hsq.getSession().getServletContext()); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) hsq; //获取一起跟文件传过来的其他参数值 String id = multipartRequest.getParameter("id"); //获取上传上来的文件 Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) { MultipartFile file = entry.getValue(); String fileName = file.getOriginalFilename(); System.out.println(fileName); String path = "C:\\Users\\user\\Desktop\\" + fileName; file.transferTo(new File(path)); } } catch (Exception e) { e.printStackTrace(); } |
from:https://www.cnblogs.com/sanrenblog/p/15648871.html
View Detailsxhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页,解决内容断开的问题
之前用itext7将html导出为pdf,比较方便,代码较少,而且支持base64的图片。但是itext7是收费的,所以换成了xhtmlrenderer。
xhtmlrenderer自动引入依赖包itext2.0.8,而且不能再引入其他版本的itext,因为itext2.0.8是已经被废弃的,里面的很多方法在新版本已经没有了。
View DetailsSHA256安全散列算法(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 |
import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * SHA256安全散列算法 * * @author 冯龙生 */ public class Sha256Util { /** * 安全散列算法摘要 * * @param plainText 明文 * @return 密文 */ public static String encrypt(String plainText) { MessageDigest messageDigest; String result = ""; try { messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(plainText.getBytes(StandardCharsets.UTF_8)); result = byteToHex(messageDigest.digest()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return result; } /** * 将byte转为16进制 * * @param bytes 字节码 * @return 16进制字符串 */ private static String byteToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); String temp; for (byte item : bytes) { temp = Integer.toHexString(item & 0xFF); if (temp.length() == 1) { result.append("0"); } result.append(temp); } return result.toString(); } public static void main(String[] args) { String sha256Str = encrypt("111111"); System.out.println(sha256Str); } } |
View Details
tkmybatis详细教程(一篇就明白)
tkmybatis 是对底层 sql 进行了抽象封装,不需要考虑 sql 怎么写,只需要按照逻辑思维,遵循 tkmybatis 的语法即可实现数据库操作。 本文适合对springboot项目结构有一定了解的读者。 本文的项目基础是一个demo项目(多模块的)。 1. 配置 1、添加 tkmybatis 的依赖
1 2 3 4 5 |
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency> |
2、创建 dao 层的 mapper 接口,每个接口都要继承 tk.mybatis.mapper.common.Mapper 接口。此接口的形式为 Mapper<T>,带了个泛型,此泛型一般指的是对应的 pojo 或者 domain。比如:
1 2 |
public interface HouseMapper extends Mapper<House> { } |
3、在 Application 启动类上添加 mapper 扫描注解,表示要扫描到 dao 层的 mapper 接口。 比如本项目的mapper接口就统一放在 com.dgh.dao 下面,用 @MapperScan(basePackages = "包名") 来指定。 附注:在项目启动时,springboot 会自动扫描 Application 启动类所在的当前目录以及下一级目录,一般 Application 启动类都放在根目录,所以在单一项目下,只要是在 Java 类上添加了注解,都能够默认被 springboot 扫描到,并被添加到 springboot 的容器中,一般不需要特别用 @ComponentScan 去指定 springboot 要扫描哪些目录。 本文之所以特地用 @ComponentScan 去指定了 service 层和 controller 层的目录,是因为本文的项目是一个多模块项目,service 层和 controller 层各自都是一个独立的模块,与 Application 启动类不在同一目录下。
1 2 3 4 5 6 7 8 9 |
@SpringBootApplication @MapperScan(basePackages = "com.dgh.dao") @ComponentScan(basePackages = "com.dgh.service") @ComponentScan(basePackages = "com.dgh.controller") public class ControllerApplication { public static void main(String[] args) { SpringApplication.run(ControllerApplication.class, args); } } |
4、tkmybatis 具体的使用是在 service 层,service 层又分为接口和接口实现类,具体就在接口实现类里面。 5、其它的代码、配置与普通的springboot项目一样。 2. tkmybatis的结构 下图是 tkmybatis 的结构图,圈中的是 Mapper 接口,是最底层的,也就意味着它继承了所有的功能。因此才有了 […]
View Details在Java中为日期增加一天的多种方法
一、用 plusDays() 方法将 Java 中的日期增加一天
二、用 Calendar 方法将 Java 中的日期增加一天
三、用 Milliseconds 方法将 Java 中的日期增加一天
四、用 Instant 类向 Java 日期添加一天
mysql查询12小时内的数据
NOW()函数:返回当前日期和时间。
DATE_SUB(date, INTERVAL expr unit)函数:从给定的日期或时间中减去指定的时间间隔。
DATE_ADD(date, INTERVAL expr unit)函数:在给定的日期或时间上添加指定的时间间隔。
DATE_FORMAT(date, format)函数:将日期或时间格式化为指定的字符串格式。
fastJSON,使用TypeReference处理复杂的泛型对象
解析JSON, 并将其转换为对应的数据结构。
例如,简单对象,或者复杂的泛型对象
JSON.parseObject(JSON.toJSONString(param), new TypeReference
分享10个高级sql写法
本文主要介绍博主在以往开发过程中,对于不同业务所对应的 sql 写法进行归纳总结而来。进而分享给大家。
本文所讲述 sql 语法都是基于 MySql 8.0
博主github地址:github.com/wayn111 欢迎大家关注,点个star