springboot的数据访问(springboot学习笔记08)

六、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
#    useUnicode=true&characterEncoding=UTF-8:指定字符的编码、解码格式
          # 存数据时:
          #数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
          #取数据时:
          #在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
#    serverTimezone=UTC:Mysql Connector/J 6.x以上的版本,报时区的错误的时候加上
#    useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false:?
    url: jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
  • 测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot06DataJdbc3ApplicationTests {

    //自动注入数据源
    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException {
        //获取数据源
        System.out.println(dataSource.getClass());

        //从数据源获取连接(alt+enter抛出异常)
        Connection connection = dataSource.getConnection();
        //打印连接
        System.out.println(connection);
        connection.close();
    }

}

效果:
在这里插入图片描述

  • 自动配置原理解析(数据源的相关配置都在DataSourceProperties里面):(org.springframework.boot.autoconfigure.jdbc)

1、参考DataSourceConfiguration,可知DataSourceConfiguration根据配置创建数据源,默认使用com.zaxxer.hikari.HikariDataSource作为数据源;可以使用spring.datasource.type指定自定义的数据源类型;

2、SpringBoot可以支持:
org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、

3、自定义数据源类型

/**
 * Generic DataSource configuration.
 */
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {

   @Bean
   public DataSource dataSource(DataSourceProperties properties) {
       //使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
      return properties.initializeDataSourceBuilder().build();
   }

}

4、DataSourceInitializer:继承ApplicationListener(一个监听器)

​ 作用:

​ 1)、runSchemaScripts();运行建表语句;

​ 2)、runDataScripts();运行插入数据的sql语句;

只需要将文件命名为:

1、默认规则:schema.sql,schema-all.sql;
2、扩展规则:schema-*.sql、data-*.sql
扩展需要在配置文件指定位置:
	schema:
      - classpath:department.sql
      - ....

5、springboot自动配置了JdbcTemplate,来操作数据库(增删改查),我们可以这样:
在这里插入图片描述

2、整合Druid数据源

  • 导入druid数据源依赖
        <!--https://mvnrepository.com/artifact/com.alibaba/druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
  • 在全局配置文件中指定druid数据源
	type: com.alibaba.druid.pool.DruidDataSource
  • druid数据源其他配置(视需求选择,注意要书写配置类才能使用):
#   数据源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
@Configuration
public class DruidConfig {

	//@ConfigurationProperties(prefix = "spring.datasource")将我们创建的数据源绑定在以spring.datasource为前置的属性里
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return new DruidDataSource();
    }

    //配置Druid的监控 - 可配置的属性可以查看?
    //1、配置一个管理后台的servlet(处理进入管理后台的请求)
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //配置初始化参数
        Map<String,String> initParams = new HashMap<>();
        initParams.put("loginUsername","admin");//指定登陆后台时用的用户名
        initParams.put("loginPassword","123456");//~密码
        initParams.put("allow","");//默认允许所有访问
        initParams.put("deny","113.12.52.191");//不允许~
        bean.setInitParameters(initParams);
        return bean;
    }
    //2、配置一个web监控的filter - 可配置的属性可以查看webStatFilter
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusioons","*.js,*.css,/druid/*");//排除哪些请求

        bean.setInitParameters(initParams);

        //要拦截的请求
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

3、整合MyBatis

mybatis-spring-boot-starter引入的依赖:
在这里插入图片描述

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

步骤:

​ 1)、配置数据源(druid)相关属性(见上节)

​ 2)、给数据库建表

​ 3)、创建JavaBean

4、用mybatis进行操作数据库

1、mabatis注解版

//指定这是一个操作数据库的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);
}

问题:

1、自定义MyBatis的配置规则(给容器中添加一个ConfigurationCustomizer用以开启驼峰命名法映射规则)

@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、使用MapperScan批量扫描所有的Mapper接口;

@MapperScan(value = "com.atguigu.springboot.mapper")
@SpringBootApplication
public class SpringBoot06DataMybatisApplication {

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

2、配置文件版

mybatis全局配置文件(mybatis-config.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>
    <!--开启驼峰命名法-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

mapper的sql映射文件(*Mapper.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!--作为mapper的sql映射文件-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace跟接口绑定(写全类名)-->
<mapper namespace="com.atpian.springboot.mapper.EmployeeMapper">
    <!-- 将接口的两个方法配置在映射文件里面
        public Employee getEmpById(Integer id);
        public void insertEmp(Employee employee);-->
    <select id="getEmpById" resultType="com.atpian.springboot.bean.Employee">
        SELECT * FROM employee WHERE  id=#{id}
    </select>

    <insert id="insertEmp">
        INSERT INTO employee(lastName,email,gender,d_id) VALUES (#{lastName},#{email},#{gender},#{dId)
    </insert>
</mapper>

在全局配置文件中指定路径:

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml 指定全局配置文件的位置
  mapper-locations: classpath:mybatis/mapper/*.xml  指定sql映射文件的位置

更多使用参照:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

5、整合SpringData JPA

1)、SpringData简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6PIcbyMH-1582217585203)(images/搜狗截图20180306105412.png)]

2)、整合SpringData JPA

JPA:基于ORM思想(Object Relational Mapping - 对象关系映射),使用步骤:

1)、编写一个实体类(名为entity的bean包)和数据表进行映射,并且配置好映射关系;

//使用JPA注解配置映射关系
@Entity//告诉JPA这是一个和数据表映射的实体类
@Table(name = "tbl_user")//指定要所要对应的数据表,如果省略就默认表明为类名小写(user)
public class User {

    @Id//说明这是一个主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
    private Integer id;

    @Column(name = "last_name",length = 50)//这是和数据表对应的一个列
    private String userName;
    @Column//省略默认列名即是主键名
    private String email;

	//生成getter、setter、tostring方法(略)

2)、编写一个Dao接口(repository包下:*Respository)来操作实体类对应的数据表

//User:要操作的实体类  Integet:主键的类型  继承JpaRespository来完成对数据库的操作
public interface UserRepository extends JpaRepository<User,Integer> {
}

3)、基本的配置(参照JpaProperties)

spring:  
  jpa:
    hibernate:
#     ddl-auto:定义数据表的生成策略,update表示自动更新和创建数据表结构
      ddl-auto: update
#     在控制台显示sql
    show-sql: true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值