首页 文章 精选 留言 我的

精选列表

搜索[整合],共10000篇文章
优秀的个人博客,低调大师

SpringBoot开发案例之整合Spring-data-jpa进阶篇

前言 有人说 从 jdbc->jdbctemplate->hibernation/mybatis 再到 jpa,真当开发人员的学习时间不要钱?我觉得到 h/m 这一级的封装已经有点过了,再往深处走就有病了。 还有人说JPA 很反人类(一个面试官),还举了一个很简单举了例子说:一个数据库如果有 50 个字段,那你写各种条件查询不是要写很多?就是应该用类似 SQL 的方式来查询啊? 其实在我看来,存在即合理,人们总是向着好的方向去发展,学习什么不需要成本,底层语言牛逼倒是去学啊,不还是看不懂,弄不明白。很多知识对于程序员来说,都是一通百通,查询文档就是了,最主要的是能方便以后的开发即可。 对于反人类这一说,只能说 to young to simple,JPA的初衷肯定也不会是让你写一个几十个字段的查询,顶多一到两个而已,非要这么极端?再说JPA也是提供了EntityManager来实现SQL或者HQL语句查询的不是,JPA本质上还是集成了Hibernate的很多优点的。 进阶查询 需求: 学生表(app_student)、班级表(app_class)、当然表结构比较简单,比如这时候我们需要查询学生列表,但是需要同时查询班级表的一些数据,并以JSON或者实体的方式返回给调用者。 本次需求,主要实现JPA的以下几个特性: 封装EntityManager基类 多表查询返回一个List 多表查询返回一个Map 多表查询返回一个实体 Entitymanager的核心概念图: 实现 班级表: @Entity @Table(name = "app_class") public class AppClass { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", nullable = false) private Integer id; private String className; private String teacherName; //忽略部分代码 } 学生表: @Entity @Table(name = "app_student") public class AppStudent { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", nullable = false) private Integer id; private Integer classId; private String name; private Integer age; //忽略部分代码 } 封装接口 DynamicQuery: /** * 扩展SpringDataJpa, 支持动态jpql/nativesql查询并支持分页查询 * 使用方法:注入ServiceImpl * 创建者 张志朋 * 创建时间 2018年3月8日 */ public interface DynamicQuery { public void save(Object entity); public void update(Object entity); public <T> void delete(Class<T> entityClass, Object entityid); public <T> void delete(Class<T> entityClass, Object[] entityids); /** * 查询对象列表,返回List * @param resultClass * @param nativeSql * @param params * @return List<T> * @Date 2018年3月15日 * 更新日志 * 2018年3月15日 张志朋 首次创建 * */ <T> List<T> nativeQueryList(String nativeSql, Object... params); /** * 查询对象列表,返回List<Map<key,value>> * @param nativeSql * @param params * @return List<T> * @Date 2018年3月15日 * 更新日志 * 2018年3月15日 张志朋 首次创建 * */ <T> List<T> nativeQueryListMap(String nativeSql,Object... params); /** * 查询对象列表,返回List<组合对象> * @param resultClass * @param nativeSql * @param params * @return List<T> * @Date 2018年3月15日 * 更新日志 * 2018年3月15日 张志朋 首次创建 * */ <T> List<T> nativeQueryListModel(Class<T> resultClass, String nativeSql, Object... params); } 封装实现 DynamicQueryImpl: /** * 动态jpql/nativesql查询的实现类 * 创建者 张志朋 * 创建时间 2018年3月8日 */ @Repository public class DynamicQueryImpl implements DynamicQuery { Logger logger = LoggerFactory.getLogger(DynamicQueryImpl.class); @PersistenceContext private EntityManager em; public EntityManager getEntityManager() { return em; } @Override public void save(Object entity) { em.persist(entity); } @Override public void update(Object entity) { em.merge(entity); } @Override public <T> void delete(Class<T> entityClass, Object entityid) { delete(entityClass, new Object[] { entityid }); } @Override public <T> void delete(Class<T> entityClass, Object[] entityids) { for (Object id : entityids) { em.remove(em.getReference(entityClass, id)); } } private Query createNativeQuery(String sql, Object... params) { Query q = em.createNativeQuery(sql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { q.setParameter(i + 1, params[i]); // 与Hiberante不同,jpa // query从位置1开始 } } return q; } @SuppressWarnings("unchecked") @Override public <T> List<T> nativeQueryList(String nativeSql, Object... params) { Query q = createNativeQuery(nativeSql, params); q.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST); return q.getResultList(); } @SuppressWarnings("unchecked") @Override public <T> List<T> nativeQueryListModel(Class<T> resultClass, String nativeSql, Object... params) { Query q = createNativeQuery(nativeSql, params);; q.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(resultClass)); return q.getResultList(); } @SuppressWarnings("unchecked") @Override public <T> List<T> nativeQueryListMap(String nativeSql, Object... params) { Query q = createNativeQuery(nativeSql, params); q.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); return q.getResultList(); } } 业务 IStudentService: public interface IStudentService { /** * 返回List<Object[]> * @Author 科帮网 * @return List<Object[]> * @Date 2018年3月28日 * 更新日志 * 2018年3月28日 科帮网 首次创建 * */ List<Object[]> listStudent(); /** * 返回List<Student> * @Author 科帮网 * @return List<Student> * @Date 2018年3月28日 * 更新日志 * 2018年3月28日 科帮网 首次创建 * */ List<Student> listStudentModel(); /** * List<Map<Object, Object>> * @Author 科帮网 * @return List<Map<Object,Object>> * @Date 2018年3月28日 * 更新日志 * 2018年3月28日 科帮网 首次创建 * */ List<Map<Object, Object>> listStudentMap(); } 业务实现 StudentServiceImpl: @Service public class StudentServiceImpl implements IStudentService { @Autowired private DynamicQuery dynamicQuery; @Override public List<Object[]> listStudent() { String nativeSql = "SELECT s.id AS studentId,c.id AS classId,c.class_name AS className,c.teacher_name AS teacherName,s.name,s.age FROM app_student s,app_class c"; List<Object[]> list = dynamicQuery.nativeQueryList(nativeSql, new Object[]{}); return list; } @Override public List<Student> listStudentModel() { String nativeSql = "SELECT s.id AS studentId,c.id AS classId,c.class_name AS className,c.teacher_name AS teacherName,s.name,s.age FROM app_student s,app_class c"; List<Student> list = dynamicQuery.nativeQueryListModel(Student.class, nativeSql, new Object[]{}); return list; } @Override public List<Map<Object,Object>> listStudentMap() { String nativeSql = "SELECT s.id AS studentId,c.id AS classId,c.class_name AS className,c.teacher_name AS teacherName,s.name,s.age FROM app_student s,app_class c"; List<Map<Object,Object>> list = dynamicQuery.nativeQueryListMap(nativeSql, new Object[]{}); return list; } } 接口测试: @Api(tags ="测试接口") @RestController @RequestMapping("/test") public class StudentController { private final static Logger LOGGER = LoggerFactory.getLogger(StudentController.class); @Autowired private IStudentService studentService; @ApiOperation(value="学生List") @PostMapping("/list") public Result list(HttpServletRequest request){ LOGGER.info("学生List"); List<Object[]> list = studentService.listStudent(); return Result.ok(list); } @ApiOperation(value="学生Map") @PostMapping("/listMap") public Result listMap(HttpServletRequest request){ LOGGER.info("学生Map"); List<Map<Object, Object>> list = studentService.listStudentMap(); return Result.ok(list); } @ApiOperation(value="学生Model") @PostMapping("/listModel") public Result listModel(HttpServletRequest request){ LOGGER.info("学生Model"); List<Student> list = studentService.listStudentModel(); return Result.ok(list); } } Swagger2测试 返回List< Object[] >: 返回List< Map< Object, Object > >: 返回List< Student >: 源码:https://gitee.com/52itstyle/spring-data-jpa 作者: 小柒 出处: https://blog.52itstyle.com 分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

优秀的个人博客,低调大师

福利 | 14篇精选行业热点、实战指导、资源整合干货合集

以下为选文组出品的文章: 时事热点系列:与你一起关注当下的社会热点问题。 AI系统首次实现自主编程,完爆初级程序员! 本文为你介绍首个能够自动生成完整软件程序的机器学习系统。 人工智能堵住了应试教育的华容道 本文针对人工智能学习的特点,探讨现行学科教育模式存在的问题及未来的改变。 最顶级的AI科学家正在离开大学:不止财务自由的诱惑 越来越多的顶级AI研究员离开高校走入业界,这是学以致用还是杀鸡取卵? 入门指南系列:世界顶级数据科学家为你指导,带你轻松入门。 吴恩达推荐好文:中国人工智能的崛起 本文为你描述中国的人工智能发展状况,并对其未来发展进行了预测。 Michael I. Jordan:我们并非处于AI大爆炸时代 在人工智能成为炙手可热的话题之后,前百度首席科学家吴恩达的导师、被誉为人工智能领域的“根目录”之一的Michael I. Jordan教授

优秀的个人博客,低调大师

SpringMvc整合美图秀秀M4(头像编辑器)

美图秀秀M4 头像编辑器是一款集旋转裁剪、特效美化、人像美容为一体的在线头像编辑工具。适用于有设置头像需求的BBS、SNS、微博和社区等Web产品。 美图秀秀,JAVA提供了示例可参考,流式上传 或者 标准表单上传,于是采用标准表单上传。 List<FileItem> items = upload.parseRequest(request);//得到所有的文件 以上为截取部分代码,美图的API采用的common-fileupload解析上传操作,但是问题出现了,items获取的值为空,查阅了部分资料,原来是SpringMvc上传配置的锅: <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="1000000000" /> </bean> 把这段代码注释掉,重新上传就可以,但是其他使用到了SpringMvc上传的Controller就不起作用了。 原因 原来springMVC已经为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResolver这个转换器。 /** * Parse the given servlet request, resolving its multipart elements. * @param request the request to parse * @return the parsing result * @throws MultipartException if multipart resolution failed. */ protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException { String encoding = determineEncoding(request); FileUpload fileUpload = prepareFileUpload(encoding); try { List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request); return parseFileItems(fileItems, encoding); } catch (FileUploadBase.SizeLimitExceededException ex) { throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex); } catch (FileUploadBase.FileSizeLimitExceededException ex) { throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex); } catch (FileUploadException ex) { throw new MultipartException("Failed to parse multipart servlet request", ex); } } 他的转换器里面就是调用common-fileupload的方式解析,然后再使用parseFileItems()方法封装成自己的文件对象 。 List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request); 上面的这句代码,springMVC已经使用过fileUpload解析过request了,而我们在Controller里面接收到的request已经是解析过的,你再次使用fileupload进行解析获取到的肯定是空,这个就是问题的所在。 解决方案 使用SpringMvc的API进行上传操作,部分伪代码: String basePath =request.getSession().getServletContext().getRealPath("/file/avatar/"); //上传文件目录 File filePath = new File(basePath); MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; //注意这里获取的是avatar MultipartFile mf = mRequest.getFile("avatar"); //用户ID做为用户头像的名称 String baseName = userType+"_"+userId; String newFileName = baseName+"_"+FLAG_L+".jpg"; //输出头像 FileOutputStream fos = new FileOutputStream(filePath + Constant.SF_FILE_SEPARATOR + newFileName); fos.write(mf.getBytes());fos.flush();fos.close(); 参考:http://open.web.meitu.com/ 作者: 小柒 出处: https://blog.52itstyle.com 分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

优秀的个人博客,低调大师

idea 创建的maven+spring+mybatis项目整合 报错无法创建bean

最近在做一个由maven构建的spring+spring mvc+mybatis项目,刚开始的时候是用自己的电脑Win10环境下的eclipse写的,托管到了码svn上面,刚开始什么问题都没有 同学用的是win10+idea,结果问题就来了,下载下来的代码居然不能运行!!!,各种看着一脸懵逼的报错信息(idea的tomcat运行日志文件很不好找,找了好久)辛辛苦苦弄了一周左右,期间经历了把项目删了又建,然后自己搭环境等各种坑爹的环节,一开始报错信息千奇百怪,在弄了这么久之后大概就稳定成了如下的样子: mybatis.xml]:Initializationofbeanfailed;nestedexceptionisorg.springframework.beans.TypeMismatchException:Failedtoconvertpropertyvalueoftype'java.lang.String'torequiredtype'org.springframework.core.io.Resource[]'forproperty'mapperLocations';nestedexceptionisjava.lang.IllegalArgumentException:Couldnotresolveresourcelocationpattern[classpath:com/scpchome/dao/mapping/*.xml]:classpathresource[com/scpchome/dao/mapping/]cannotberesolvedtoURLbecauseitdoesnotexist 一直是不能创建bean的样子,经过一行一行地阅读报错信息。。最后发现mybatis的映射xml文件居然没有找到,然后又去翻classes目录,结果果然没有,知道具体的错误就好办了,随后百度了一发在pom文件中加入了如下代码,困扰了一周的问题成功解决 <!--如果不添加此节点mybatis的mapper.xml文件都会被漏掉。--> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>

优秀的个人博客,低调大师

碎片化技术正在整合 智能家居等领域成发展热点

智能家居市场产品品项及品牌交错复杂,使用者程度落差大,物联网标准不一的问题,恐怕将会成为智能家居市场成长的最大阻力。但随着越来越多联网设备及业者加入智能家居市场,通讯标准不一的问题可望逐步减少。 中国信息通信研究院副院长何桂立日前表示,随着移动物联网与云计算、大数据等新一代信息技术结合得更为紧密,解决了以前制约和影响物联网发展的碎片化问题,中国已正式迈入物联网2.0时代,智能制造、公共事业/智慧城市、车联网/交通物流、智能家居和可穿戴五大领域将成为物联网发展热点。 何桂立是在9月1日由江西省工信委、鹰潭市政府和中国信息通信研究院联合主办的江西省移动物联网发展战略新闻发布会上作出上述表述的。何桂立认为,我国从物联网1.0时代迈入2.0时代具体体现在三方面变化上。 一是技术标准。过去的技术准备不足,如标准化方面不完整。而如今移动物联网已形成由NB-IoT(窄带物联网)、eMTC(增强性机器通信技术),以及蜂窝网的未来演进技术5G(第五代移动通信技术)共同构成的技术体系。 二是产业环境。在物联网1.0时代,产业结构、链条不完整。目前,我国已初步形成涵盖芯片、模组、系统、平台在内的移动物联网产业体系,产业发展正进入快速上升期,物联网在新技术发展的产业环境有了很大的提升。 三是应用场景。人们从最初“只知技术、不明用途”的探索阶段,到如今已明确这一新技术能应用到什么领域、解决什么问题。 何桂立表示,2020年我国移动物联网市场将超过四万亿元,其中智能制造和公共事业/智慧城市将成为万亿市场。 本文转自d1net(转载)

优秀的个人博客,低调大师

微软将自研图像生成模型 MAI-Image-1 整合至 Bing、Copilot

MAI-Image-1 是微软完全自主开发的首个文本生成图像 (text-to-image) 模型。近日,官方宣布它已被集成到微软部分产品中,包括 Bing Image Creator 和 Copilot Audio Expressions(为故事模式的音频生成自定义封面)。 https://www.bing.com/images/create https://copilot.microsoft.com/labs/audio-expression 微软 AI 部门负责人 Mustafa Suleyman 介绍称,MAI-Image-1 在生成食物、自然风景、艺术化光效及写实细节等图像方面“表现尤为出色”。 据介绍,MAI-Image-1 模型针对创意场景进行了优化,微软在训练模型过程中刻意避免“重复或风格化过度”的输出,并征询了创意专业人员(艺术家、设计师)的反馈,可生成多种类型的图像,尤其擅长食物、自然场景以及“艺术化光线+摄影真实感细节”的图像。

优秀的个人博客,低调大师

《灯灯》多租户快速开发平台 5.2.1 发布,租户平台整合开放平台

升级日志 feat(lamp-web-pro): 同步完成【开放平台】相关功能 feat(lamp-web-pro-soybean): 同步完成【开放平台】相关功能 feat(lamp-sdk): 完善 对外接口的sdk feat(sop-gateway-server): 集成 开放平台网关,解决开放平台接口调用和鉴权等问题。 集成sop-gateway sop网关改造,使得可以解析isv绑定的租户id 改造 sop-gateway 支持jdk17和spring boot3.4.4 sop-admin启动时,不在强依赖sop-gateway dubbo.version>3.3.4 smart-doc.version>3.1.0 feat(lamp-boot-sop-server):新增 lamp-boot-sop-server ,解决单体版集成sop时,依赖过多的问题。 lamp-boot-server 等价于 普通单体版 lamp-boot-sop-server 等价于 普通单体版 + SOP开放平台能力 refactor(lamp-openapi): 完善 对外接口服务 示例接口 refactor(lamp-core): 全局对象R,封装全局请求ID给前端 refactor(lamp-sop-admin): 删除isv时,级联删除其他数据 refactor(lamp-validator-starter): 优化表单校验,后端long类型返回为前端string类型 refactor: 弃用 fastjson 改用fastjson2 fix(lamp-boot-server): 修复单体版 生产环境 无法启用 禁止修改拦截器的bug fix(lamp-sop-admin): 文档树 返回 创建时间和修改时间 fix(lamp-sop-admin): 修改应用时,返回id fix(lamp-sop-admin): 数据为空时,返回空数组,而非null fix(lamp-sop-admin): 删除分组时,级联删除其他数据 fix(lamp-swagger-starter): 修复 knife4j doc.html 无法访问的问题 fix(lamp-sa-token-ext): MDC记录请求头中的数据 体验网址 vben2 版 vben5 版 soybean 版 数据源模式 点我体验 点我体验 点我体验 字段模式 点我体验 点我体验 点我体验 本次升级功能预览 1. 开放文档首页 2. 开放文档 3. 全局响应码 4. 应用申请 5. 开放接口 6. 文档配置 7、 文档管理 8. 开放应用 9. 应用分组 关于 lamp 灯灯(简称灯,英文名:lamp),她是一个项目集,为满足高内聚低耦合设计原则,将一个大项目拆解为以下几个子项目: lamp-util:后端工具集 lamp-cloud:基于 Spring Cloud 实现的后台 lamp-boot:基于 Spring Boot 实现的后台 lamp-job:基于 xxl-job 集成本项目的分布式定时任务 lamp-generator:代码生成器 lamp-web:前端 lamp-cloud简介 lamp-cloud是基于SpringCloudAlibaba、SpringCloud、SpringBoot开发的微服务中后台快速开发平台,支持jdk17、jdk11和jdk8,专注于多租户 (SaaS 架构) 解决方案,亦可作为普通项目(非 SaaS 架构)的基础开发框架使用,目前已实现数据库隔离、字段隔离等租户隔离方案以及非租户隔离的解决方案。 她拥有自研 RBAC(基于租户应用的角色权限控制体系)、网关统一鉴权、数据权限、优雅缓存解决方案、防缓存击穿、前后端统一表单校验、字典数据自动回显、可视化前后端代码生成器、支持多种文件存储、支持多种短信邮件发送接口、灰度发布、防 XSS 攻击、防 SQL 注入、分布式事务、分布式定时任务等功能;支持多业务系统并行开发,支持多服务并行开发,是中后台系统开发脚手架的最佳选择。 lamp-cloud 代码简洁,注释齐全,架构清晰,非常适合个人学习以及中小企业作为基础框架使用。采用 Spring Cloud Alibaba、SpringBoot、Mybatis、Seata、Sentinel、RabbitMQ、FastDFS/MinIO、SkyWalking 等主要框架和中间件。本项目旨在实现基础框架能力,不涉及具体业务。 关注项目 官网:https://tangyh.top 源码:https://github.com/dromara/lamp-cloud 源码:https://gitee.com/dromara/lamp-cloud

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册