Bota de primavera 使用 MongoDB

Para instalar MongoDB en una máquina virtual, consulte "Instalación de MongoDB4 en CentOS7"

El IDE que utilizo es STS4, puedes elegir según tus propios hábitos.

La clave es agregar pom.xml:


<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-mongodb</artifactId>

</dependency>

Agregue application.properties:

spring.data.mongodb.uri=mongodb://用户名:密码@IP:PORT/数据库

Clase de entidad


@Document(collection  = "test_goods")

publicclass GoodsEntity implements Serializable {

    privatestaticfinallongserialVersionUID = -805486477824888750L;

    @Id

    private String id;

    private String goodsName;

    privatelongcategoryId;

    privateintgoodsStatus;

    private String labels;

//省略get、set方法

}

No se explica nada más, lo puedes entender de un vistazo, aquí debemos prestar atención al campo id.

Con la configuración anterior y la anotación @Id, cuando creamos un nuevo documento, no se requieren configuraciones adicionales, y se generará automáticamente una clave principal como se muestra a continuación:

Bota de primavera 使用 MongoDB

Esta es una clave primaria del tipo ObjectId llamada "_id", una cadena de tipo BSON de 12 bytes.

4 bytes son la marca de tiempo de UNIX, 3 bytes son el servidor MongoDB, 2 bytes son el proceso de generación del ID y 3 bytes son los números aleatorios.

La ventaja de esto es que es fácil de distribuir. Y, debido a que id contiene una marca de tiempo, naturalmente lleva el tiempo de creación. Podemos pasar


ObjectId id = new ObjectId(entity.getId());

System.out.println(id.getDate());

Obtén el tiempo de creación.

Por supuesto, si usamos MongoDB como un complemento de la base de datos tradicional, si aún queremos almacenar la ID en la base de datos en MongoDB en el sistema, elimine la anotación del campo de identificación y configure el campo de ID al procesar.

Dao


@Component

publicclass GoodsDao {

    @Autowired

    private MongoTemplate mongoTemplate;

    /**

     * 新建

     *

     * @param entity

     * @return

     */

    public GoodsEntity add(GoodsEntity entity) {

        returnmongoTemplate.save(entity);

    }

    /**

     * 根据ID修改

     *

     * @param entity

     * @return

     */

    public UpdateResult upd(GoodsEntity entity) {

        Query query = new Query(Criteria.where("id").is(entity.getId()));

        Update update = new Update().set("goodsName", entity.getGoodsName()).set("categoryId", entity.getCategoryId())

                .set("goodsStatus", entity.getGoodsStatus()).set("labels", entity.getLabels());

        returnmongoTemplate.updateFirst(query, update, GoodsEntity.class);

    }

    /**

     * 根据ID删除

     *

     * @param id

     * @return

     */

    public DeleteResult delById(longid) {

        Query query = new Query(Criteria.where("id").is(id));

        returnmongoTemplate.remove(query,  GoodsEntity.class);

    }

    /**

     * 根据主键获取详情

     *

     * @param id

     * @return

     */

    public GoodsEntity getById(longid) {

        Query query = new Query(Criteria.where("id").is(id));

        GoodsEntity entity = mongoTemplate.findOne(query, GoodsEntity.class);

        returnentity;

    }

    /**

     * 列出所有记录

     *

     * @return

     */

    public List<GoodsEntity> listAll() {

        List<GoodsEntity> entities = mongoTemplate.find(new Query(), GoodsEntity.class);

        returnentities;

    }

    /**

     * 根据某字段使用正则表达式模糊查询,且分页、ID倒序

     *

     * @param label

     * @param pageNumber

     * @param pageSize

     * @return

     */

    public List<GoodsEntity>  queryPageByLabel(String label, intpageNumber, intpageSize) {

        // 完全匹配

        // Pattern pattern =  Pattern.compile("^" + label + "$",

        // Pattern.CASE_INSENSITIVE);

        // 右匹配

        // Pattern pattern =  Pattern.compile("^.*\"+label+\"$",

        // Pattern.CASE_INSENSITIVE);

        // 左匹配

        // Pattern pattern = Pattern.compile("^\"+label+\".*$",

        // Pattern.CASE_INSENSITIVE);

        // 模糊匹配

        Pattern pattern = Pattern.compile("^.*" + MongoDBUtils.escapeExprSpecialWord(label) + ".*$",

                Pattern.CASE_INSENSITIVE);

        Query query = new Query(Criteria.where("labels").regex(pattern));

        // ID倒序

        query.with(new Sort(Sort.Direction.DESC, "id"));

        // 分页

        PageRequest pageableRequest = PageRequest.of(pageNumber, pageSize);

        query.with(pageableRequest);

        returnmongoTemplate.find(query,  GoodsEntity.class);

    }

    /**

     * 多查询条件,分页,ID倒序

     *

     * @param entity

     * @param pageNumber

     * @param pageSize

     * @return

     */

    public List<GoodsEntity>  queryPage(GoodsEntity entity, intpageNumber, intpageSize) {

        Criteria criteria = new Criteria();

        if (!StringUtils.isEmpty(entity.getGoodsName())) {

            Pattern pattern = Pattern.compile("^.*" + entity.getGoodsName() + ".*$", Pattern.CASE_INSENSITIVE);

            criteria.and("goodsName").regex(pattern);

        }

        if (!StringUtils.isEmpty(entity.getLabels())) {

            Pattern pattern = Pattern.compile("^.*" + entity.getLabels() + ".*$", Pattern.CASE_INSENSITIVE);

            criteria.and("labels").regex(pattern);

        }

        if (entity.getCategoryId() > 0) {

            criteria.and("categoryId").is(entity.getCategoryId());

        }

        if (entity.getGoodsStatus() > 0) {

            criteria.and("goodsStatus").is(entity.getGoodsStatus());

        }

        Query query = new Query(criteria);

        // 分页&ID倒序

        PageRequest pageableRequest = PageRequest.of(pageNumber, pageSize, Sort.Direction.DESC, "id");

        query.with(pageableRequest);

        returnmongoTemplate.find(query,  GoodsEntity.class);

    }

}

Personalmente, creo que la mayoría de los requisitos están básicamente cubiertos y no explicaré el código en detalle.

Lo principal a tener en cuenta es que no usé ObjectId esta vez, sino el ID de la base de datos, por lo que el ID de la entidad aquí es largo.

prueba


@RunWith(SpringRunner.class)

@SpringBootTest

publicclass GoodsDaoTest {

    @Autowired

    private GoodsDao goodsDao;

    @Test

    publicvoid add() {

        GoodsEntity entity = new GoodsEntity();

        entity.setId(3); // 如果使用ObjectId,就不需要额外处理ID字段了。

        entity.setCategoryId(5);

        entity.setGoodsName("测试商品E");

        entity.setGoodsStatus(1);

        entity.setLabels("a,b,c,*,d");

        GoodsEntity newEntity = goodsDao.add(entity);

        JsonFormaterUtil.printFromObj(newEntity);

    }

    @Test

    publicvoid upd() {

        GoodsEntity entity = goodsDao.getById(1);

        entity.setLabels("a,b,c,d");

        JsonFormaterUtil.printFromObj(goodsDao.upd(entity));

    }

    @Test

    publicvoid del() {

        JsonFormaterUtil.printFromObj(goodsDao.delById(3));

    }

    @Test

    publicvoid getById() {

        JsonFormaterUtil.printFromObj(goodsDao.getById(1));

    }

    @Test

    publicvoid listAll() {

        JsonFormaterUtil.printFromObj(goodsDao.listAll());

    }

    @Test

    publicvoid queryByLabel() {

        JsonFormaterUtil.printFromObj(goodsDao.queryPageByLabel("*", 0, 2));

    }

    @Test

    publicvoid queryPage() {

        GoodsEntity entity = new GoodsEntity();

        // entity.setCategoryId(5);

        entity.setGoodsName("测试商品");

        // entity.setGoodsStatus(1);

        // entity.setLabels("a,b,c");

        JsonFormaterUtil.printFromObj(goodsDao.queryPage(entity, 0, 10));

    }

}

nada que decir.

Configuración del registro
Debido a que personalmente me gusta imprimir las declaraciones de las operaciones de la base de datos en la consola, se ha modificado la configuración del registro.

Spring Boot usa logback. Cree un archivo logback.xml en el directorio de recursos con el siguiente contenido:


<?xml version="1.0"  encoding="UTF-8"?>

<configuration debug="false">

    <!--定义日志文件的存储绝对路径-->

    <property name="LOG_HOME"  value="d:/" />

    <!-- 控制台输出 -->

    <appender name="STDOUT"

        class="ch.qos.logback.core.ConsoleAppender">

        <encoder

            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level  %logger{50} : %n%msg%n

            </pattern>

        </encoder>

    </appender>

    <!-- 按照每天生成日志文件 -->

    <appender name="FILE"

        class="ch.qos.logback.core.rolling.RollingFileAppender">

        <rollingPolicy

            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!--日志文件输出的文件名 -->

            <FileNamePattern>${LOG_HOME}/mongodbdemo.log.%d{yyyy-MM-dd}.log

            </FileNamePattern>

            <!--日志文件保留天数 -->

            <MaxHistory>30</MaxHistory>

        </rollingPolicy>

        <encoder

            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]  %-5level %logger{50} :

                %msg%n

            </pattern>

        </encoder>

        <!--日志文件最大的大小 -->

        <triggeringPolicy

            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

            <MaxFileSize>10MB</MaxFileSize>

        </triggeringPolicy>

    </appender>

    <!-- 日志输出级别 -->

    <root level="ERROR">

        <appender-ref ref="STDOUT"  />

        <appender-ref ref="FILE"  />

    </root>

    <!-- MongoDB日志输出 -->

    <logger

        name="org.springframework.data.mongodb.core.MongoTemplate"

        level="DEBUG"  additivity="false">

        <appender-ref ref="STDOUT"  />

    </logger>

</configuration>

El punto clave es configurar la salida del registro de MongoDB, donde el nombre es la clase de salida del registro, y el nivel está configurado para depurar para generar las declaraciones ejecutadas, similar a:


find using query: { "goodsName"  : { "$regex" : "^.*测试商品.*$",  "$options" : "i" } } fields: Document{{}} for class:  class org.leo.mongodb.demo.entity.GoodsEntity in collection: test_goods

Y aditividad = "falso" se debe a que si no lo agrega, el registro anterior se imprimirá dos veces en la consola.

Al realizar
consultas a través de expresiones regulares, se encontrarán algunos caracteres especiales (*,?, Etc.), que deben escaparse. El código es el siguiente:


publicclass MongoDBUtils {

    privatestaticfinal String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };

    /**

     * regex对输入特殊字符转义

     *

     * @param keyword

     * @return

     */

    publicstatic String escapeExprSpecialWord(String keyword) {

        if (!StringUtils.isEmpty(keyword)) {

            for (String key : fbsArr) {

                if (keyword.contains(key)) {

                    keyword = keyword.replace(key, "\\" + key);

                }

            }

        }

        returnkeyword;

    }

}

índice:


db.getCollection("test_goods").createIndex({  "categoryId": 1 }, { "name":  "idx_goods_categoryid" })

Cree un índice para categoryId, donde 1 de {"categoryId": 1} representa la creación en orden ascendente y -1 representa el orden descendente.

Cree un índice compuesto de la siguiente manera:


db.getCollection("test_goods").createIndex({ "categoryId": 1,  "goodsStatus": -1 })

Establezca el índice único de la siguiente manera:


db.getCollection("test_goods").createIndex({  "categoryId": 1}, {  "unique": true })

Supongo que te gusta

Origin blog.51cto.com/15067227/2603603
Recomendado
Clasificación