今天搞一搞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成功,当然这是简单的使用,还有许多功能。由于篇幅问题,我会再来一篇