首页 文章 精选 留言 我的

精选列表

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

第二篇 : SpringBoot 2.x中使用JdbcTemplate

数据文件 DROP TABLE IF EXISTS users; CREATE TABLE users ( id INT ( 11 ) PRIMARY KEY AUTO_INCREMENT, username VARCHAR ( 255 ) NOT NULL, passwd VARCHAR ( 255 ) ) ENGINE = INNODB DEFAULT CHARSET = utf8; INSERT users VALUES ( NULL, '翠花', '123' ); INSERT users VALUES ( NULL, '王卫国', '123' ); INSERT users VALUES ( NULL, '李小花', '123' ); INSERT users VALUES ( NULL, '王二柱', '123' ); INSERT users VALUES ( NULL, '赵铁蛋', '123' ); 需要引入的依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> application.properties spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql///test spring.datasource.username=root spring.datasource.password=root application.yml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql///test username: root password: root User.java package com.prvi.gabriel.springbootforjdbctemplate.entity; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ public class User { private long id; private String username; private String password; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } } UserController.java package com.prvi.gabriel.springbootforjdbctemplate.controller; import com.prvi.gabriel.springbootforjdbctemplate.entity.User; import com.prvi.gabriel.springbootforjdbctemplate.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @RequestMapping(name = "/",method = RequestMethod.GET) public List<User> usersList(){ List<User> users = null; return userService.findUsers(); } @RequestMapping(value = "/{id}",method = RequestMethod.GET) public User getUserById(@PathVariable long id){ return userService.findUserById(id); } @RequestMapping(name = "/",method = RequestMethod.POST,produces = "text/plain;charset=utf-8") public String addUser(User user){ System.out.println(user); if(userService.saveUser(user) > 0 ){ return "新增成功"; }else{ return "新增失败"; } } @RequestMapping(name = "/",method = RequestMethod.PUT) public String updateUserById(User user){ if(userService.updateUser(user) > 0 ){ return "修改成功"; }else{ return "修改失败"; } } @RequestMapping(value = "/{id}",method = RequestMethod.DELETE) public String deleteUserById(@PathVariable long id){ if(userService.delUserById(id) > 0 ){ return "删除成功"; }else{ return "删除失败"; } } } UserService.java package com.prvi.gabriel.springbootforjdbctemplate.service; import com.prvi.gabriel.springbootforjdbctemplate.entity.User; import java.util.List; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ public interface UserService { List<User> findUsers(); User findUserById(long id); int saveUser(User user); int delUserById(long id); int updateUser(User user); } UserServiceImpl.java package com.prvi.gabriel.springbootforjdbctemplate.service; import com.prvi.gabriel.springbootforjdbctemplate.entity.User; import com.prvi.gabriel.springbootforjdbctemplate.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ @Service public class UserServiceImpl implements UserService { @Autowired private UserRepository repository; @Transactional(readOnly = true) @Override public List<User> findUsers() { return repository.findUsers(); } @Transactional(readOnly = true) @Override public User findUserById(long id) { return repository.findUserById(id); } @Transactional @Override public int saveUser(User user) { return repository.saveUser(user); } @Transactional @Override public int delUserById(long id) { return repository.delUserById(id); } @Transactional @Override public int updateUser(User user) { return repository.updateUser(user); } } UserRepository.java package com.prvi.gabriel.springbootforjdbctemplate.repository; import com.prvi.gabriel.springbootforjdbctemplate.entity.User; import java.util.List; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ public interface UserRepository { List<User> findUsers(); User findUserById(long id); int saveUser(User user); int delUserById(long id); int updateUser(User user); } UserRepositoryImpl.java package com.prvi.gabriel.springbootforjdbctemplate.repository; import com.prvi.gabriel.springbootforjdbctemplate.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ @Repository public class UserRepositoryImpl implements UserRepository { @Autowired private JdbcTemplate jdbcTemplate; @Override public List<User> findUsers() { return jdbcTemplate.query("select * from users",new UserMapper()); } @Override public User findUserById(long id) { List<User> users = jdbcTemplate.query("select * from users where id = ?",new Object[]{id},new UserMapper()); User user = null; if(users != null&&!users.isEmpty()){ user = users.get(0); } return user; } @Override public int saveUser(User user) { return jdbcTemplate.update("insert into users (username,password) values (?,?)",new Object[]{user.getUsername(),user.getPassword()}); } @Override public int delUserById(long id) { return jdbcTemplate.update("delete from users where id = ?",new Object[]{id}); } @Override public int updateUser(User user) { return jdbcTemplate.update("update users set username = ? , password = ? where id = ?",new Object[]{user.getUsername(),user.getPassword(),user.getId()}); } } class UserMapper implements RowMapper<User>{ @Override public User mapRow(ResultSet resultSet, int i) throws SQLException { User user = new User(); user.setId(resultSet.getLong("id")); user.setUsername(resultSet.getString("username")); user.setPassword(resultSet.getString("password")); return user; } } UserControllerTest.java package com.prvi.gabriel.springbootforjdbctemplate.controller; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; /** * Created with Intellij IDEA. * * @Author: Gabriel * @Date: 2018-10-08 * @Desciption: */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class UserControllerTest { @Autowired private WebApplicationContext context; private MockMvc mockMvc; @Before public void setUp(){ mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); } @Test public void usersList() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/users")); } @Test public void getUserById() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/users/1")); } @Test public void addUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/users").param("username","脚后跟").param("password","123")); } @Test public void updateUserById() throws Exception { mockMvc.perform(MockMvcRequestBuilders.put("/users").param("id","1").param("username","李海军").param("password","456")); } @Test public void deleteUserById() throws Exception { mockMvc.perform(MockMvcRequestBuilders.delete("/users/3")); } }

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

Springboot 2.x 如何解决重复提交 (本地锁的实践)

有没有遇到过这种情况:网页响应很慢,提交一次表单后发现没反应,然后你就疯狂点击提交按钮(12306就经常被这样怒怼),如果做过防重复提交还好,否则那是什么级别的灾难就不好说了。。。 本文主要是应用 自定义注解、 spring AOP、· Guava Cache 生成一种本地锁,来达到的防重复提交效果,由于是基于内存的缓存,所以这种实现方式并不适用于分布式服务 Guava是什么? guava包是google嫌弃JAVA自带的类库不好用,自行研发的一套工具包,对JDK工具做了很好的拓展。例如:并发[Concurrency]、缓存[Caches]、 函数式风格[Functional idioms]、 字符串处理[Strings]等等。 一、引入Guava包依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency> 二、自定义LocalLock注解 自定义一个LocalLock注解用于需要防止重复提交的方法上 /** * 锁的注解 * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface LocalLock { /** * @author fly */ String key() default ""; } 注解定义好以后就需要做AOP拦截器切面的具体实现,在 interceptor() 方法上采用的是 Around(环绕增强) ,所有带 LocalLock 注解的都将被切面处理; 既然是缓存,那紧跟的属性一定要有过期时间,通过expireAfterWrite 设置缓存的过期时间,maximumSize设置缓存的个数。 通过在内存中查询key是否存在来判断是否让再次提交,和Redis的setNX方法是一个原理。 那么这个注解该怎么用呢? @Aspect @Configuration public class LockMethodInterceptor { private static final Cache<String, Object> CACHES = CacheBuilder.newBuilder() // 最大缓存 100 个 .maximumSize(1000) // 设置写缓存后 5 秒钟过期 .expireAfterWrite(5, TimeUnit.SECONDS) .build(); @Around("execution(public * *(..)) && @annotation(com.battcn.annotation.LocalLock)") public Object interceptor(ProceedingJoinPoint pjp) { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); LocalLock localLock = method.getAnnotation(LocalLock.class); String key = getKey(localLock.key(), pjp.getArgs()); if (!StringUtils.isEmpty(key)) { if (CACHES.getIfPresent(key) != null) { throw new RuntimeException("请勿重复请求"); } // 如果是第一次请求,就将 key 当前对象压入缓存中 CACHES.put(key, key); } try { return pjp.proceed(); } catch (Throwable throwable) { throw new RuntimeException("服务器异常"); } finally { // TODO 为了演示效果,这里就不调用 CACHES.invalidate(key); 代码了 } } /** * key 的生成策略,如果想灵活可以写成接口与实现类的方式(TODO 后续讲解) * * @param keyExpress 表达式 * @param args 参数 * @return 生成的key */ private String getKey(String keyExpress, Object[] args) { for (int i = 0; i < args.length; i++) { keyExpress = keyExpress.replace("arg[" + i + "]", args[i].toString()); } return keyExpress; } } 控制层的实现 我们将注解加在控制层方法上,key = "city:arg[0] key自己定义,arg[0]这个匹配规则表示替换成第一个参数。那么就实现city:token在一定时间内不可以重复提交了 @RestController @RequestMapping("/city") public class BookController { @LocalLock(key = "city:arg[0]") @GetMapping public String query(@RequestParam String token) { return "ok- " + token; } } 测试 接下来我们就测试一下,我用的是postman 第一请求正常响应 紧接着请求第二次,返回结果“重复提交”,显然我们实现成功了 整理了几百本各类技术电子书,送给小伙伴们。关注公号回复【666】自行领取。和一些小伙伴们建了一个技术交流群,一起探讨技术、分享技术资料,旨在共同学习进步,如果感兴趣就加入我们吧! 无论你是刚入行、还是已经有几年经验的程序员,相信这份面试提纲都会给你不少助力,长按二维码关注 『 程序员内点事 』 ,回复 『 offer 』 自行领取,祝大家 offer 拿到手软

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

🔥 无耳 Solon AI v3.1.2 发布(兼容 Java 8 ~ 24),支持 SpringBoot2,jFinal,Vert.X 等第三方框架

Solon AI Solon AI ,是一套大语言模型的 Java 通用开发工具包(是Solon的二级项目)。特点: 一套接口支持不同提供者、不同大模型调用(通过方言适配) 支持 Function Call 支持 RAG 支持 AI-Flow(与Solon Flow配合) 支持同步接口与流式接口 支持会话记忆 支持聊天生成模型(ChatModel) 、图片生成模型(ImageModel) 、多态模型等 支持嵌入模型(EmbeddingModel) 、排序模型(RankingModel) 支持 Java 8 到 Java 24 支持 Spring、jFinal、Vert.x 等 Solon 以外的框架 等......更多内容,参考官网介绍 通过 Hello world 了解下: 添加应用配置 solon.ai.chat: demo: apiUrl: "http://127.0.0.1:11434/api/chat" # 使用完整地址(而不是 api_base) provider: "ollama" # 使用 ollama 服务时,需要配置 provider model: "llama3.2" # 或 deepseek-r1:7b 效果测试 @Configuration public class DemoConfig { @Bean public ChatModel build(@Inject("${solon.ai.chat.demo}") ChatConfig config) { return ChatModel.of(config).build(); } @Bean public void test(ChatModel chatModel) throws IOException { //一次性返回 ChatResponse resp = chatModel.prompt("hello").call(); //打印消息 System.out.println(resp.getMessage()); } } 最近更新了什么? 新增 solon-ai-repo-chroma 插件 优化 solon-ai-repo-tcvectordb 插件相似度处理 优化 solon-ai-repo-elasticsearch 插件相似度处理 项目仓库地址? gitee:https://gitee.com/opensolon/solon-ai gitcode:https://gitcode.com/opensolon/solon-ai github:https://github.com/opensolon/solon-ai 官网? https://solon.noear.org/article/learn-solon-ai

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

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

用户登录
用户注册