SpringBoot 微信点餐系统 3:买家端

配置数据库及实现 Hibernate 的查改增删

1. pom.xml 新增数据库的相关依赖

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

2. 配置数据库的信息

spring:
  datasource;
      username: root
      driver-class-name:  com.mysql.jdbc.Driver
      password: 123456
      url: jdbc:mysql://192.168.31.157:3306/wxorder_sell?characterEncoding=utf-8&useSSL=false
  jpa:
    show-sql:true

3. 配置 entity,映射 mysql 表结构

新建 dataobject/ProductCategory
Note: 不需要把所有的表字段映射到类属性,比如 createTime / updateTime ,这种不写也照常运行。

//映射 mysql
@Entity 
// 当类名与表名不一致时,使用此注解
@Table(name = "wxorder_product_category")
// lombok 的注解,使用此注解自动添加 get/set 方法
@Data
//@DynamicUpdate
public class ProductCategory{
      
      @Id
      @GenerateValue
      //@GenerateValue(strategy = GenerationType.IDENTITY)
      
      private Integer categoryId;

      private String categoryName;

      private Integer categoryType;

      //private Date createTime;

      // private Date updateTIme;
}

4. 配置DAO层

新建 repository/ProductCategoryRepository

// Integer 是 ProductCategory 映射的表的主键类型
public interface ProductCategoryRepositoy extends JpaRepository<ProductCategory, Integer>

5. 测试 Hibernate 的查改增删

右键 ProductCategoryRepository , goto,自动创建ProductCategoryRepositoryTest

(1)查询

// 这两个注解必填
@RunWith(SpringRunner.class)
@SpringBootTest

public class ProductCategoryRepositoryTest{

    // 接口对接了许多方法,所以必须引入
    @AutoWired
    private ProductCategoryRepository repository;

    @Test
    public void findOneTest(){
          Optional<ProductCategory> productCategory = repository.findById(1);
          System.out.println(productCategory);
    }
}

版本问题踩的坑

  1. 原来根据主键查询,findOne,现在是
Optional<ProductCategory> productCategory = repository.findById(1);

ProductCategory productCategory = repository.findById(1).get();

如果依旧使用findOne()的写法,会报错

Inferred type 'S' for type parameter 'S' is not within its bound; should extends com.example.demo.Girl

这类错误

  1. java9 的错误,由于模块化导致了一些错误
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

需要在 maven 中添加一些依赖

<dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>

(2)插入/insert

@Test
public void insertTest(){
  ProductCategory productCategory = new ProductCategory();
  productCategory.setCategoryName("冬日甜品");
  productCategory.setCategoryType(7);
  repository.save(productCategory);
}

这时会抛出一个异常,具体的解释请看Spring 中使用Hibernate,修改 ProductCategory 的 categoryId 的注解

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer categoryId;

(3) update

update operation is like insert operation except update operation needs specify the primary key

  1. update directly
@Test
public void updateDirectly(){
  ProductCategory productCategory = new ProductCategory();
  productCategory.setCategoryId(2);
  productCategory.setCategoryName("圣诞特供");
  repository.save(productCategory); 
}
  1. 先查询再更新
    这种操作很常见,在很多场景中我们需要先查询信息,然后根据查询的信息做一些判断然后再更新。
    这部分主要是想讲注解 @DynamicUpdate的作用,所以先在 ProductCategory 上添加2个属性
private Date createTime;
private Date updateTime;

先注意一下表中id为2 的update time,然后进行更新操作

@Test
public void updateAfterQuery(){
    ProductCategory productCategory = repository.findById(2).get();
    productCategory.setCategoryType(20);
    repository.save(productCategory);
}

这时发现数据更新了,但是updateTime没有更新。sql 日志为

Hibernate: select productcat0_.category_id as category1_0_0_, productcat0_.category_name as category2_0_0_, productcat0_.category_type as category3_0_0_, productcat0_.create_time as create_t4_0_0_, productcat0_.update_time as update_t5_0_0_ from wxorder_product_category productcat0_ where productcat0_.category_id=?
Hibernate: select productcat0_.category_id as category1_0_0_, productcat0_.category_name as category2_0_0_, productcat0_.category_type as category3_0_0_, productcat0_.create_time as create_t4_0_0_, productcat0_.update_time as update_t5_0_0_ from wxorder_product_category productcat0_ where productcat0_.category_id=?

Hibernate: update wxorder_product_category set category_name=?, category_type=?, create_time=?, update_time=? where category_id=?

在 ProductCategory 上添加注解 @DynamicUpdate,再次执行,发现只有查询日志

Hibernate: select productcat0_.category_id as category1_0_0_, productcat0_.category_name as category2_0_0_, productcat0_.category_type as category3_0_0_, productcat0_.create_time as create_t4_0_0_, productcat0_.update_time as update_t5_0_0_ from wxorder_product_category productcat0_ where productcat0_.category_id=?
Hibernate: select productcat0_.category_id as category1_0_0_, productcat0_.category_name as category2_0_0_, productcat0_.category_type as category3_0_0_, productcat0_.create_time as create_t4_0_0_, productcat0_.update_time as update_t5_0_0_ from wxorder_product_category productcat0_ where productcat0_.category_id=?

这说明Hibernate 没有进行 update 操作,why?因为我们更新的数据和表中的数据相同,这说明当更新的数据和表中的数据相同的时候,Hibernate是不会进行操作的。
修改代码中更新的数据,

@Test
public void updateAferQuery(){
    ProductCategory productCategory = repository.findById(2).get();
    productCategory.setCategoryType(12);
    repository.save(productCategory);
}

这时再次观察sql日志

Hibernate: select productcat0_.category_id as category1_0_0_, productcat0_.category_name as category2_0_0_, productcat0_.category_type as category3_0_0_, productcat0_.create_time as create_t4_0_0_, productcat0_.update_time as update_t5_0_0_ from wxorder_product_category productcat0_ where productcat0_.category_id=?
Hibernate: select productcat0_.category_id as category1_0_0_, productcat0_.category_name as category2_0_0_, productcat0_.category_type as category3_0_0_, productcat0_.create_time as create_t4_0_0_, productcat0_.update_time as update_t5_0_0_ from wxorder_product_category productcat0_ where productcat0_.category_id=?
Hibernate: update wxorder_product_category set category_type=? where category_id=?

看,添加上@DynamicUpdate后,Hibernate 的更新语句发生了变化。

(4) 删除/delete

删除操作非常简单,只要删除就ok了

@Test
public void deleteTest(){
    repository.deleteById(1);
}

(5) 执行完成后回滚

为了让数据库中不产生脏数据,可以使用@Transactional注解

@Test
@Transactional
public void transacational(){
    ProductCategory productCategory = new ProductCategory();
    productCategory.setCategoryName("男生最爱");
    productCategory.setCategoryType(123);
    repository.save(productCategory);
}

(6) Hibernate 使用CategoryType 来查询一组数据

  1. 需要在接口里定义一个接口,注意此接口必须符合一定的格式
public interface ProductCategoryRepository extends JpaRepository<ProductCategory, Integer>{
      List<ProductCategory> findByCategoryTypeIn(List<Integer> categoryType);
}
  1. 测试方法
@Test
public void findByCategoryTypeInTest(){
      List<Integer> list = Arrays.asList(3, 70);
      List<ProductCategory> result =  repository.findByCategoryTypeIn(list);
      Assert.assertNotEquals(0, result.size());
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容