码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【SpringBoot框架篇】28.使用JdbcTemplate操作数据库


    文章目录

    • 1.引入依赖
    • 2.配置数据集连接信息
    • 3.操作数据库
      • 3.1.执行DDL语句
      • 3.2.添加数据
      • 3.3.查询数据
      • 3.4.修改数据
      • 3.5.删除数据
    • 4.项目配套代码

    1.引入依赖

            
                org.springframework.boot
                spring-boot-starter-jdbc
            
    
            
                mysql
                mysql-connector-java
                8.0.11
            
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.配置数据集连接信息

    spring:
      datasource:
        username: root
        password: 123456
        url: jdbc:mysql://localhost:3306/jdbctest?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=15000&autoReconnect=true
        #MySQL5.7以上的版本使用com.mysql.cj.jdbc.Driver
        #MySQL5.7以下的版本使用com.mysql.jdbc.Driver
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.操作数据库

    自动装配Bean对象

    @Autowired
    JdbcTemplate jdbcTemplate;
    
    • 1
    • 2

    3.1.执行DDL语句

    jdbcTemplate通过execute方法执行DDL语句

            String sql = "create table sys_user(id int AUTO_INCREMENT,username varchar(255),password varchar(255),age int,PRIMARY KEY (id))ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_0900_ai_ci;";
            jdbcTemplate.execute(sql);
            System.out.println("创建表成功");
    
    • 1
    • 2
    • 3

    表对应的实体类为

    public class SysUser implements Serializable {
    
        public SysUser(){}
    
        public SysUser(Integer id, String username, String password, Integer age){
            this.id=id;
            this.username=username;
            this.password=password;
            this.age=age;
        }
    
        private Integer id;
    
        private String username;
    
        private String password;
    
        private Integer age;
    		
    	//省略 get,set方法
        @Override
        public String toString() {
            return "SysUsers{" +
                    "id=" + id  +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    }
    
    • 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

    3.2.添加数据

    • 执行update(sql)方法直接插入拼接好的sql数据
    • 执行update(sql,Object… args)方法通过占位符的方式插入数据
    • 通过KeyHolder+PreparedStatementCreator()配置返回自增的主键信息
            //1.插入数据 占位符
            String sql = "insert into sys_user (username,password,age) values(?,?,?);";
            int ret = jdbcTemplate.update(sql,"王五","123456",18);
            if (ret == 0) {
                System.out.println("添加失败!");
            }
            //插入测试数据方便后面分页测试
            sql = "insert into sys_user (username,password,age) values('张三','李四',18);";
            for (int i = 0; i < 20; i++) {
                ret = jdbcTemplate.update(sql);
                if (ret == 0) {
                    System.out.println("添加失败!");
                }
            }
    
            //2.插入数据并返回主键
            KeyHolder keyHolder1 = new GeneratedKeyHolder();
            String finalSql = sql;
            ret = jdbcTemplate.update(new PreparedStatementCreator() {
                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    // 设置返回的主键字段名
                    PreparedStatement ps = con.prepareStatement(finalSql, Statement.RETURN_GENERATED_KEYS);
                    return ps;
                }
            }, keyHolder1);
            if (ret == 1) {
                // 获取到插入数据生成的自增ID
                int id = keyHolder1.getKey().intValue();
                System.out.println(id);
            }
    
    • 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

    3.3.查询数据

    • 执行queryForList()返回map映射好的数据
    • 通过实现RowMapper接口手动注入数据到Bean中
    • 使用BeanPropertyRowMapper类克隆数据到Bean中
           String sql = "select * from sys_user";
            //1.使用map封装查询出来的字段名称和字段值
            System.out.println("返回map数据");
            List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
            for (Map<String, Object> map : mapList) {
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
                }
            }
            
            //2.通过RowMapper获取ResultSet手动赋值给bean
            System.out.println("手动注入");
            List<SysUser> sysUserList = jdbcTemplate.query(sql, new RowMapper<SysUser>() {
                @Override
                public SysUser mapRow(ResultSet resultSet, int i) throws SQLException {
                    SysUser sysUser = new SysUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("password"), resultSet.getInt("age"));
                    return sysUser;
                }
            });
            for (SysUser sysUser : sysUserList) {
                System.out.println(sysUser.toString());
            }
    
            //3.通过BeanPropertyRowMapper 克隆字段
            System.out.println("BeanPropertyRowMapper 克隆");
            sysUserList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SysUser.class));
            for (SysUser sysUser : sysUserList) {
                System.out.println(sysUser.toString());
            }
    
            //4.分页查询
            Integer totalElements = jdbcTemplate.queryForObject("SELECT count(id) FROM sys_user", Integer.class);
            //当前页
            Integer currentPage = 1;
            //页码大小
            Integer pageSize = 5;
            sysUserList = jdbcTemplate.query("SELECT * FROM sys_user limit ?,?", new BeanPropertyRowMapper<>(SysUser.class), (currentPage - 1) * pageSize, pageSize);
            for (SysUser sysUser : sysUserList) {
                System.out.println(sysUser.toString());
            }
            System.out.println("总记录数=" + totalElements + ",总页数=" + (totalElements % pageSize == 0 ? totalElements / pageSize : totalElements / pageSize + 1));
    
    • 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

    3.4.修改数据

    也可像3.2一样使用占位符方式操作

           String sql = "update  sys_user set username='李四' where id=1";
            int ret = jdbcTemplate.update(sql);
            if (ret == 1) {
                System.out.println("修改成功");
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.5.删除数据

          String sql = "delete from sys_user where id=?";
            int ret = jdbcTemplate.update(sql, 1);
            if (ret == 1) {
                System.out.println("删除成功");
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.项目配套代码

    github地址

    创作不易,要是觉得我写的对你有点帮助的话,麻烦在github上帮我点下 Star

    【SpringBoot框架篇】其它文章如下,后续会继续更新。

    • 1.搭建第一个springboot项目
    • 2.Thymeleaf模板引擎实战
    • 3.优化代码,让代码更简洁高效
    • 4.集成jta-atomikos实现分布式事务
    • 5.分布式锁的实现方式
    • 6.docker部署,并挂载配置文件到宿主机上面
    • 7.项目发布到生产环境
    • 8.搭建自己的spring-boot-starter
    • 9.dubbo入门实战
    • 10.API接口限流实战
    • 11.Spring Data Jpa实战
    • 12.使用druid的monitor工具查看sql执行性能
    • 13.使用springboot admin对springboot应用进行监控
    • 14.mybatis-plus实战
    • 15.使用shiro对web应用进行权限认证
    • 16.security整合jwt实现对前后端分离的项目进行权限认证
    • 17.使用swagger2生成RESTful风格的接口文档
    • 18.使用Netty加websocket实现在线聊天功能
    • 19.使用spring-session加redis来实现session共享
    • 20.自定义@Configuration配置类启用开关
    • 21.对springboot框架编译后的jar文件瘦身
    • 22.集成RocketMQ实现消息发布和订阅
    • 23.集成smart-doc插件零侵入自动生成RESTful格式API文档
    • 24.集成FastDFS实现文件的分布式存储
    • 25.集成Minio实现文件的私有化对象存储
    • 26.集成spring-boot-starter-validation对接口参数校验
    • 27.集成mail实现邮件推送带网页样式的消息
    • 28.使用JdbcTemplate操作数据库
    • 29.Jpa+vue实现单模型的低代码平台
    • 30.使用sharding-jdbc实现读写分离和分库分表
    • 31.基于分布式锁或xxl-job实现分布式任务调度
    • 32.基于注解+redis实现表单防重复提交
  • 相关阅读:
    【一周安全资讯1007】多项信息安全国家标准10月1日起实施;GitLab发布紧急安全补丁修复高危漏洞
    93. 复原 IP 地址
    C++中的volatile
    SAP MTS/ATO/MTO/ETO专题之九:M+M模式前后台操作,策略用50,提前准备原材料和半成品
    【Mysql实现递归树查询】
    冥想第六百一十天
    win10语言切换调整为像win7一样,设置纯英文键盘切换,使用ctrol+shift切换键盘
    十、http客户端Feign
    git--远程仓库的命令--使用/实例
    Cadence 设计快速入门
  • 原文地址:https://blog.csdn.net/ming19951224/article/details/126592129
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号