zoukankan      html  css  js  c++  java
  • SpringBoot-07-之数据库JPA(CRUD)

    现在来介绍SpringBoot基于jpa对MySQL进行操作。
    既然是数据库操作总有点目标和资源吧,
    现在来做一个:《万界神兵录》收集一下天下神兵,从剑开始

    一.前期准备

    1.个人还是比较喜欢自己建表:建表
    CREATE TABLE sword
    (
        id int PRIMARY KEY NOT NULL COMMENT '身份验证码' AUTO_INCREMENT,
        name varchar(24) NOT NULL COMMENT '名称',
        info text COMMENT '描述信息',
        imgurl varchar(100) COMMENT '图片',
        create_time datetime COMMENT '创建时间',
        modify_time datetime COMMENT '修改时间',
        origin varchar(40) COMMENT '来源'
    );
    
    2.一条数据:Excalibur
    sql> INSERT INTO `toly`.`sword` (`name`, `info`, `imgurl`, `create_time`, `modify_time`, `origin`)
    VALUES ('Excalibur', 'Excalibur是传说中不列颠国王亚瑟王从湖之仙女那得到的圣剑。此剑在是精灵在阿瓦隆(Avalon)所打造,
    剑锷由黄金所铸、剑柄上镶有宝石,并因其锋刃削铁如泥', 
    '', '2018-07-16 05:30:15', '2018-07-16 05:30:20', '亚瑟王')
    

    二.项目中:

    1.添加依赖:toly01pom.xml
            <!--jpa依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <!--mysql依赖-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
    2.数据库信息配置:srcmain esourcesapplication-dev.yml
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver  #驱动类名--不变
        url: jdbc:mysql:///toly #数据库名称
        username: root #用户名
        password: ****** #密码
      jpa:
        hibernate:
          ddl-auto: none #见下
        show-sql: true #控制台显示sql语句
    
    • jpa hibernate:启动时对表怎么操作:个人还是喜欢自己建表。
    ddl-auto: create(删除,创建)
    ddl-auto: update(第一次创建,之后更新)
    ddl-auto: create-drop(创建,程序停止后删除)
    ddl-auto: none(无操作)
    
    3.新建javaBean类--toly1994.com.toly01.bean.Sword

    注意:如果已经创建数据库,类名和表名统一。

    @Entity //实体类
    public class Sword {
        @Id // id
        @GeneratedValue(strategy = GenerationType.IDENTITY) //自增长
        private int id;
        private String name;
        private String info;
        private String imgurl;
        private Date create_time;
        private Date modify_time;
        private String origin;
        //get set toString 省略...
    }
    
    4.建立仓储管理对象:toly1994.com.toly01.repository.SwordRepository
    public interface SwordRepository extends JpaRepository<Sword, Integer> {
    
    }
    
    5.控制器:toly1994.com.toly01.controller.SwordController

    查询操作

    5-1-1.查询所有对象
        @Autowired //获取实例
        private SwordRepository mSwordRepository;
    
        /**
         * @return json字符串显示
         */
        @GetMapping(value = "/swords/findAll")
        public List<Sword> findAllToJson() {
            return mSwordRepository.findAll();
        }
    
    9414344-bf360c2e3aeb0bda.png
    查询所有
    5-1-2.根据id查询
        /**
         * @param id 
         * @return
         */
        @GetMapping(value = "/swords/find/{id}")
        public Sword find(@PathVariable("id") Integer id) {
            return mSwordRepository.findById(id).get();
        }
    
    9414344-b30483ebe4c0cc15.png
    根据id查询
    5-1-3.根据其他字段查询:以name为例
    • 在仓储添加方法:toly1994.com.toly01.repository.SwordRepository
        //通过name查询
        public List<Sword> findByName(String name);
    
    • 添加控制方法
        /**
         * @param name
         * @return
         */
        @GetMapping(value = "/swords/findByName/{name}")
        public List<Sword> findByAtk(@PathVariable("name") String name) {
            return mSwordRepository.findByName(name);
        }
    
    9414344-b30483ebe4c0cc15.png
    根据name查询

    插入操作

    在02篇讲述了传值的一些方式,这里也可用参数传值
        /**
         * 添加:返回插入对象的json字符串
         * 
         * @return
         */
        @GetMapping(value = "/swords/insert")
        public Sword insert() {
            Sword sword = new Sword();
            sword.setInfo("《犬夜叉》杀生丸配件,初时是一把不能杀此世之物的治愈之刀," +
                    "属于彼世之刀,是刀刀斋用犬大将(斗牙王)的獠牙所打造的剑," +
                    "可通过斩杀冥界的使者令死者复活。" +
                    "若是以真正的慈悲心使之发动,一挥刀能拯救百命");
            sword.setName("天生牙");
            sword.setOrigin("《犬夜叉》--杀生丸");
            sword.setCreate_time(new Date());
            sword.setModify_time(new Date());
            return mSwordRepository.save(sword);
        }
    
    • 访问:localhost:8080/swords/insert


      9414344-5a63273ff9d61615.png
      插入操作--网页返回
    9414344-f37d2b5ce68e424c.png
    插入操作--控制台输出
    通过url传值构建对象
        /**
         * 添加:通过url传值构建对象
         * @return
         */
        @GetMapping(value = "/swords/insert2")
        public Sword insert2(Sword sword) {
            return mSwordRepository.save(sword);
        }
    
    • 访问:localhost:8080/swords/insert2?name=九虹&info=圣剑&origin=《幻将录》
    更新操作:打错了一个字,来改改吧:配件==>配剑
        @GetMapping(value = "/swords/updata/{id}")
        public Sword updata(Sword sword) {
            return mSwordRepository.save(sword);
        }
    
    • 访问:http://localhost:8080/swords/updata/2?name=天生牙&info=《犬夜叉》杀生丸配件,初时是一把不能杀此世之物的治愈之刀,
      属于彼世之刀,是刀刀斋用犬大将(斗牙王)的獠牙所打造的剑,可通过斩杀冥界的使者令死者复活。"
      若是以真正的慈悲心使之发动,一挥刀能拯救百命
    删除操作
        @GetMapping(value = "/swords/delete/{id}")
        public void insert(@PathVariable("id") Integer id) {
             mSwordRepository.deleteById(id);
        }
    

    事务

    1.Service:业务处理逻辑在Controller里写会让他太臃肿,最好写个服务类来写逻辑
    • 新建服务类:toly1994.com.toly01.service.SwordService
    @Service
    public class SwordService {
        @Autowired
        private SwordRepository mSwordRepository;
    
        public void insertTwo() {
            Sword jie = new Sword();
            jie.setName("解剑");
            jie.setInfo("幻将录--何解莲");
            mSwordRepository.save(jie);
        }
    }
    
    • 使用服务:top.toly.springboot.database.controlor.SwordController
        @Autowired //得到服务对象
        private SwordService mSwordService;
        /**
         * 查询所有:返回json字符串
         *
         * @return
         */
        @GetMapping(value = "/swords/inset2")
        @Transactional
        public void inset2() {
            mSwordService.insertTwo();
        }
    
    2.事务:同生共死
    未开启事务时:
    /**
     * 作者:张风捷特烈
     * 时间:2018/7/16:15:31
     * 邮箱:1981462002@qq.com
     * 说明:业务需求:解连双剑必须同时插入成功或失败
     */
    @Service
    public class SwordService {
        @Autowired
        private SwordRepository mSwordRepository;
    
        public void insertTwo() {
            Sword jie = new Sword();
            jie.setName("解剑");
            jie.setInfo("幻将录--何解莲");
            mSwordRepository.save(jie);
    
            Sword lian = new Sword();
            lian.setName("连剑");
            //在这故意给个异常看看结果
            jie.setInfo("幻将录--何解莲" + 1 / 0);
            mSwordRepository.save(lian);
        }
    }
    
    开启事务时:加个注解: @Transactional //org.springframework.transaction.annotation.Transactional
    • toly1994.com.toly01.service.SwordService
     @Transactional
        public void insertTwo() {
            ......
     }
    
    • 这样它们就同生共死了,注意,虽然失败了,但id还是增加了
    • 注:也可在top.toly.springboot.database.controlor.SwordController调用的方法上加注解
  • 相关阅读:
    【leetcode】剑指 Offer 07. 重建二叉树
    【leetcode】剑指 Offer 59
    【leetcode】717. 1比特与2比特字符
    【leetcode】67. 二进制求和
    【leetcode】258. 各位相加
    文件管理(高级)
    文件管理(基础)
    python之模块与类库
    python之对象与类
    python之迭代器
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781999.html
Copyright © 2011-2022 走看看