SpringBoot之数据访问

本文主要介绍了SpringBoot整合几种常用的数据访问技术。 而这些技术又是企业开发中,比较常见的。

整合JDBC

引入依赖

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
     <!-- 一定要指定版本号,使用spring boot自带的的会有问题 -->
    <version>5.1.19</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

编写配置

application.properties中加入如下配置:

#数据库链接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root

#数据库脚本
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Test
    public void contextLoads() throws SQLException {
        System.out.println(dataSource.getClass());
        System.out.println(dataSource.getConnection());
        System.out.println(jdbcTemplate);
        System.out.println(namedParameterJdbcTemplate);
    }
}

输出

class org.apache.tomcat.jdbc.pool.DataSource
ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@49c8f6e8]]
org.springframework.jdbc.core.JdbcTemplate@6b0615ae
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate@4e73b552

说明:

  • Spring Boot默认使用Tomcat JDBC数据源连接池。
  • 可直接注入dataSource
  • 可直接注入JdbcTemplate
  • 可直接注入NamedParameterJdbcTemplate
  • 执行单元测试的时候,会自动执行指定的数据库脚本。

整合Druid

这里说明一下:Spring Boot默认使用的Tomcat数据库连接池。

引入依赖

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

编写配置

application.properties中,新加入:

#数据库连接池配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
spring.datasource.useGlobalDataSourceStat=true
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

再运行单元测试,输出:

class com.alibaba.druid.pool.DruidDataSource
com.mysql.jdbc.JDBC4Connection@989da1
org.springframework.jdbc.core.JdbcTemplate@31cb96e1
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate@3eed0f5

说明已经配置上个了Druid

配置监控

@Configuration
public class DruidConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

    //1、配置管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin");
        initParams.put("loginPassword", "123");
        initParams.put("allow", "");//默认就是允许所有访问
        initParams.put("deny", "127.0.0.1");
        bean.setInitParameters(initParams);
        return bean;
    }

    //2、配置web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<>();
        initParams.put("exclusions", "*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

启动服务器,访问:http://localhost:8080/druid/login.html 看到:

登录后看到:

整合Spring Data JPA

引入依赖

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

编写配置

在application.properties中加入如下配置:

#数据库链接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root

#控制台输出SQL
spring.jpa.show-sql=true

编写Repository接口

public interface DeptRepository extends JpaRepository<Dept,Long> {
}

只需要继承JpaRepository即可。

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private DeptRepository deptRepository;

    @Test
    public void test(){
        List<Dept> depts = deptRepository.findAll();
        System.out.println(depts);
    }
}

整合MyBatis

引入依赖

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

编写配置

#指定全局配置文件的位置(可选)
mybatis.config-locations=classpath:mybatis/mybatis‐config.xml 
#指定sql映射文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
#指定实体类类型别名所在包的位置
mybatis.type-aliases-package=org.yun.springboot.model

编写DeptMapper接口

@Mapper   //标记一个Mapper接口
public interface DeptMapper {
    List<Dept> findAll();
}

这里有一个问题,就是当XxxMapper接口很多的时候,要在每个上打上@Mapper标记,很繁琐。解决方法如下:

首先,将原来的@Mapper注释掉。

//@Mapper   //标记一个Mapper接口
public interface DeptMapper {
    List<Dept> findAll();
}

其次,在SpringBoot的启动类上加入@@MapperScan注解。

//指定XxxMapper接口文件所在的包
@MapperScan("org.yun.springboot.mapper") 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

别忘了还有对应XxxMapper.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="org.yun.springboot.mapper.DeptMapper" >
    <select id="findAll" resultType="Dept">
        select * from t_dept
    </select>
</mapper>

这里的quanresultType="Dept" 不需要写全限定类名。因为,已经在application.properties中配置过mybatis.type-aliases-package=org.yun.springboot.model。而且,这里的Dept 是不区分大小写的。

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private DeptMapper deptMapper;

    @Test
    public void test2() {
        List<Dept> depts = deptMapper.findAll();
        System.out.println(depts);
    }
}

整合MyBatis-Generator(MBG)

引入依赖

<!-- mybatis整合spring boot依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

<!-- MBG依赖 -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.2</version>
</dependency>

编写配置

application.properties中加入如下配置:

#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root

#spring.datasource.schema=classpath:/schema.sql
#spring.datasource.data=classpath:/data.sql

#指定全局配置文件的位置
mybatis.config-locations=classpath:mybatis/mybatis‐config.xml 
#指定sql映射文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
#指定实体类类型别名所在包的位置
mybatis.type-aliases-package=org.yun.springboot.model

在项目的跟目录下创建mbg.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>

    <context id="DB2Tables" targetRuntime="MyBatis3">

        <commentGenerator>
            <!-- 是否取消注释 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 配置数据库连接 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/springboot"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 指定javaBean生成的位置 -->
        <javaModelGenerator targetPackage="org.yun.springboot.model"
                            targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 指定dao接口生成的位置,mapper接口 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="org.yun.springboot.mapper"
                             targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>


        <!-- table指定每个表的生成策略 -->
        <table tableName="t_dept" domainObjectName="Dept"/>
    </context>
</generatorConfiguration>

编写代码生成器

public class MBGTest {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
        System.out.println("success...");
    }
}

在Spring Boot的启动类上,指明要扫描的mapper的位置

@MapperScan("org.yun.springboot.mapper")
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private DeptMapper deptMapper;

    @Test
    public void test() {
        List<Dept> depts = deptMapper.selectByExample(null);
        System.out.println(depts);
    }
}

整合MyBatis Plus

引入依赖

<!-- mybatis-plus 整合 spring boot -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>

编写配置

application.properties中加入如下配置:

#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/crud
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root

# 数据库脚本
#spring.datasource.schema=classpath:/schema.sql
#spring.datasource.data=classpath:/data.sql

#指定全局配置文件的位置
mybatis.config-locations=classpath:mybatis/mybatis‐config.xml 
#指定sql映射文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
#指定实体类类型别名所在包的位置
mybatis.type-aliases-package=org.yun.springboot.model

#主键类型
mybatis-plus.global-config.db-config.id-type=auto
#驼峰下划线转换
mybatis-plus.global-config.db-column-underline=true
#全局表前缀
mybatis-plus.global-config.db-config.table-prefix=t_

编写DeptMapper接口

public interface DeptMapper extends BaseMapper<Dept> {
}

BaseMapper 是MyBatisPlus提供。

MybatisPlusConfig

@Configuration
@MapperScan("org.yun.springboot.mapper") //扫描Mapper接口
public class MybatisPlusConfig {
    // 其他配置
}

当然,这里的@MapperScan 也可以放在Application类中。

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    @Autowired
    private DeptMapper deptMapper;
    @Test
    public void test3() {
        Dept dept = deptMapper.selectById(1L);
        System.out.println(dept);
    }
}

转载于:https://my.oschina.net/mondayer/blog/3027469

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值