hibernate及SpringBoot集成Jpa实现对数据库操作
首先使用Maven工程和junit完成hibernate对数据库的简单操作,完成之后在使用SpringBoot集成Jap完成hibernate对数据库的操作。本文仅供新手学习查看,具体线上使用需要对代码继续进行相关优化。
1、先创建一个Maven工程,导入相关依赖。
<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--hibernate--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.14.Final</version> </dependency>
2、在resources目录下创建hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--数据库配置--> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/user-mode</property> <property name="connection.username">root</property> <property name="connection.password">1234qwer</property> <!-- Hibernate 方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 打印 SQL 语句--> <property name="show_sql">true</property> <!-- 格式化 SQL 语句--> <property name="format_sql">true</property> <!-- 映射文件所在位置 --> <mapping resource="/mapper/User.hbm.xml" /> </session-factory> </hibernate-configuration>
3、创建一个实体类
@Datapublic class User {private Long id; private String name; private String password; private String account; private String email;private String secondName; }
4、在resources目录下创建一个mapper目录,在mapper目录下面创建User实体类的映射文件User.hbm.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- name 属性:持久化类的全路径 --> <!-- table 属性:表的名称 --> <class name="com.itmy.entity.User" table="tb_user"> <id name="id" column="id" type="java.lang.Long"> <!--主键生成策略--> <generator class="native"></generator> </id> <property name="name" column="name" type="java.lang.String" not-null="false" length="50"></property> <property name="account" column="account" type="java.lang.String"></property> <property name="email" column="email" type="java.lang.String"></property> <property name="password" column="password" type="java.lang.String"></property> <property name="secondName" column="second_name" type="java.lang.String"></property> </class> </hibernate-mapping>
配置完上述配置之后,接下来我们就可以使用junit进行测试了,先在test目录下面创建一个测试类UserTest。
5、使用junit添加一个User用户
@org.junit.Test
public void TestSave(){
//读取 hibernate.cfg.xml配置文件, 创建会话工厂 SessionFactory
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 获取 Session 对象
Session openSession = sessionFactory.openSession();
//开启事务
openSession.beginTransaction();
User user = new User();
user.setAccount("hibernateTest01");
user.setName("hibernateTest01");
user.setPassword("ASWDEWSA");
user.setEmail("hibernate02@hbm.com");
user.setSecondName("hibernateTest01");
openSession.save(user);
//提交事务
openSession.getTransaction().commit();
}
执行之后,控制台没有报红,说明添加成功了。可以给上述代码做下优化,帮助我们更方便的完成其他操作。
private Session openSession; @Before public void before(){ //读取 hibernate.cfg.xml配置文件, 创建会话工厂 SessionFactory Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); // 获取 Session 对象 openSession = sessionFactory.openSession(); } @org.junit.Test public void TestSave(){ // //读取 hibernate.cfg.xml配置文件, 创建会话工厂 SessionFactory // Configuration configuration = new Configuration().configure(); // SessionFactory sessionFactory = configuration.buildSessionFactory(); // // 获取 Session 对象 // Session openSession = sessionFactory.openSession(); //开启事务 openSession.beginTransaction(); User user = new User(); user.setAccount("hibernateTest01"); user.setName("hibernateTest01"); user.setPassword("ASWDEWSA"); user.setEmail("hibernate02@hbm.com"); user.setSecondName("hibernateTest01"); openSession.save(user); //提交事务 openSession.getTransaction().commit(); }
@After
public void after(){
if (openSession != null){
openSession.close();
}
}
实现更新、删除、查询,查询有许多种方法,后面可以进行深入学习。
@org.junit.Test public void testUpdate(){ //开启事务 openSession.beginTransaction(); User user = new User(); user.setId(8L); user.setAccount("hibernateTest03"); user.setName("hibernateTest03"); user.setPassword("ASWDEWSAW"); user.setEmail("hibernate03@hbm.com"); user.setSecondName("hibernateTest03"); openSession.update(user); //提交事务 openSession.getTransaction().commit(); } @org.junit.Test public void testDelete(){ //开启事务 openSession.beginTransaction(); User user = new User(); user.setId(8L); openSession.delete(user); //提交事务 openSession.getTransaction().commit(); } @org.junit.Test public void testFind(){ User user = new User(); user.setId(8L); //已过时 Criteria criteria = openSession.createCriteria(User.class); List list = criteria.list(); for (Object o : list) { System.out.println(o); } List fromUser = openSession.createQuery("from User").list(); fromUser.forEach(System.out::println); }
到这里通过maven简单的使用hibernate的操作就完成了,后面我们使用SpringBoot集成Jpa。
6、首先调整我们的maven项目,添加springboot相关依赖以及jpa依赖。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.11.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--数据库连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> </dependency>
<dependencies>
7、创建Springboot启动类
/** * @date: 2023-05-11 13:29 */ @SpringBootApplication public class HibernApplication { public static void main(String[] args) { SpringApplication.run(HibernApplication.class,args); } }
8、在resources目录下创建yml文件
server: port: 8800 spring: application: name: hibernate profiles: active: prod
spring: jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQLDialect new_generator_mappings: false format_sql: true #show_sql: true database: mysql show-sql: true #当数据库表没有该属性字段,会根据实体类相关字段自动创建一个字段,如secondName在数据库创建的为second_name hibernate: ddl-auto: update
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
#ddl-auto: none
datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/user-mode?serverTimezone=Asia/Shanghai username: root password: 1234qwer
9、调整之前创建的实体类
@Data @Entity @Table(name = "tb_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id",nullable = false) private Long id; private String name; private String password; private String account; private String email; @Column(name = "second_name",nullable = false) private String secondName; }
10、创建一个dao层接口继承jpa接口
public interface UserMapper extends JpaRepository<User,Long> { }
后面就跟正常调用方法一样,通过注入UserMapp接口,进行调用。
@Service public class UserServiceImpl implements IUserService { @Autowired private UserMapper userMapper; @Override public List<User> findAll() { List<User> userIterable = userMapper.findAll(); return userIterable; } @Override public User save() { User user = new User(); user.setAccount("hibernateJPa03"); user.setName("hibernateJPa03"); user.setPassword("ASWDEWSAW"); user.setEmail("hibernateJPa03@hbm.com"); user.setSecondName("hibernateJPa03"); User save = userMapper.save(user); return save; } @Override public User update() { User user = new User(); user.setId(5L); user.setAccount("hibernateJPa03"); user.setName("hibernateJPa03"); user.setPassword("ASWDEWSAW"); user.setEmail("hibernateJPa03@hbm.com"); user.setSecondName("hibernateJPa03"); User save = userMapper.save(user); return save; } @Override public User delete() { User user = new User(); user.setId(10L); userMapper.delete(user); return null; } @Override public User userById() { // Iterable<User> allById = userMapper.findAllById(Arrays.asList(1L)); Optional<User> userOptional = userMapper.findById(4L); if (!userOptional.isPresent()){ return null; } User user = userOptional.get(); return user; } }
创建controller类编写一个接口进行测试。
@RestController @RequestMapping("/admin/user") public class UserController { @Autowired private IUserService userService; @GetMapping public String crudUser(){ List<User> userList = userService.findAll(); userList.forEach(System.out::println); User user = userService.userById(); System.out.println(user); return "操作执行成功!!!"; } }
调用接口执行过后,查看控制台输出。
数据查询成功。至此springboot集成JPA就完成了。里面有很多方法,时间充足可以试试不同的方法。
补充:
通过JPA使用原生sql进行模糊查询,在Mapper接口增加一个接口方法,使用jpa的@query注解进行sql语句编写
public interface UserMapper extends JpaRepository<User,Long> , JpaSpecificationExecutor { #nativeQuery = true 说明启动mysql本身的sql语句进行查询 默认为false @Query(value = "select * from tb_user where name like concat('%',?1,'%')",nativeQuery = true) List<User> findOneByName(@Param("name") String name); }