spring boot 配置mybatis

4 篇文章 0 订阅
4 篇文章 0 订阅

今天搞一搞spring boot的mybatis的整合,首先搞一个简单的springboot项目:搭建简单的spring boot

然后创建数据库中对应表的实体类:我的表名user_demo(注意mysql在linux是区分大小写的)

创建domain:UserDemo

package com.shuguolili.domain;

import lombok.Data;

/**
 * @Classname UserDemo
 * @Description TODO
 * @Date 2019/4/23 12:57
 * @Created by lky
 */
@Data
public class UserDemo {

    private Integer id;

    private String name;

    private Integer age;

}

创建到层:UserDemoMapper

package com.shuguolili.mapper;

import com.shuguolili.domain.UserDemo;
import org.springframework.stereotype.Repository;

/**
 * @Classname UserDemoMapper
 * @Description TODO
 * @Date 2019/4/23 13:00
 * @Created by lky
 */
@Repository
public interface UserDemoMapper {

   void insert(UserDemo demo);
}

创建service层接口:UserDemoService

package com.shuguolili.service;

import com.shuguolili.domain.UserDemo;

/**
 * @Classname UserDemoService
 * @Description TODO
 * @Date 2019/4/23 13:01
 * @Created by lky
 */
public interface UserDemoService {

    void insert(UserDemo demo);
}

创建service层实现类:UserDemoServiceImpl

package com.shuguolili.service.impl;

import com.shuguolili.domain.UserDemo;
import com.shuguolili.mapper.UserDemoMapper;
import com.shuguolili.service.UserDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @Classname UserDemoServiceImpl
 * @Description TODO
 * @Date 2019/4/23 13:01
 * @Created by lky
 */
@Service
public class UserDemoServiceImpl implements UserDemoService {

    @Autowired
    private UserDemoMapper userDemoMapper;

    @Transactional
    @Override
    public void insert(UserDemo demo) {
        userDemoMapper.insert(demo);
    }
}

创建controller:DemoOne 

简单的向数据库插入一条数据,然后返回给页面访问成功。

package com.shuguolili.controller;

import com.shuguolili.domain.UserDemo;
import com.shuguolili.service.UserDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Classname DemoOne
 * @Description TODO
 * @Date 2019/4/18 13:53
 * @Created by lky
 */
@Controller
@RequestMapping("/demo")

public class DemoOne {

    @Autowired
    private UserDemoService userDemoService;

    @RequestMapping("/quick")
    @ResponseBody
    public String quick(){

            UserDemo demo = new UserDemo();
            demo.setName("魏大勇");
            demo.setAge(24);
            userDemoService.insert(demo);

        return "springboot -- 访问成功!";
    }
}

创建xml文件:UserDemoMapper.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.shuguolili.mapper.UserDemoMapper">
    <insert id="insert" parameterType="com.shuguolili.domain.UserDemo">
   	 	 insert into user_demo ( name, age )
        values ( #{name,jdbcType=VARCHAR}, #{age,jdbcType=DECIMAL})
    </insert>
</mapper>

接下来的呢都是模块代码,但是我感觉才是比较重要的。

首先向导入maven依赖

        <!--mybatis的依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!--mysql的数据库连接的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

为了方便我使用了下面的还jar。(这不是重点 哈哈哈)

        <!--Springboot web的依赖,方便查看数据-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--lombok 省去domain 的get/set方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
        </dependency>
        <!--ali的json包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

 

然后配置mybatis的配置文件mybatis.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>
    <!-- MyBatis 配置 -->
    <settings>
        <!-- 对在此配置文件下的所有cache 进行全局性开/关设置 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 全局性设置懒加载。如果设为'false',则所有相关联的都会被初始化加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 允许和不允许单条语句返回多个数据集(取决于驱动需求) -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 使用列标签代替列名称。不同的驱动器有不同的作法。参考一下驱动器文档,或者用这两个不同的选项进行测试一下 -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行 -->
        <setting name="useGeneratedKeys" value="false"/>
        <!-- 指定MyBatis 是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,没有嵌套的结果。FULL 将自动映射所有复杂的结果 -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <!-- 配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新 -->
        <setting name="defaultExecutorType" value="BATCH"/>
        <!-- 设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时 -->
        <setting name="defaultStatementTimeout" value="25"/>
        <!--允许在嵌套语句中使用行分界(RowBounds)-->
        <setting name="safeRowBoundsEnabled" value="false"/>
        <!--开启驼峰命名规则自动转换-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。
        默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,
        对相同 SqlSession 的不同调用将不会共享数据。-->
        <setting name="localCacheScope" value="SESSION"/>
        <!--当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,
        多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。-->
        <setting name="jdbcTypeForNull" value="OTHER"/>
        <!--指定哪个对象的方法触发一次延迟加载。-->
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
        <!--指定 MyBatis 增加到日志名称的前缀-->
        <setting name="logPrefix" value="com.shuguolili.domain."/>
    </settings>

    <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql" />
            <!-- 该参数默认为false -->
            <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
            <!-- 和startPage中的pageNum效果一样 -->
            <property name="offsetAsPageNum" value="true" />
            <!-- 该参数默认为false --> <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
            <property name="rowBoundsWithCount" value="true" />
            <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
            <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) -->
            <property name="pageSizeZero" value="true" />
            <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
            <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
            <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
            <property name="reasonable" value="true" />
            <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
            <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
            <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
            <!-- <property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/> -->
        </plugin>
    </plugins>
</configuration>

接着是application.properties文件

spring.datasource.url=jdbc:mysql://数据库地址ip:端口/数据库名
spring.datasource.username=数据库账户
spring.datasource.password=密码
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5


server.tomcat.uri-encoding=UTF-8



mybatis.configLocations= classpath:mybatis/mybatis.xml(mybatis.xml文件的路径)

# mybatis.config= classpath:mybatis-config.xml
mybatis.mapperLocations=classpath:mybatis/sqlMap/*.xml(mapper.xml文件的路径)

ok,启动项目访问,就会发现数据库中多了一条数据了已经。

忘了贴启动类了,原先想启动类没有需要注意的东西。在启动类中加上mapper的扫描包。

@MapperScan("com.shuguolili.memberdeep.mapper")
@SpringBootApplication
public class SpringbootMybatisApplication {

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

}

补充:

上边可以看出除了@SpringBootApplication的注解 还有一个@MapperScan注解里边的值是我们Mapper接口的包路径.

原因是:

我在Mapper上使用的是@Repository注解 ,就需要在启动类添加@MapperScan注解辅助,不然会启动时serviceImpl中的UeserMapper字段对象不能被自动注入而抛异常.

其实还可以通过另外的方式达到效果;

package com.shuguolili.mapper;

import com.shuguolili.domain.UserDemo;
import org.springframework.stereotype.Repository;

/**
 * @Classname UserDemoMapper
 * @Description TODO
 * @Date 2019/4/23 13:00
 * @Created by lky
 */
@Mapper
public interface UserDemoMapper {

   void insert(UserDemo demo);
}

在Mapper中使用@Mapper注解就可以省去启动类SpringbootMybatisApplication的@MapperScan注解的指定扫描包。

原因是:使用Springboot默认会扫描@Mapper注解,而没有默认扫描@Repository注解 。 所以在mapper中使用@Repository注解

需要在启动类中配置Mapper的路径

 

补充:整合druid数据源

这里介绍最简单的,有时间会单独写篇文章:

pom.xml在上边的基础上引入jar包

 <!-- Druid连接池 -->
 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.0</version>
 </dependency>

在application.properties文件中加上配置

#druid数据源配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

还需要创建一个配置类

package com.shuguolili.product.config;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * @program agricultureProducts
 * @description: druid的配置类
 * @author: lky
 * @create: 2019/10/17 09:20
 */

@Configuration
public class DruidConfig {

    //创建druid是注入mysqldatasource
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

}

 

这时启动查看日志

2019-11-15 22:42:11.225  INFO 33010 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-11-15 22:42:11.426  INFO 33010 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-11-15 22:42:11.427  INFO 33010 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Bean with name 'druidDataSource' has been autodetected for JMX exposure
2019-11-15 22:42:11.432  INFO 33010 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'druidDataSource': registering with JMX server as MBean [com.alibaba.druid.pool:name=druidDataSource,type=DruidDataSource]
2019-11-15 22:42:11.475  INFO 33010 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path '/demo'
2019-11-15 22:42:11.479  INFO 33010 --- [           main] c.s.product.ProductsApplication          : Started ProductsApplication in 2.417 seconds (JVM running for 2.928)

上边第三行:

 Located MBean 'druidDataSource':

registering with JMX server as MBean [com.alibaba.druid.pool:name=druidDataSource,type=DruidDataSource]

就是使用druid成功,当然这是简单的使用,还有许多功能。由于篇幅问题,我会再来一篇

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值