乐趣区

关于springboot:如有神助阿里P7大牛把Spring-Boot讲解得如此透彻送你上岸

Hello,明天给各位童鞋们分享 Spring Boot,连忙拿出小本子记下来吧!

Spring Boot 整合 Druid

概述
Druid 是阿里巴巴开源平台上的一个我的项目,整个我的项目由数据库连接池、插件框架和 SQL 解析器组成。该我的项目次要是为了扩大 JDBC 的一些限度,能够让程序员实现一些非凡的需要,比方向密钥服务申请凭证、统计 SQL 信息、SQL 性能收集、SQL 注入查看、SQL 翻译等,程序员能够通过定制来实现本人须要的性能。

Druid 是目前最好的数据库连接池,在性能、性能、扩展性方面,都超过其余数据库连接池,包含 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid 曾经在阿里巴巴部署了超过 600 个利用,通过多年生产环境大规模部署的严苛考验。Druid 是阿里巴巴开发的号称为监控而生的数据库连接池!

引入依赖

在 pom.xml 文件中引入 druid-spring-boot-starter 依赖

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>druid-spring-boot-starter</artifactId>

    <version>1.1.10</version>

</dependency>

引入数据库连贯依赖

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <scope>runtime</scope>

配置 application.yml
在 application.yml 中配置数据库连贯

spring:

  datasource:

url: jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false

    username: root

    password: 123456

    type: com.alibaba.druid.pool.DruidDataSource

    initial-size: 1

    min-idle: 1

    max-active: 20

    test-on-borrow: true

    # MySQL 8.x: com.mysql.cj.jdbc.Driver

    driver-class-name: com.mysql.jdbc.Driver

MySQL 服务应用 docker 容器开启

Spring Boot 整合 tk.mybatis
tk.mybatis 是在 MyBatis 框架的根底上提供了很多工具,让开发更加高效

在 pom.xml 文件中引入 mapper-spring-boot-starter 依赖,该依赖会主动引入 MyBaits 相干依赖

    <groupId>tk.mybatis</groupId>

    <artifactId>mapper-spring-boot-starter</artifactId>

    <version>2.0.2</version>

配置 MyBatis

mybatis:

       type-aliases-package: 实体类的寄存门路,如:com.zysheep.spring.boot.mybatis.entity

    mapper-locations: classpath:mapper/*.xml

创立一个通用的父级接口

次要作用是让 DAO 层的接口继承该接口,以达到应用 tk.mybatis 的目标, 特地留神: 该接口不能被扫描到,否则会出错

package tk.mybatis;

import tk.mybatis.mapper.common.Mapper;

import tk.mybatis.mapper.common.MySqlMapper;

/**

 * 本人的 Mapper

 * @author:zysheep

 * @date:Created in 2020/1/11 22:49

 * @description:${description}

 * @version: ${version}$

 */

public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {

}

Spring Boot 整合 PageHelper

PageHelper 是 Mybatis 的分页插件,反对多数据库、多数据源。能够简化数据库的分页查问操作,整合过程也极其简略,只需引入依赖即可。

在 pom.xml 文件中引入 pagehelper-spring-boot-starter 依赖

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper-spring-boot-starter</artifactId>

    <version>1.2.5</version>

应用 MyBatis 的 Maven 插件生成代码

咱们无需手动编写 实体类、DAO、XML 配置文件,只须要应用 MyBatis 提供的一个 Maven 插件就能够主动生成所需的各种文件便可能满足根本的业务需要,如果业务比较复杂只须要批改相干文件即可。

配置插件

在 pom.xml 文件中减少 mybatis-generator-maven-plugin 插件,configurationFile:主动生成所需的配置文件门路

主动生成的配置

在 src/main/resources/generator/ 目录下创立 generatorConfig.xml

 配置文件:

<?xml version=”1.0″ encoding=”UTF-8″?>

<!DOCTYPE generatorConfiguration

        PUBLIC “-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN”

        “http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd”>

<generatorConfiguration>

    <!– 引入数据库连贯配置 –>

    <properties resource=”jdbc.properties”/>

    <context id=”Mysql” targetRuntime=”MyBatis3Simple” defaultModelType=”flat”>

        <property name=”beginningDelimiter” value=”`”/>

        <property name=”endingDelimiter” value=”`”/>

        <!– 配置 tk.mybatis 插件 –>

        <plugin type=”tk.mybatis.mapper.generator.MapperPlugin”>

            <property name=”mappers” value=”cn.tk.mybatis.MyMapper”/>

        </plugin>

        <!– 配置数据库连贯 –>

        <jdbcConnection

                driverClass=”${jdbc.driverClass}”

                connectionURL=”${jdbc.connectionURL}”

                userId=”${jdbc.username}”

                password=”${jdbc.password}”>

        </jdbcConnection>

        <!– 配置实体类寄存门路 –>

        <javaModelGenerator targetPackage=”cn.panyucable.pojo” targetProject=”src/main/java”/>

        <!– 配置 XML 寄存门路 –>

        <sqlMapGenerator targetPackage=”mapper” targetProject=”src/main/resources”/>

        <!– 配置 DAO 寄存门路 –>

        <javaClientGenerator

                targetPackage=”cn.panyucable.mapper”

                targetProject=”src/main/java”

                type=”XMLMAPPER”/>

        <!– 配置须要指定生成的数据库和表,% 代表所有表 –>

        <table catalog=”panyucable_cn” tableName=”%”>

            <!– mysql 配置 –>

            <generatedKey column=”id” sqlStatement=”Mysql” identity=”true”/>

        </table>

    </context>

</generatorConfiguration>

配置数据源

在 src/main/resources 目录下创立 jdbc.properties

 数据源配置:

# MySQL 8.x: com.mysql.cj.jdbc.Driver

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.connectionURL=jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false

jdbc.username=root

jdbc.password=root

插件主动生成命令

mvn mybatis-generator:generate

测试 MyBatis 操作数据库

应用 tk.mybatis 操作数据库
批改入口类

创立测试类

@RunWith(SpringRunner.class)

@SpringBootTest(classes = HelloSpringBootApplication.class)

@Transactional

@Rollback

public class MyBatisTests {

    /**

     * 注入数据查问接口

     */

    @Autowired

    private TbUserMapper tbUserMapper;

     * 测试插入数据

    @Test

    public void testInsert() {

        // 结构一条测试数据

        TbUser tbUser = new TbUser();

        tbUser.setUsername(“Lusifer”);

        tbUser.setPassword(“123456”);

        tbUser.setPhone(“15888888888”);

        tbUser.setEmail(“topsale@vip.qq.com”);

        tbUser.setCreated(new Date());

        tbUser.setUpdated(new Date());

        // 插入数据

        tbUserMapper.insert(tbUser);

    }

     * 测试删除数据

    public void testDelete() {

        // 结构条件,等同于 DELETE from tb_user WHERE username = ‘Lusifer’

        Example example = new Example(TbUser.class);

        example.createCriteria().andEqualTo(“username”, “Lusifer”);

        // 删除数据

        tbUserMapper.deleteByExample(example);

     * 测试批改数据

    public void testUpdate() {

        // 结构条件

        tbUser.setUsername(“LusiferNew”);

        // 批改数据

        tbUserMapper.updateByExample(tbUser, example);

     * 测试查问汇合

    public void testSelect() {

        List<TbUser> tbUsers = tbUserMapper.selectAll();

        for (TbUser tbUser : tbUsers) {

            System.out.println(tbUser.getUsername());

        }

     * 测试分页查问

    public void testPage() {

        // PageHelper 应用非常简单,只须要设置页码和每页显示笔数即可

        PageHelper.startPage(0, 2);

        // 设置分页查问条件

        PageInfo<TbUser> pageInfo = new PageInfo<>(tbUserMapper.selectByExample(example));

        // 获取查问后果

        List<TbUser> tbUsers = pageInfo.getList();

    // 当前页

    private int pageNum;

    // 每页的数量

    private int pageSize;

    // 当前页的数量

    private int size;

    // 因为 startRow 和 endRow 不罕用,这里说个具体的用法

    // 能够在页面中 ” 显示 startRow 到 endRow 共 size 条数据 ”

    // 以后页面第一个元素在数据库中的行号

    private int startRow;

    // 以后页面最初一个元素在数据库中的行号

    private int endRow;

    // 总记录数

    private long total;

    // 总页数

    private int pages;

    // 后果集

    private List<T> list;

    // 前一页

    private int prePage;

    // 下一页

    private int nextPage;

    // 是否为第一页

    private boolean isFirstPage = false;

    // 是否为最初一页

    private boolean isLastPage = false;

    // 是否有前一页

    private boolean hasPreviousPage = false;

    // 是否有下一页

    private boolean hasNextPage = false;

    // 导航页码数

    private int navigatePages;

    // 所有导航页号

    private int[] navigatepageNums;

    // 导航条上的第一页

    private int navigateFirstPage;

    // 导航条上的最初一页

    private int navigateLastPage;

TkMybatis 的罕用办法介绍

Select

List select(T record);

依据实体中的属性值进行查问,查问条件应用等号

T selectByPrimaryKey(Object key);

依据主键字段进行查问,办法参数必须蕴含残缺的主键属性,查问条件应用等号

List selectAll();

查问全副后果,select(null)办法能达到同样的成果

T selectOne(T record);

依据实体中的属性进行查问,只能有一个返回值,有多个后果是抛出异样,查问条件应用等号

int selectCount(T record);

依据实体中的属性查问总数,查问条件应用等号

Insert

int insert(T record);
保留一个实体,null 的属性也会保留,不会应用数据库默认值
int insertSelective(T record);
保留一个实体,null 的属性不会保留,会应用数据库默认值

Update
int updateByPrimaryKey(T record);

依据主键更新实体全副字段,null 值会被更新

int updateByPrimaryKeySelective(T record);

依据主键更新属性不为 null 的值

Delete

int delete(T record);

依据实体属性作为条件进行删除,查问条件应用等号

int deleteByPrimaryKey(Object key);

依据主键字段进行删除,办法参数必须蕴含残缺的主键属性

Example 办法

List selectByExample(Object example);

依据 Example 条件进行查问

重点: 这个查问反对通过 Example 类指定查问列,通过 selectProperties 办法指定查问列

int selectCountByExample(Object example);

依据 Example 条件进行查问总数

int updateByExample(@Param(“record”) T record, @Param(“example”) Object example);

依据 Example 条件更新实体 record 蕴含的全副属性,null 值会被更新

int updateByExampleSelective(@Param(“record”) T record, @Param(“example”) Object example);

依据 Example 条件更新实体 record 蕴含的不是 null 的属性值

int deleteByExample(Object example);

依据 Example 条件删除数据

Example 应用办法详解

Example 用于增加条件,相当 where 前面的局部

作用:

example

用来放一些去重,排序,分类,分页等信息

criteria

用来传字段参数

罕用的办法及应用阐明:

首先进行初始化:

Example example = new Example(实体类.class);

Example.Criteria criteria = example.createCriteria();

增加升序排列条件,DESC 为降序:

example.setOrderByClause(“ 字段名 ASC”);

去除反复,boolean 型,true 为抉择不反复的记录:

example.setDistinct(false)

增加字段 xxx 为 null 的条件:

criteria.andXxxIsNull

增加字段 xxx 不为 null 的条件:

criteria.andXxxIsNotNull

增加 xxx 字段等于 value 条件:

criteria.andXxxEqualTo(value)

增加 xxx 字段不等于 value 条件:

criteria.andXxxNotEqualTo(value)

增加 xxx 字段大于 value 条件:

criteria.andXxxGreaterThan(value)

增加 xxx 字段大于等于 value 条件:

criteria.andXxxGreaterThanOrEqualTo(value)

增加 xxx 字段小于 value 条件:

criteria.andXxxLessThan(value)

增加 xxx 字段小于等于 value 条件:

criteria.andXxxLessThanOrEqualTo(value)

增加 xxx 字段值在 List<?> 条件:

criteria.andXxxIn(List<?>)

增加 xxx 字段值不在 List<?> 条件:

criteria.andXxxNotIn(List<?>)

增加 xxx 字段值为 value 的含糊查问条件:

criteria.andXxxLike(“%”+value+”%”)

增加 xxx 字段值不为 value 的含糊查问条件:

criteria.andXxxNotLike(“%”+value+”%””)

增加 xxx 字段值在 value1 和 value2 之间条件:

criteria.andXxxBetween(value1,value2)

增加 xxx 字段值不在 value1 和 value2 之间条件:

criteria.andXxxNotBetween(value1,value2)

须要留神的点:

首先要生成实例化及实例对应的 example,而后记住肯定要先初始化;

应用 and 和 or 办法进行判断时,“与”、“或”的逻辑关系分清,避免出现拿数据时呈现反复拿或者逻辑抵触拿不到的状况;

mapper.selectByExample()办法外面应该传入的参数是 example 对象, 而非其余的。

附:残缺的 POM

<?xml version=”1.0″ encoding=”UTF-8″?>

<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

         xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0

退出移动版