JPA

1.引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>mysql</groupId>
  7. <artifactId>mysql-connector-java</artifactId>
  8. <scope>runtime</scope>
  9. </dependency>

2.配置数据源

  1. server:
  2. port: 8090
  3. spring:
  4. datasource:
  5. url: jdbc:mysql://localhost:3306/qq?characterEncoding=utf8&serverTimezone=Asia/Shanghai
  6. username: root
  7. password: cy414ljh212,,,
  8. jpa:
  9. #自动创建|更新|验证数据库表结构
  10. hibernate:
  11. ddl-auto: update
  12. #设置数据库引擎为InnoDB
  13. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
  14. #打印sql语句,方便调试
  15. show-sql: true

service层(控制逻辑类
注入仓库,调用增删改查接口)

package com.duing.service;

import com.duing.bean.Guest;
import com.duing.repository.GuestRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GuestServiceImpl implements GuestService{

    @Autowired
    private GuestRepository guestRepository;

    @Override
    public List<Guest> list() {

        return guestRepository.findAll();

    }
}

实体类(实现序列化 注解@Entit y
声明数据库的主键和列
@GeneratedValue|@Id @Column )

package com.duing.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Guest implements Serializable {
    @Column
    private String name;
    @Column
    private String role;
    @Id
    private Long id;

}

仓库(创建数据仓库接口类 继承jpa仓库 拥有通用数据接口

package com.duing.repository;

import com.duing.bean.Guest;
import org.springframework.data.jpa.repository.JpaRepository;

public interface GuestRepository extends JpaRepository<Guest,Long> {
}

image.png

image.png

Mybatis

1.引入依赖

                <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

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

实体类

package com.duing.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Guest implements Serializable {
    private String name;
    private String role;
    private Long id;

}

service层

package com.duing.service;

import com.duing.mapper.GuestMapper;
import com.duing.model.Guest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GuestServiceImpl implements GuestService{

    @Autowired
    private GuestMapper guestMapper;

    @Override
    public List<Guest> list() {
        return guestMapper.getGuests();
    }

}

方式一
配置数据源

server:
  port: 8090

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/qq?characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: cy414ljh212,,,

mybatis:
  config-location: classpath:mybatis-config.xml

image.png
mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <package name="com.duing.model"/>
    </typeAliases>
    <mappers>
        <mapper resource="mybatis/mapper/GuestMapper.xml"/>
    </mappers>
</configuration>

GuestMapper.java

package com.duing.mapper;

import com.duing.model.Guest;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface GuestMapper {

    List<Guest> getGuests();
}

GuestMapper.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="com.duing.mapper.GuestMapper">

    <select id="getGuests" resultType="com.duing.model.Guest">
        select name,role from guest
    </select>

</mapper>

方式二
不使用mybatis-config.xml,application.yml改为

server:
  port: 8090

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/qq?characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: cy414ljh212,,,

mybatis:
    mapper-locations: classpath*:/mybatis/mapper/*.xml
    type-aliases-package: com.duing.model

注解方式:
在启动类上增加对mapper的包扫描注解 @MapperScan 如果不使用@MapperScan注解,还可以在每个 mapper 接口类上加上 @Mapper 这个注解(不推荐)
不需要GuestMapper.xml等额外的文件

package com.duing.mapper;

import com.duing.model.Guest;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface GuestMapper {

    @Select("select * from guest")
    List<Guest> getGuests();
}
package com.duing;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.duing.mapper")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
server:
  port: 8090

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/qq?characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: cy414ljh212,,,

Mybatis整合之tk.mybatis插件

引入依赖

                <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

入口类的由mybatis提供的@MapperScan(“com.duing.mapper”)改为tk提供的@MapperScan(“com.duing.tk.mapper”)
com.duing.tk.mapper.TkGuestMapper

package com.duing.tk.mapper;

import com.duing.model.Guest;
import tk.mybatis.mapper.common.Mapper;

public interface TkGuestMapper extends Mapper<Guest> {

}

service

package com.duing.service;

import com.duing.mapper.GuestMapper;
import com.duing.model.Guest;
import com.duing.tk.mapper.TkGuestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GuestServiceImpl implements GuestService{

    @Autowired
    private TkGuestMapper tkGuestMapper;

    @Override
    public List<Guest> list() {
        return tkGuestMapper.selectAll();
    }
}

Mybatis整合之Mybatis-Plus工具包

1.引入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

2.入口类(@MapperScan(“com.duing.mapper”))

package com.duing;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.duing.mapper")
public class O4MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(O4MybatisPlusApplication.class, args);
    }
}

GuestMapper继承BaseMapper<泛型(实体类)>

package com.duing.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.duing.model.Guest;

public interface GuestMapper extends BaseMapper<Guest> {
}

GuestService继承IService<泛型(实体类)>

package com.duing.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.duing.model.Guest;

public interface GuestService extends IService<Guest> {
}

GuestServiceImpl要继承ServiceImpl<对应的Mapper,实体类>

package com.duing.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.duing.mapper.GuestMapper;
import com.duing.model.Guest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GuestServiceImpl extends ServiceImpl<GuestMapper,Guest> implements GuestService{
}

Controller就可以调用service继承一些东西后自带的方法了

Mybatis-多数据源整合及事务

多数据源的使用:
1.注释掉入口类上的@MapperScan注解
2.在application.properties / yml中配置多数据源连接信息

spring:
  datasource:
    db1:
      jdbc-url: jdbc:mysql://localhost:3306/qq?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      username: root
      password: cy414ljh212,,,
    db2:
      jdbc-url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      username: root
      password: cy414ljh212,,,

3.自定义数据源加载类

package com.duing.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DBConfig {

    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }
}

4.配置SqlSessionFactory和SqlSessionTemplate(db1为例,db2类似)

package com.duing.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.duing.mapper",sqlSessionFactoryRef = "sqlSessionFactory1")
public class DBOneConfig {

    @Autowired
    @Qualifier("db1")
    private DataSource dataSource;

    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception{
        SqlSessionTemplate sqlSessionTemplate=new SqlSessionTemplate(sqlSessionFactory1());
        return sqlSessionTemplate;
    }

}

image.png

image.png
通过@Transactional注解我们可以实现事务,我们所要写的只是具体逻辑部分,其他部分框架已经帮我们封装执行了。
例如,我们在Controller里面写上这样一个方法

@Transactional
@PostMapping
public String add(Guest guest){
    guestService.save(guest);
    int i=1/0;//这句话是一定会报错的
    return "redirect:/guest";
}

我们添加了事务相关注解,所以当执行到第五行报错,之前执行的保存会回滚,并不会在数据库中插入新数据;如果不开启事务,执行到第五行报错时,前面的操作不会回滚,新数据会插入成功。