SpringBoot - 6, accès aux données

teneur

1、SQL

1.1. Configuration automatique de la source de données - HikariDataSource

1.1.1, importer des dépendances

1.1.2. Classes configurées automatiquement

1.1.3. Modifier les éléments de configuration

1.1.4. Essai

2. Utiliser la source de données Druid

2.1. Personnalisation

2.1.1, créer une source de données

2.2. Fonction de la page de surveillance 

2.2.1. StatViewServlet active la fonction de page de surveillance et le pare-feu

2.2.2, configurer WebStatFilter

2.3. Utilisez la méthode de démarrage officielle

2.3.1. Présentation des dépendances de démarrage

2.3.2, configurer dans application.yaml

3. Intégrez les opérations MyBatis

3.1. Présentation du démarreur

3.2, mode configuration

3.3. Mode d'annotation

3.4, mode mixte


1、SQL

1.1. Configuration automatique de la source de données - HikariDataSource

1.1.1, importer des dépendances

mysql version SpringBoot a été défini

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

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

Si vous souhaitez modifier la version du pilote, vous pouvez définir la version directement ci-dessous (principe de dépendance le plus proche de maven)

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

Ou définissez la version dans les propriétés de pom.xml

    <properties>
        <mysql.version>5.1.38</mysql.version>
    </properties>

1.1.2. Classes configurées automatiquement

  • DataSourceAutoConfiguration : Configuration automatique des sources de données

    • Modifier la configuration liée à la source de données : spring.datasource

    • La configuration du pool de connexion à la base de données est configurée automatiquement lorsqu'il n'y a pas de DataSource dans le conteneur.

    • Le pool de connexion configuré sous-jacent est : HikariDataSource

  • DataSourceTransactionManagerAutoConfiguration : configuration automatique du gestionnaire de transactions

  • JdbcTemplateAutoConfiguration : la configuration automatique de JdbcTemplate, qui peut être utilisée pour crud la base de données

    • Vous pouvez modifier cet élément de configuration @ConfigurationProperties(prefix = "spring.jdbc"**) pour modifier JdbcTemplate

    • @Bean@Primary JdbcTemplate ; il y a ce composant dans le conteneur
  • JndiDataSourceAutoConfiguration : configuration automatique de jndi

  • XADataSourceAutoConfiguration : lié aux transactions distribuées

1.1.3. Modifier les éléments de configuration

Modifier les éléments de configuration dans application.yaml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&useSSL=false
    username: root
    password: zyj123
    driver-class-name: com.mysql.jdbc.Driver

1.1.4. Essai

@SpringBootTest
class Boot05WebAdminApplicationTests {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Test
    void contextLoads() {
        Long aLong = jdbcTemplate.queryForObject("select count(*) from stu", Long.class);
        System.out.println(aLong);
    }

}

2. Utiliser la source de données Druid

Adresse officielle du github de Druid : druid

Deux façons d'intégrer des technologies tierces

  • Personnaliser
  • trouver démarreur

2.1. Personnalisation

2.1.1, créer une source de données

① Introduire des dépendances

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

② Définir les propriétés pertinentes de la source de données

@Configuration
public class MyDataSourceConfig {

    // 默认的自动配置是判断容器中没有才会自动配置 @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
    @Bean
    @ConfigurationProperties("spring.datasource") //设置与application.yaml中的属性进行绑定
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();


        return druidDataSource;
    }

}

application.yaml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&useSSL=false
    username: root
    password: zyj123
    driver-class-name: com.mysql.jdbc.Driver
  jdbc:
    template:
      query-timeout: 3 #设置查询超时的实践(单位:秒)

2.2. Fonction de la page de surveillance 

Page d'accueil de la page de surveillance : http://localhost:8080/druid/index.html 

2.2.1. StatViewServlet active la fonction de page de surveillance et le pare-feu

Document officiel (activer la fonction de page de surveillance) : configuration_StatViewServlet configuration · alibaba/druid Wiki · GitHub 

Documentation officielle (pare-feu) : Configuration de wallfilter · Wiki alibaba/druid · GitHub

Les utilisations de StatViewServlet incluent :

  • Fournit une page html pour surveiller l'affichage des informations
  • API JSON fournissant des informations de surveillance

Définir StatViewServlet

@Configuration
public class MyDataSourceConfig {

    // 默认的自动配置是判断容器中没有才会自动配置 @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
    @Bean
    @ConfigurationProperties("spring.datasource") //设置与application.yaml中的属性进行绑定
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        // stat:加入监控功能
        // wall:防火墙
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }

    // 配置Druid的监控页功能
    @Bean
    public ServletRegistrationBean StatViewServlet(){
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        return statViewServletServletRegistrationBean;
    }

}

2.2.2, configurer WebStatFilter

Documentation officielle : https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter

@Configuration
public class MyDataSourceConfig {

    // 默认的自动配置是判断容器中没有才会自动配置 @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
    @Bean
    @ConfigurationProperties("spring.datasource") //设置与application.yaml中的属性进行绑定
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        // 加入监控功能
        druidDataSource.setFilters("stat");
        return druidDataSource;
    }

    // 配置Druid的监控页功能
    @Bean
    public ServletRegistrationBean StatViewServlet(){
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        return statViewServletServletRegistrationBean;
    }

    // WebStatFilter 用于采集web-jdbc关联监控的数据。
    @Bean
    public FilterRegistrationBean WebStatFilter(){
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); //不拦截的路径
        return filterRegistrationBean;
    }

}

2.3. Utilisez la méthode de démarrage officielle

Documentation officielle : https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

2.3.1. Présentation des dépendances de démarrage

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2.3.2, configurer dans application.yaml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&useSSL=false
    username: root
    password: zyj123
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.zyj.boot05webadmin.*  #设置spring监控的包

      filters: stat,wall  #底层开启功能,stat(sql监控),wall(防火墙)

      stat-view-servlet:  #配置监控页功能
        enabled: true  #开启监控页功能
        login-username: admin  #设置监控页的登录名
        login-password: 123456   #设置监控页的密码
        reset-enable: false  #是否有重置按钮

      web-stat-filter:  #监控web
        enabled: true  #开启监控
        url-pattern: /*  #监控的请求
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'  #排除的请求

      filter:
        stat:     #对上面filters里面的stat的详细配置
          enabled: true
          log-slow-sql: true
        wall:
          enabled: true  #开启防火墙

3. Intégrez les opérations MyBatis

Documentation officielle : https://github.com/mybatis

3.1. Présentation du démarreur

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

3.2, mode configuration

  • fichier de configuration globale

  • SqlSessionFactory : configuré automatiquement

  • SqlSession : SqlSessionTemplate configuré automatiquement combiné avec SqlSession

  • @Import(AutoConfiguredMapperScannerRegistrar. classe);

  • Mapper : Tant que l'interface standard de MyBatis sera écrite, @Mapper sera automatiquement scanné dans

① Importer le démarreur officiel mybatis

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

② Écrivez l'interface du mappeur. Annoter avec @Mapper

@Mapper
public interface PersonMapper {

    public Person getPersonById(Long id);

}

③ Écrivez le fichier de mappage sql et liez l'interface du mappeur. PersonMapper.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.zyj.boot05webadmin.mapper.PersonMapper">
    <!-- public Person getPersonById(Long id); -->
    <select id="getPersonById" resultType="com.zyj.boot05webadmin.bean.Person">
        select * from user where id = #{id}
    </select>
</mapper>

④ Spécifiez l'emplacement du fichier de configuration du Mapper dans application.yaml, et précisez les informations du fichier de configuration global (recommandé ; configuré dans mybatis.configuration )

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
    username: root
    password: zyj123
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.zyj.boot05webadmin.*  #设置spring监控的包

      filters: stat,wall,slf4j  #底层开启功能,stat(sql监控),wall(防火墙)

      stat-view-servlet:  #配置监控页功能
        enabled: true  #开启监控页功能
        login-username: admin  #设置监控页的登录名
        login-password: 123456   #设置监控页的密码
        reset-enable: false  #是否有重置按钮

      web-stat-filter:  #监控web
        enabled: true  #开启监控
        url-pattern: /*  #监控的请求
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'  #排除的请求

      filter:
        stat:     #对上面filters里面的stat的详细配置
          enabled: true
          log-slow-sql: true
        wall:
          enabled: true  #开启防火墙

#配置mybatis
mybatis:
  #config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  configuration:   #设置了configuration后就不能写上面的config-location,否则会引起冲突
    #可以不写全局;配置文件,所有全局配置文件的配置都放在configuration配置项中即可
    map-underscore-to-camel-case: true  #设置根据驼峰命名自动装配

3.3. Mode d'annotation

Utilisation des annotations dans le mappeur 

Remarque : utilisez @MapperScan("com.zyj.admin.mapper") pour simplifier la classe de programme principale, et d'autres interfaces peuvent être marquées sans l'annotation @Mapper 

@Mapper
public interface CityMapper {

    @Select("select * from city where id = #{id}")
    public City getById(Long id);

    @Insert("insert into city(`name`, `state`, `country`) values(#{name}, #{state}, #{country})")
    @Options(useGeneratedKeys = true, keyProperty = "id")  //设置id为自增主键
    public void insert(City city);

}

3.4, mode mixte

le mappeur est configuré à l'aide d'annotations et de xml en même temps 

@Mapper
public interface CityMapper {

    @Select("select * from city where id = #{id}")
    public City getById(Long id);

    public void insert(City city);

}

4. Intégrez MyBatis-Plus pour compléter le CRUD

Site Web : MonBatis-Plus

Il est recommandé d'installer le plugin MybatisX

4.0, travail de préparation

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")  // 设置该实体类对应的表名
public class Users {

    private Long id;
    private String name;
    private Integer age;
    private String email;

}

4.1. Intégrer MyBatis-Plus

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

Paramétrage automatique :

  • Classe de configuration MybatisPlusAutoConfiguration, liaison d'élément de configuration MybatisPlusProperties. mybatis-plus : xxx est la personnalisation de mybatis-plus
  • SqlSessionFactory est automatiquement configuré. La couche inférieure est la source de données par défaut dans le conteneur
  • mapperLocations sont automatiquement configurés. Il existe des valeurs par défaut. classpath*:/mapper/**/*.xml ; tous les xml sous n'importe quel chemin sous tous les dossiers de mappeur sous le classpath de n'importe quel package sont des fichiers de mappage sql. Il est recommandé que le fichier de mappage sql soit placé sous mappeur à l'avenir
  • Le SqlSessionTemplate est également configuré automatiquement dans le conteneur
  • Les interfaces marquées par @Mapper seront également scannées automatiquement ; il est recommandé de scanner directement @MapperScan("com.atguigu.admin.mapper") par lots

avantage:

  • Nous avons seulement besoin que notre Mapper hérite de BaseMapper pour avoir des capacités crud

4.2. Fonction CURD

4.2.1. Ajouter un mappeur, un service et sa classe d'implémentation 

UsersMapper

@Mapper
public interface UsersMapper extends BaseMapper<Users> {
}

UsersService

public interface UsersService extends IService<Users> {
}

UsersServiceImpl 

@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {
}

4.2.2. Ajouter une classe de configuration pour activer les plugins de pagination

@Configuration
public class MyBatisConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 创建分页拦截器
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置请求的页面大于最大页后操作,true调回首页,false继续请求,默认为false
        paginationInnerInterceptor.setOverflow(true);
        // 设置最大单页限制数量,默认500条,-1不限制
        paginationInnerInterceptor.setMaxLimit(500L);
        // 将分页插件放入
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        return mybatisPlusInterceptor;
    }

}

4.2.3, responsable du traitement et formulaire

TableController

@Controller
public class TableController {

    @Autowired
    UsersService usersService;

    @GetMapping("/dynamic_table")
    public String dynamic_table(@RequestParam(value = "pn", defaultValue = "1")Integer pn, Model model){
        //表格内容的遍历
        //List<User> users = Arrays.asList(new User("zhangsan", "123456"),
        //        new User("lisi", "123444"),
        //        new User("haha", "aaaaa"),
        //        new User("hehe ", "aaddd"));
        //model.addAttribute("users",users);


        //List<Users> list = usersService.list();
        list.forEach(System.out::println);
        //model.addAttribute("userss", list);

        // 分页查询数据
        Page<Users> usersPage = new Page<>(pn, 2);
        // 分页查询的结果
        Page<Users> page = usersService.page(usersPage, null);
        model.addAttribute("page", page);
        return "table/dynamic_table";
    }

    @GetMapping("/user/delete/{id}")
    public String deleteUser(@PathVariable("id") Long id,
                             @RequestParam(value = "pn",defaultValue = "1") Integer pn,
                             RedirectAttributes ra){
        usersService.removeById(id);
        ra.addAttribute("pn", pn);
        return "redirect:/dynamic_table";
    }
}

formulaire

<table class="display table table-bordered table-striped" id="dynamic-table">
                                    <thead>
                                    <tr>
                                        <th>#</th>
                                        <th>id</th>
                                        <th>name</th>
                                        <th>age</th>
                                        <th>email</th>
                                        <th>操作</th>
                                    </tr>
                                    </thead>
                                    <tbody role="alert" aria-live="polite" aria-relevant="all">
                                    <tr class="gradeX odd" th:each="users,stat:${page.records}">
                                        <td th:text="${stat.count}"></td>
                                        <td th:text="${users.id}">id</td>
                                        <td th:text="${users.name}"></td>
                                        <td th:text="${users.age}"></td>
                                        <td th:text="${users.email}"></td>
                                        <td>
                                            <a th:href="@{user/delete/{id}(id=${users.id},pn=${page.current})}" class="btn btn-danger btn-sm" type="button">删除</a>
                                        </td>
                                    </tr>
                                </table>

                                <div class="row-fluid">
                                    <div class="span6">
                                        <div class="dataTables_info" id="dynamic-table_info">
                                            当前第 [[${page.current}]] 页  总计 [[${page.pages}]] 页  共 [[${page.total}]] 条记录
                                        </div>
                                    </div>
                                    <div class="span6">
                                        <div class="dataTables_paginate paging_bootstrap pagination">
                                            <ul>
                                                <li class="prev disabled"><a href="#">← 前一页</a></li>
                                                <li th:class="num==page.current?'active':''" th:each="num:${#numbers.sequence(1,page.pages)}">
                                                    <a th:href="@{/dynamic_table(pn=${num})}">[[${num}]]</a>
                                                </li>
                                                <li class="next disabled"><a href="#">下一页 → </a></li>
                                            </ul>
                                        </div>
                                    </div>

                                </div>

Je suppose que tu aimes

Origine blog.csdn.net/Mr_zhangyj/article/details/124000770
conseillé
Classement