Springboot+hibernate实现简单的增删改查示例

1、创建好项目之后在配置端口号(也可以不用配置,默认端口8080)

#server
server.port=8080
server.tomcat.uri-encoding=utf-8

2、配置mysql

#MySQL
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
spring.datasource.username=*****
spring.datasource.password=*****

3、配置jpa以及视图层

#Spring Data JPA
spring.jpa.database=MYSQL
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

#视图层控制
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.mvc.static-path-pattern=/static/**

4、在pom中加入springboot需要的依赖

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.39</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
      <version>1.4.0.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<!--    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
      <version>1.4.3.RELEASE</version>
    </dependency>-->
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
      <version>1.5.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.46</version>
    </dependency>

  </dependencies>

整个包结构

Controller

package com.song.configuration.controller;

import com.alibaba.fastjson.JSONObject;
import com.song.configuration.entity.User;
import com.song.configuration.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 *
 * User控制层
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {
  @Autowired
  private UserService userService;

  @RequestMapping(value = "/index")
  public String index(){
    return "user/index";
  }

  @RequestMapping(value = "/show",method = RequestMethod.GET)
  @ResponseBody
  public String show(@RequestParam(value = "name")String name){
    User user = userService.findUserByName(name);
    if(null != user)
      return user.getId()+"/"+user.getName()+"/"+user.getPassword();
    else return "null";
  }

  @RequestMapping("/showlist")
  @ResponseBody
  public JSONObject showList(){
    List<User> list = userService.find();
    JSONObject jo = new JSONObject();
    if(list!=null){

      jo.put("code",0);
      jo.put("msg",true);
      jo.put("count",list.size());
      jo.put("data",list);
    }
    return jo;
  }

  @RequestMapping("/delete")
  @ResponseBody
  public String deleteUserById(@RequestParam(value = "id")Integer id){
    return userService.deleteUserById(id);
  }

  @RequestMapping("/update")
  @ResponseBody
  public String queryUserById(@RequestParam(value = "id")Integer id,@RequestParam(value = "name")String name){

    return userService.queryUserById(id,name);
  }

  @RequestMapping("/add")
  @ResponseBody
  public String countUserBy(@RequestParam(value = "id")Integer id,@RequestParam(value = "name")String name,@RequestParam(value = "password")String password){
    return userService.countUserBy(id,name,password);
  }
}

service

package com.song.configuration.service;

import com.song.configuration.entity.User;
import com.song.configuration.repository.UserRepositoty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 *
 * User业务逻辑
 */
@Service
public class UserService {
  @Autowired
  private UserRepositoty userRepositoty;

  public User findUserByName(String name) {
    User user = null;
    try {
      user = userRepositoty.findByUserName(name);
    } catch (Exception e) {
    }
    return user;
  }

  public List<User> find() {
    List<User> list = null;
    try {
      list = userRepositoty.find();
    } catch (Exception e) {
    }
    return list;
  }

  public String deleteUserById(Integer id){
    int a = userRepositoty.deleteUserById(id);
    return "chenggong";
  }

  public String queryUserById(Integer id ,String name){
    int a = userRepositoty.queryUserById(id,name);
    return "成功";
  }

  public String countUserBy(Integer id ,String name ,String password){
    int a = userRepositoty.countUserBy(id,name,password);
    return "成功";
  }
}

Repository

package com.song.configuration.repository;

import com.song.configuration.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by Song on 2017/2/15.
 * User表操作接口
 */
@Repository
public interface UserRepositoty extends JpaRepository<User,Long>{
  /*
  * 根据用户名查询
  * */
  @Query("select t from User t where t.name = :name")
  User findByUserName(@Param("name") String name);

  /*
  * 查询全部
  * */
  @Query("select t from User t")
  List<User> find();

  /*
  * 删除 必须加入@Modifying和@Transactional
  * */
  @Modifying
  @Transactional
  @Query("delete from User u where u.id=:id")
  public int deleteUserById(@Param("id") Integer id);

  @Modifying
  @Transactional
  @Query("update User u set u.name = :name where u.id=:id")
  public int queryUserById(@Param("id") Integer id,@Param("name") String name);
    
  @Query(value = "insert into User value(?,?,?)", nativeQuery = true)
  @Transactional
  @Modifying
  public int countUserBy(@Param("id")Integer id,@Param("name") String name,@Param("password") String password);
}

@modifying:

(1)可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。注意: JPQL 不支持使用 INSERT;

(2)在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知   SpringData, 这是一个 UPDATE 或 DELETE 操作

(3)UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作;

(4)默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务。

@Transactional:

A. 一个功能是否要事务,必须纳入设计、编码考虑。不能仅仅完成了基本功能就ok。

B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。

C. 以下列了事务使用过程的注意事项,请大家留意。

1. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。

2.不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。

3.使用了@Transactional的方法,对同一个类里面的方法调用,

@Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)

4.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在

protected、private 或者 package-visible 的方法上使用 @Transactional

注解,它也不会报错,但事务无效。

5.经过在ICORE-CLAIM中测试,效果如下:

A.抛出受查异常XXXException,事务会回滚。

B.抛出运行时异常NullPointerException,事务会回滚。

C.Quartz中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)

D.异步任务中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)

E.在action中加上@Transactional,不会回滚。切记不要在action中加上事务。

F.在service中加上@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的)

G.在service中的private加上@Transactional,事务不会回滚。

application:

package com.song.configuration;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

/**
 *
 * 项目启动入口,配置包根路径
 */
@SpringBootApplication
@ComponentScan(basePackages = "com.song.configuration")
public class Entry {
  public static void main(String[] args) throws Exception {
    SpringApplication.run(Entry.class, args);
  }
}

Jpaconfiguration:

package com.song.configuration;

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@EnableJpaRepositories(basePackages = "com.song.configuration.repository")
@EntityScan(basePackages = "com.song.configuration.entity")
public class JpaConfiguration {
  @Bean
  PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){
    return new PersistenceExceptionTranslationPostProcessor();
  }
}

其他包要在jpaconfiguration所在包下面,不然找不到路径

以上这篇Springboot+hibernate实现简单的增删改查示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Hibernate一级缓存和二级缓存详解

    一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据: (2)二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hiber

  • Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例

    对于我们学习的HQL,我大概理解为就是一种查询的语言,它没有增加.删除.修改的作用,而对我们用来查询的操作,感觉用起来就是很简便,代码很少,很好理解一些. 下面是查询操作的简单实例 package com.lc.view; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import com.lc.domain.Stu

  • Hibernate的各种保存方式的区别详解

    hibernate的保存  hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别: 一.预备知识:  在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient.persistent.detached  下边是常见的翻译办法: transient:瞬态或者自由态 persistent:持久化状态 detached:脱管状态或者游离态 脱管状态的实例可以通过调用save().persist()或者saveOrUpdate()方法进行

  • Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常 (2)load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load

  • Hibernate核心类和接口的详细介绍

    一.hiobernate核心类和接口预览图 二.hibernate.properties 这个文件是以前老版本使用的 类似于hibernate.cfg.xml文件:作用和hibernate.cfg.xml一致. 三.hibernate.cfg.xml  (1)详细介绍 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下,也可以放在别的目录下. ③指定连接数据库的驱动.用户名.密码.url.连接池.. ④指定对象关系映射文件的位置. ⑤也可使用hibernate.p

  • Hibernate之CRUD操作实践

    Hibernate作为一个高度封装的持久层框架,曾经是非常牛逼的,现在虽然应用不是特别广,比如我前公司主要是做OA的,应用的框架就是Spring+SpringMVC+Hibernate. Hibernate与MyBatis相比,虽然应用面不是特别广,但是并不代表就没有用武之地. 今天讲讲Hibernate的CRUD,本文主要告诉读者Hibernate是什么,为什么要使用HibernateHibernate的优缺点,Hibernate的基础实例应用. 一.Hibernate是什么 Hibernat

  • SpringBoot 使用hibernate validator校验

    本文将全面的介绍如何使用 validator 进行数据校验 本文源码: https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate 准备工作 我们只需要引入 spring-boot-starter-web 包即可使用 1.常用注解 常用注解 2.简单的实体校验 public class CardDTO { @NotBlank private String cardId; @Size

  • Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    Hibernate ThreadLocal 它会为每个线程维护一个私有的变量空间.实际上, 其实现原理是在JVM 中维护一个Map,这个Map的key 就是当前的线程对象,而value则是 线程通过Hibernate ThreadLocal.set方法保存的对象实例.当线程调用Hibernate ThreadLocal.get方法时, Hibernate ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回. 这样,Hibernate ThreadLocal通过以各个线程对

  • hibernate测试时遇到的几个异常及解决方法汇总

    今天使用hibernate3.6.5自己配置jar lib,在测试时遇到了几个异常如下: 1.java.lang.NoSuchFieldError: INSTANCE 解决:删除hibernate-annotations.jar. 2.java.lang.ClassCastException: org.hibernate.annotations.common.reflection.java.JavaReflectionManager cannot be cast to org.hibernate

  • Hibernate实现many-to-many的映射关系

    Hibernate多对多 关联映射(many-to-many) 在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型: Hibernate会为我们创建中间关联表,转换成两个一对多. (1)一个最简单的例子就是学生选课的数据表了 (2)Student.java public class Course { private Integer id; private String name; private Set<StuCourse> stuCourses; //

随机推荐