SpringBoot 的连接数据库的俩种方式

调用数据库的几种方式

1.Spring Data JPA 方式

  1. 作用及目的
    Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 此模块处理对基于JPA的数据访问层的增强支持。 它使构建使用数据访问技术。Spring驱动应用程序变得更加容易。在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦。 必须编写太多样板代码来执行简单查询以及执行分页和审计。 Spring Data JPA旨在通过减少实际需要的工作量来显著改善数据访问层的实现。
  2. 如何使用
  • 创建时引入
    创建时引入
  • 依赖添加
  <!--mysql相关-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
  <!--Spring Data JPA相关-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
  • application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/sql_table?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
server:
  port: 8181

  • 实体类注释使用
@Data  //Lombook插件
@Entity
@Id
  • 持久层
//持久层中的方法
public interface UserDao extends JpaRepository<User,Integer> {
}

//继承类JpaRepository中的方法
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
  List<T> findAll();

  List<T> findAll(Sort var1);

  List<T> findAllById(Iterable<ID> var1);

  <S extends T> List<S> saveAll(Iterable<S> var1);

  void flush();

  <S extends T> S saveAndFlush(S var1);

  void deleteInBatch(Iterable<T> var1);

  void deleteAllInBatch();

  T getOne(ID var1);

  <S extends T> List<S> findAll(Example<S> var1);

  <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

2 MyBatis方式

  1. 理解
    mybatis 方式有注解和配置文件的方式,我个人比较喜欢配置文件的方式,同时还有mybatis-plus 可以逆向构建实体类。我认为mybatis就类似于配对这种还有套娃,重要的是仔细,认真
  2. 如何使用
  • 依赖的引入
 <!--mybatis相关-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
  • yml文件的配置
    (为了之后使用就一起放上来俩个yml文件)
spring:
  profiles:
    active: dev
  ## springboot 1.X

  resources:
    static-locations:
#      - classpath:resources
      - classpath:static/css
      - classpath:css
  mvc:
    static-path-pattern: /**

  http:
    multipart:
      enabled: true
      max-file-size: 50MB
      max-request-size: 50MB

  ## springboot 2.X
  servlet:
    multipart:
      enabled: true
      max-file-size: 50MB
      max-request-size: 50MB

  • -dev.yml
server:
  port: 8089

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/sql_table?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
  thymeleaf:
    cache: false
  jpa:
    database: mysql
    show-sql: true
    hibernate:
      ddl-auto: update
  resources:
    static-locations:  classpath:/templates/,classpath:/static/css,classpath:/static/js,classpath:/static/img,classpath:/static/images,classpath:/static/fonts,classpath:/static/dist,classpath:/view/,classpath:/public,classpath:/resources,classpath:/META-INF/resources
    
mybatis:
  mapper-locations: classpath:mapping/*.xml
  type-aliases-package: nuc.edu.mybatis.entity

logging:
  file:
    name: lab.log
  level:
#    root: info
    nuc.edu.mybatis.Dao: DEBUG
    # springboot 1.X
  • 持久层
  1. 实体类中一对一关系,不用写@Entity @Id
  2. 持久层和mapping(yml中设置后可以叫mapping否则和dao层结构一致)中的名字一样。
  3. 其中方法名也要一致结构
  • 代码
// 持久层代码
@Repository
public interface AdminDao {

    List<Orders> findAllOrders();
}

// 配置文件  AdminDao.xml代码 
//一对一    一对多关系
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="nuc.edu.mybatis.dao.AdminDao">
    <resultMap id="findAllOrderMap" type="nuc.edu.mybatis.entity.Orders">
        <id property="id" column="id"></id>
        <result property="user_id" column="user_id"></result>
        <result property="number" column="number"></result>
        <result property="status" column="status"></result>
        <result property="creat_time" column="creat_time"></result>
        <association property="user" column="user_id" javaType="nuc.edu.mybatis.entity.User">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="password" column="password"></result>
            <result property="email" column="email"></result>
        </association>
        <collection property="orderdetails"  ofType="nuc.edu.mybatis.entity.OrderDetail">
            <id property="id" column="id"></id>
            <result property="orders_id" column="orders_id"></result>
            <result property="items_id" column="items_id"></result>
            <result property="items_num" column="items_num"></result>
            <association property="goods" column="items_id" javaType="nuc.edu.mybatis.entity.Goods">
                <id property="id" column="id"></id>
                <result column="name" property="name"></result>
                <result column="price" property="price"></result>
                <result column="pic" property="pic"></result>
            </association>
        </collection>
    </resultMap>
    <select id="findAllOrders" resultMap="findAllOrderMap">
        SELECT
        orders_id,
		number,
        creat_time,
        items_num,
        username,
        name,
        price
        FROM
        user,
        orders,
        orderdetail,
        items
        where orders.status =1
        and orders.user_id = user.id
        and orderdetail.items_id = items.id
        and orders.id = orderdetail.orders_id
        and orders.number is NOT NULL
        and orders.number!=""
        ORDER BY orders.id DESC
    </select>
</mapper>

这就是我比较常用的两种方式,共勉!!!!

### Spring Boot 中多表联查实现 CRUD 操作 在 Spring Boot 应用程序中,可以通过 JPA 或 MyBatis 等技术来处理多表之间的关系并实现复杂的查询逻辑。以下是基于 JPA 的方法,展示如何通过实体类定义、Repository 接口以及服务层完成多表联查的增删改查操作。 #### 定义实体类及其关系 假设存在两个表 `Department` 和 `Employee`,其中 `Department` 表与 `Employee` 表是一对多的关系(即一个部门可以有多个员工)。需要分别定义这两个实体类,并设置它们之间的一对多/多对一映射关系。 ```java // Department.java @Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Employee> employees; } // Employee.java @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String firstName; private String lastName; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "department_id") private Department department; } ``` 上述代码片段展示了如何使用注解配置一对多和多对一的关系[^1]。 #### 创建 Repository 接口 为了支持基本的 CRUD 功能,继承自 `JpaRepository<T, ID>` 的接口能够提供默认的方法用于数据访问。如果需要执行更复杂或多条件的查询,则可以在该接口中声明额外的方法或者利用 JPQL 查询语句。 ```java // DepartmentRepository.java @Repository public interface DepartmentRepository extends JpaRepository<Department, Long> {} // EmployeeRepository.java @Repository public interface EmployeeRepository extends JpaRepository<Employee, Long>, QueryByExampleExecutor<Employee> {} ``` 这里提到的 `QueryByExampleExecutor` 是一种灵活的方式来构建动态查询条件。 #### 编写 Service 层业务逻辑 Service 类负责封装具体的业务流程,在此过程中调用相应的 repository 方法获取所需的数据资源。 ```java @Service @Transactional public class DepartmentService { @Autowired private DepartmentRepository departmentRepository; public Optional<Department> findById(Long id){ return departmentRepository.findById(id); } public void save(Department department){ departmentRepository.save(department); } // 更多功能... } @Service @Transactional public class EmployeeService { @Autowired private EmployeeRepository employeeRepository; public List<Employee> findByLastName(String lastName){ return employeeRepository.findByLastName(lastName); } public void deleteById(Long id){ employeeRepository.deleteById(id); } // 更多功能... } ``` 以上示例说明了怎样在一个 service 方法内部保存新记录或将已存在的对象更新至数据库中[^2]。 #### 控制器 Controller 配置 RESTful API 最后一步就是设计控制器暴露 HTTP 请求端点给前端或其他客户端消费这些功能。 ```java @RestController @RequestMapping("/departments") public class DepartmentController { @Autowired private DepartmentService departmentService; @GetMapping("/{id}") public ResponseEntity<?> getDepartment(@PathVariable(value="id")Long id){ Optional<Department> deptOpt=departmentService.findById(id); if(!deptOpt.isPresent())return new ResponseEntity<>(HttpStatus.NOT_FOUND); return new ResponseEntity<>(deptOpt.get(), HttpStatus.OK); } @PostMapping("/") public ResponseEntity<?> addNewDepartment(@RequestBody Department department){ try{ this.departmentService.save(department); return new ResponseEntity<>(department, HttpStatus.CREATED); }catch(Exception e){ return new ResponseEntity<>("Error while saving the record.", HttpStatus.INTERNAL_SERVER_ERROR); } } } ``` 综上所述,借助于 Spring Data JPA 可以轻松地管理多张表格间相互作用的同时保持良好的可维护性和扩展性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值