SpringBoot与数据访问

1. JDBC

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.43.105:3306/jdbc
    driver-class-name: com.mysql.cj.jdbc.Driver

效果:
默认使用com.zaxxer.hikari.HikariDataSource作为数据源;数据源的相关配置都在DataSourceProperties里面
自动配置原理:
org.springframework.boot.autoconfigure.jdbc:
1. 参考DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以使用spring.datasource.type指定自定义的数据源类型;
2、SpringBoot默认可以支持;

HikariDataSource
org.apache.tomcat.jdbc.pool.DataSource
BasicDataSource
3. 自定义数据源类型
	@Configuration
    @ConditionalOnMissingBean({DataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"}
    )
    static class Generic {
        Generic() {
        }

        @Bean
        public DataSource dataSource(DataSourceProperties properties) {
        	// 使用DataSourceBuilder创建数据源,利用反射出啊关键响应type的数据源,并且绑定相关属性
            return properties.initializeDataSourceBuilder().build();
        }
    }
  1. DataSourceInitializer:ApplicationListener;
    作用:
    1)、runSchemaScripts();运行建表语句;
    2)、runDataScripts();运行插入数据的sql语句;
    默认只需要将文件命名为
schema‐*.sql、data‐*.sql
默认规则:schema.sql,schema‐all.sql;
可以使用
schema:
‐ classpath:department.sql
指定位置
如果你用的是spring2xx版本需要加上下面的一句话
initialization-mode: always
  1. 操作数据库:自动配置类jdbcTemplate操作数据库

2. 整合Druid数据源

导入druid数据源
@Configuration
public class DruidConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druid(){
        return new DruidDataSource();
    }

    //配置Druid的监控
    //1. 配置一个管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String, String> initParams = new HashMap<String, String>();
        initParams.put("loginUsername", "admin");
        initParams.put("loginPassword", "123456");
        initParams.put("allow", "");//默认就是允许所有访问
        initParams.put("deny", "192.168.43.105");

        bean.setInitParameters(initParams);
        return bean;
    }

    //2. 配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());

        Map<String, String> initParams = new HashMap<String, String>();
        initParams.put("exclusions", "*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

3. 整合MyBatis

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

步骤:
1. 配置数据源相关属性
2. 给数据库建表
3. 创建JavaBean

1. 注解版

package com.matthew.springboot.mapper;

import com.matthew.springboot.bean.Department;
import org.apache.ibatis.annotations.*;

/**
 * @Description TODO
 * @Author Matthew
 * @Date 2019/6/9 14:25
 * @Version 1.0
 */
//指定这是一个操作数据库的mapper
@Mapper
public interface DepartmentMapper {

    @Select("select * from department where id=#{id}")
    public Department getDeptById(Integer id);

    @Delete("delete from department where id=#{id}")
    public int deleteDeptById(Integer id);
    
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into department(departmentName) values(#{departmentName})")
    public int insertDept(Department department);

    @Update("update department set departmentName = #{departmentName} where id = #{id}")
    public int updateDept(Department department);
}

问题:
自定义MyBatis的配置规则;给容器中添加一个ConfigurationCustomizer;

package com.matthew.springboot.config;

import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;

/**
 * @Description TODO
 * @Author Matthew
 * @Date 2019/6/9 14:59
 * @Version 1.0
 */
@org.springframework.context.annotation.Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer(){
            @Override
            public void customize(Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

使用MapperScan批量扫描所有的Mapper接口
@MapperScan(value = "com.matthew.springboot.mapper")
public class SpringBoot06DataMabytisApplication {

让数据库的列名和字段匹配
数据库是department_name
bean中是departmentName

package com.matthew.springboot.config;

import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;

/**
 * @Description TODO
 * @Author Matthew
 * @Date 2019/6/9 14:59
 * @Version 1.0
 */
@org.springframework.context.annotation.Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer(){
            @Override
            public void customize(Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

2. 配置文件版

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml 指定全局配置文件的位置
  mapper-locations: classpath:mybatis/mapper/*.xml 指定sql映射文件的位置
mapUnderscoreToCamelCase	
Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn.
支持从经典数据库列名A_COLUMN到驼峰式经典Java属性名称aColumn的自动映射。

4. JPA

1. SpringData简介

在这里插入图片描述

2. 整合SpringData JPA

JPA:ORM(Object Relational Mapping);

  1. 编写一个实体类(bean)和数据表进行映射,并且配置好映射关系;
package com.matthew.springboot.entity;


import lombok.Getter;
import lombok.Setter;


import javax.persistence.*;

/**
 * @Description TODO 使用JPA注解配置映射关系
 * @Author Matthew
 * @Date 2019/6/10 17:47
 * @Version 1.0
 */
@Getter
@Setter
@Entity//高速JPA这是一个实体类(和数据表映射的类)
@Table(name = "tbl_user")//@Table来指定和哪个数据表对应;如果省略默认表名就是user
public class User {
    @Id//这是一个主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
    private Integer id;
    @Column(name = "last_name" ,length = 50)//这是和数据表对应的一个列
    private String lastName;
    @Column//省略默认列名就是属性名
    private String email;
}

  1. 编写一个Dao接口来操作实体类对应的数据表(Repository)
//继承JpaRepository来完成对数据库的操作,第一个泛型是操作的实体类,第二个是主键的类型
public interface UserRepository extends JpaRepository<User,Integer> {}
  1. 基本的配置
spring:
  datasource:
    hikari:
      jdbc-url: jdbc:mysql://192.168.43.105/jpa
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      #更新或者创建数据表结构
      ddl-auto: update
    #控制台显示SQL
    show-sql: true
  1. 编写controller进行测验
package com.matthew.springboot.controller;


import com.matthew.springboot.entity.User;
import com.matthew.springboot.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.jws.soap.SOAPBinding;

/**
 * @Description TODO
 * @Author Matthew
 * @Date 2019/6/10 18:09
 * @Version 1.0
 */
@RestController
public class UserController {
    @Autowired
    UserRepository userRepository;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") Integer id) {
        User user = userRepository.findById(id).orElse(null);
        return user;
    }
    @GetMapping("/user")
    public User insertUser(User user) {
        User save = userRepository.save(user);
        return save;
    }
}

http://localhost:8080/user?lastName=zhangsan&email=aa
http://localhost:8080/user?lastName=lisi&email=bb
http://localhost:8080/user/1
页面输出
{"id":3,"lastName":"lisi","email":"bb"}
控制台输出
Hibernate: select user0_.id as id1_0_0_, user0_.email as email2_0_0_, user0_.last_name as last_nam3_0_0_ from tbl_user user0_ where user0_.id=?
Hibernate: insert into tbl_user (email, last_name) values (?, ?)
Hibernate: insert into tbl_user (email, last_name) values (?, ?)
Hibernate: select user0_.id as id1_0_0_, user0_.email as email2_0_0_, user0_.last_name as last_nam3_0_0_ from tbl_user user0_ where user0_.id=?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值