首页 文章 精选 留言 我的

精选列表

搜索[事件发布],共10000篇文章
优秀的个人博客,低调大师

Tigon MyBatis v0.0.6 发布,再见 2020

Release Notes 优化Search#eq,Search#ne参数为NULL时候处理为is null,is not null @UseGeneratedKeys注解支持多参数 增加查询方法BaseQueryMapper#list(List keys),BaseQueryMapper#list(PrimarayKey[] keys) 优化Jdbc3KeyGen实现,增加共享变量 优化SqlSessionFactory增强,只有发现SupperMapper子类,才做增强 查询、更新支持驼峰格式属性名,转换为下划线列名 完善单元测试 代码简化,优化 Tigon MyBatis 简介 Tigon MyBatis为Spring工程中MyBatis的Mapper提供增强,主要有以下特点 代码又少又壮,绝不做多余的事情 仅需Mapper继承接口,实现增删改查,无额外配置,爽到没女朋友 用完即走,毫不留恋 开始使用 引入Maven依赖 <dependency> <groupId>me.chyxion.tigon</groupId> <artifactId>tigon-mybatis</artifactId> <version>0.0.6</version> </dependency> 使用示例 下面是使用示例,可以在源代码中找到更详细的单元测试。Talk is cheep,read the fine source code. 定义Entity package me.chyxion.tigon.mybatis.entity; import lombok.Getter; import lombok.Setter; import java.util.Date; import lombok.ToString; import java.io.Serializable; import me.chyxion.tigon.mybatis.Table; import me.chyxion.tigon.mybatis.NotUpdate; @Getter @Setter @ToString @Table("tb_user") public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer id; @NotUpdate private String account; private String mobile; private String name; private Gender gender; private String password; private Date birthDate; private String city; private String avatar; private Boolean active; private String remark; private String createdBy; private Date createdAt; private String updatedBy; private Date updatedAt; public enum Gender { MALE, FEMALE } } 定义Mapper package me.chyxion.tigon.mybatis.mapper; import java.util.List; import me.chyxion.tigon.mybatis.BaseMapper; import org.apache.ibatis.annotations.Mapper; import me.chyxion.tigon.mybatis.entity.User; @Mapper public interface UserMapper extends BaseMapper<Integer, User> { } 注入Mapper对象 @Autowired private UserMapper mapper; I. 插入 final User user = new User(); user.setName("Donghuang"); user.setAccount("donghuang"); user.setMobile("137647788xx"); user.setPassword(RandomStringUtils.randomAlphanumeric(16)); user.setGender(User.Gender.MALE); user.setBirthDate(DateUtils.parseDate("1994-04-04")); user.setCity("Shanghai"); user.setActive(true); user.setRemark("Uncle Donghuang"); user.setCreatedBy("donghuang"); user.setCreatedAt(new Date()); // single insert mapper.insert(user); final User user1 = new User(); user1.setName("Gemily"); user1.setAccount("gemily"); user1.setMobile("15770780xxx"); user1.setPassword(RandomStringUtils.randomAlphanumeric(16)); user1.setGender(User.Gender.FEMALE); user1.setBirthDate(DateUtils.parseDate("1990-06-06")); user1.setCity("Hangzhou"); user1.setActive(true); user1.setCreatedBy("donghuang"); user1.setCreatedAt(new Date()); final User user2 = new User(); user2.setName("Luffy"); user2.setAccount("luffy"); user2.setMobile("137647799xx"); user2.setPassword(RandomStringUtils.randomAlphanumeric(16)); user2.setGender(User.Gender.MALE); user2.setBirthDate(DateUtils.parseDate("1997-07-07")); user2.setCity("East sea"); user2.setActive(true); user2.setRemark("Luffy"); user2.setCreatedBy("donghuang"); user2.setCreatedAt(new Date()); // batch insert mapper.insert(Arrays.asList(user1, user2)); II. 查询 根据ID查询单个对象 final Integer id = 1154; final User user = mapper.find(id); 根据属性查询单个对象 final User user = mapper.find( new Search("account", "donghuang") .eq("mobile", "137647788xx")); 根据属性查询列表 final List<User> users = mapper.list(new Search() .between("birth_date", DateUtils.parseDate("1982-04-04"), DateUtils.parseDate("1994-04-04") ) .eq("gender", User.Gender.MALE) .asc("birth_date") .limit(42)); Search对象支持的API andAnd anotherSearch ascOrder ASC betweenBetween two values buildBuild query criterion containsValue contains string descOrder DSC endsWithValue ends with string eqEqauls gtGreater than gteEqauls or greater than inIn values isNullValue is null likeValue like limitReturn rows limit ltLess than lteEqauls or less than neNot equals notInNot in values notNullValue is not null offsetReturn rows offset orOr anotherSearch orderByOrder by startsWithValue starts with string III. 更新 通过Entity根据ID更新 final User user = mapper.find(1); user.setName("东皇大叔"); user.setUpdatedBy("SYS"); user.setUpdatedAt(new Date()); mapper.update(user); 通过Map<String, Object>更新 final Map<String, Object> update = new HashMap<>(6); update.put("name", "东皇大叔"); update.put("updatedBy", "SYS"); update.put("updatedAt", new Date()); mapper.update(update, 1); // OR // mapper.update(update, new Search("id", 1)); // mapper.update(update, new Search(1)); 更新列为NULL // Update remark to NULL of id 274229 mapper.setNull("remark", 274229); // Update remark to NULL of id 1154L mapper.setNull("remark", new Search("id", 1154)); // Update all remarks to NULL. BE CAREFUL!!! mapper.setNull("remark", new Search()); IV. 删除 通过ID删除数据 mapper.delete(1); 通过Search对象删除数据 mapper.delete(new Search("id", 1)); V. 杂项 除了上面说到的一些基础增删改查操作,还有一些实用功能,如@Transient@UseGeneratedKeys@NoPrimaryKey@NotUpdateWhenNull@RawValue等注解,插入、更新前回调,以及支持扩展自定义的方法等。 配置说明 SpringBoot项目,无需其他操作,引入依赖即可 Spring项目,注册Beanme.chyxion.tigon.mybatis.TigonMyBatisConfiguration 业务Mapper继承me.chyxion.tigon.mybatis.BaseMapper或相关衍生Mapper,Base(Query, Insert, Update, Delete)Mapper 原理 Tigon MyBatis并不改变MyBatis相关功能,所做的只是在程序启动期间检测业务Mapper接口,如果继承了相关BaseMapper.java,则注入相关方法MappedStatement,具体逻辑参见源码,超简单,超幼稚。 其他 在前面使用Search的例子中,我们需要一些User的属性常量字符串,比如 final User user = mapper.find(new Search("account", "donghuang")); 可以将这些常量定义在User类中,如 public static final String ACCOUNT = "account"; 使用过程中可以使用属性常量,如 final User user = mapper.find(new Search(User.ACCOUNT, "donghuang")); 也可以使用Lombok的@FieldNameConstants注解生成,只是这个注解还处于试验阶段,有一定不稳定风险。

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

Apache Ignite 2.9.1 版本发布,小版本更新

Apache Ignite 发行注记 =========================== Apache Ignite 内存计算平台 2.9.1 ----------------------------------------------------------- Ignite核心: 新增支持ZookeeperDiscoverySpi的优雅关闭; 新增二进制元数据的系统视图; 新增元数据存储的系统视图; 新增RebalancingPartitionsTotal指标; 改进了检查点的并发行为; 修复了注销JMX Bean时导致严重系统错误的问题; 修复了即使缓存已经关闭,IgniteCache#isClosed()也会返回false的问题; 修复了无法立即删除过期缓存项的问题; 修复了索引的缓存有不同的数据类型时部分索引重建失败的问题; 修复了出现不可编组值时的本地元存储系统视图错误; 修复了grid-timeout-worker和正在打开的通信连接线程之间的死锁问题; 修复了IgniteServiceProcessor中存在的死锁问题; 修复了扫描查询因断言错误而失败的问题:Unexpected row key; 修复了启用了wal压缩设置后服务端重启的存档问题; 修复了用PRIMITIVE策略初始化Cassandra存储时的空指针问题; 修复了当不同的类加载器用于同一个类的部署时的同步问题; 修复了当客户端重连时SQL缓存可能出现异常的问题; 修复了删除多个缓存时可能出现死锁的问题; 修复了销毁一个缓存时IgniteServiceProcessor可能出现空指针的问题; 修复了客户端节点与缓存拦截器反序列化有关的问题; 修复了如果配置了JMX端口control.sh无法启动的问题; 修复了ZookeeperDiscoverySpiMBeanImpl#getCoordinator无法返回有效的节点作为协调器的问题; 修复了若干日志方面的问题; 修复了交换进程等待队列中的新任务时被认为阻塞的问题; 修复了关于协调器变化的拓扑快照日志输出不正确的问题; 修复了节点初始化过程速度慢的问题; 修复了SystemViewLocal和SystemViewMBean类中Class.isAssignableFrom的不正确使用问题; 修复了若干指标的并发问题; 修复了与带复合主键的WHERE子句中谓词(<和>)处理不正确的问题; 删除了curator-client中的不必要依赖并改进了ZookeeperDiscoverySpi; 删除了IgnitionEx中的不必要错误跟踪; Java瘦客户端: 修复了拓扑更新期间瘦客户端连接/断连时可能导致ignite sys缓存中的分区差异的问题; 修复了瘦客户端在不活动后静默关闭连接通道的问题; 修复了从Java瘦客户端获取缓存配置时不支持的协议版本异常问题; JDBC: 修复了瘦模式驱动报告不正确属性名的问题; 更新了JDBC元数据以匹配实际功能; Ignite .NET: 改进了枚举序列化速度慢的问题; 修复了当IBinaryObject中包含了IBinaryObject字段时反序列化方面的问题; 修复了TransactionImpl的finalizer可能导致进程崩溃的问题; 修复了在Linux上持久化使用直接IO时,子进程变成僵尸进程的问题。 Ignite C++: CMake构建系统新增对Windows的支持; 修复了odbc-example在使用1个附加节点运行时丢失值的问题。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

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部分的功能。

用户登录
用户注册