SpringBoo-数据管理

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/82941948

MySQL

1. 数据源配置

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/godme?useSSL=true
    username: root
    password: godme
    driver-class-name: com.mysql.jdbc.Driver
    type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource

username:用户名

password:密码

url:连接地址

driver-class-name:驱动类型

type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource:可以配置数据源类型

  • useSSL=true:有要求SSL连接的需要配上
  • type:有默认值,不过不一定是想要的,设置上,更有把握

2. 建表语句执行

  • 建表文件

语句文件存放文件,SQL语句都写在其中

schema-*.sql:建表语句

data-*.sql:数据操作

文件名称严格区分,才能让SpringBoot进行识别

  • 执行配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/godme?useSSL=true
    username: root
    password: godme
    type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    driver-class-name: com.mysql.jdbc.Driver
    schema:
      - classpath:schema-godme.sql
    initialization-mode: always

schema:指定了建表文件位置,传入的是listyml语法能看出来

initialization-mode:2.0以上版本增加选择,不再自动执行语句,需要配置执行策略

3. 数据模板

@Controller
public class MyController {

    @Autowired
    JdbcTemplate template;

    @ResponseBody
    @RequestMapping("/data")
    public List getData(){
        List<Map<String, Object>> list = template.queryForList("SELECT * FROM person");
        return list;
    }
}

如你所见,只要数据源成功获取,自动注入JdbcTemplate,当然了,你必须是JDBC.

如果数据源成功获取了,确定是JDBC,还是报错的话,去掉配置中的type

确定好driver-class-name,无误的话,可能错的就是type了。

Druid

1. 配置

#durid
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.druid.url = jdbc:mysql://localhost:3306/godme?useSSL=true
spring.datasource.druid.username=root
spring.datasource.druid.password=godme

# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.useGlobalDataSourceStat=true

注意修改连接,用户名和密码

2. 注入

@Configuration
public class MyConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DataSource dataSource(){
        return new DruidDataSource();
    }
}

@ConfigurationProperties没忘记吧

  • 错误

运气好的就不说了,运气不好的话就要做日志适配了,关键在于

spring.datasource.druid.filters=stat,wall,log4j

解决办法有二:

  1. #spring.datasource.druid.filters=stat,wall,log4j
    # 注释掉,一了百了
    # 也不一定需要全部杀掉,注释掉关键的log4j也可
    
  2.         <!-- https://mvnrepository.com/artifact/log4j/log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <!-- 都是ClassNotFound的异常,这下面有 -->
            <!-- 还有错误的话根据它的提示和链接进行排除即可-->
    

3. 页面

  • servlet
@Configuration
public class MyConfig {
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean();
        bean.setServlet(new StatViewServlet());
        bean.addUrlMappings("/druid/*");
//        bean.addUrlMappings("/view");
        Map<String, String> map = new HashMap<String, String>();
        map.put("loginUsername", "godme");
        map.put("loginPassword", "godme");
        map.put("allow", "");
//        map.put("deny","192.168.31.248");
        bean.setInitParameters(map);
        return bean;
    }
}

来自傻瓜的忠告

addUrlMappings:/druid/*,切记啊,别瞎搞什么自定义\view了,不行的,要排好久

deny:allow""就行了,大家都能访问,别单机还把localhost配上去,访问不了啊

  • filter
@Configuration
public class MyConfig {
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String, String> map = new HashMap<>();
        map.put("exclusions","*.js,*.css,/druid/*");
        bean.setInitParameters(map);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

来自傻瓜的忠告:

exclusions:这个配置过滤的,/druid/*放不放都一样,没有啥骚操作

setUrlPatterns:就/*算了,骚操作我也不想了,别瞎折腾了

都是老东西,不用瞎搞,没新的。

  • 页面

http://localhost:8080/druid/index.html

直接访问就成
在这里插入图片描述

这就OK了,不过druid了解不多,不是看页面比较骚,死活没出来,还真不管了。

有兴趣的直接看druid官网,这样了解的更多。

Mybatis

1. pom引入

<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

2. 配置

#durid
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.druid.url = jdbc:mysql://localhost:3306/godme?useSSL=true
spring.datasource.druid.username=root
spring.datasource.druid.password=godme

# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.useGlobalDataSourceStat=true
#spring.datasource.druid.connectionInitSqls=drop table judas;

druid:datasource的一种类型,从底层来说顺序有

  • 数据库
  • 连接器
  • 驱动
  • 数据源
  • 框架(orm)

抛开数据库不说,连接过程中直接发起连接的connector我们也不关心。

一般的都是关心数据源datasource,从中分段,一般连接获取数据,一半orm框架整合。

所以,只要是javax.sql.DataSource,实现就都可以。

connectionInitSqlsdruid的运行时执行SQL

3.注解使用

  • 注解接口
@Mapper
public interface PersonMapper {
    @Select("select * from person where name=#{name}")
    public Person getPerson(String name);

    @Insert("insert into person(name, age) values(#{name}, #{age})")
    public int insertPerson(Person person);

    @Delete("delete from person where name=#{name}")
    public int deletePerson(Person person);

    @Update("update person set age=#{age} where name=#{name}")
    public int updatePerson(Person person);
}

@Mapper:标注为映射类,自动扫描,如果不标记的话,请在入口类配置@MapperScan,指定扫描的路径

@Select:查询

@Delete:删除

@Insert:插入

@update:更新

  • Mapper都是interface
  • 在语句注解中需要实现指定的SQL,如果多参的话传入对象,直接使用属性填充#{}语句即可

实验表中无主键,如果需要主键自增的话

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into Person(name, age) value(#{name}, #{age})")

@Options:设置选项

useGeneratedKeys:表示采用自增

keyProperty:指定自增属性

  • 外部查询
@RestController
public class MyController {
    @Autowired
    PersonMapper mapper;

    @GetMapping("/query")
    public Person query(@RequestParam("name") String name){
        return mapper.getPerson(name);
    }
    @GetMapping("/insert")
    public Person insert(Person person){
        mapper.insertPerson(person);
        return person;
    }
    @GetMapping("/delete")
    public Person delete(@RequestParam("name") String name){
        Person person = mapper.getPerson(name);
        mapper.deletePerson(person);
        return person;
    }
}

直接通过定义的PersonMapper即可进行查询,中间的配置过程Spring-Boot已经自动完成

4. 文件配置

关于mybatis配置文件不说了,直接说引入配置操作

# 全局配置文件
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
# 多文件
mybatis.config-locations=classpath:/mybatis/*.xml
# mapper配置文件
mybatis.mapper-location=classpath:/mybatis/mapper/person_mapper.xml
# 多文件
mybatis.mapper-locations=classpath:/mybatis/mapper/*.xml

# 驼峰转换什么的,新版本在这里面进行配置
mybatis.configuration=
# 更细节就点一下,具体可以查看自动配置类
mybatis.configuration.*=

JPA

1. pom

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

2. 配置

# 无表自动创建,有表不动
spring.jpa.hibernate.ddl-auto=update
# 打印SQL
spring.jpa.show-sql=true

3. 实体

@Entity
@Table(name = "student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name= "name")
    private String name;
    @Column(name = "age")
    private Integer age;
}

@Entity:标记为映射实体

@Table:指定映射表名,不写则为类名小写,配置时无表自动创建

@Id:指定主键

@GeneratedValuestrategy配置自增,GenerationType.IDENTITY自增类型,更多自己查看

@Column:绑定行属性,默认属性小写

4. 接口

public interface StudentRepository extends JpaRepository<Student, Integer>{
}

JpaRepository:继承类,默认实现CRUD和分页功能

Student:针对实体类

Integer:StudentId类型,要求可序列化Serializable

5. 调用

@RestController
public class MyController {
    @Autowired
    StudentRepository studentRepository;

    @GetMapping("/query/{id}")
    public Student query(@PathVariable("id") Integer id){
        return studentRepository.getOne(id);
    }
    @GetMapping("/insert")
    public Student insert(Student student){
       studentRepository.save(student);
        return student;
    }
    @GetMapping("/delete/{id}")
    public Student delete(@PathVariable("id") Integer id){
        Student student = studentRepository.getOne(id);
        studentRepository.delete(student);
        return student;
    }
    @GetMapping("/update/{id}")
    public Student update(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("age") Integer age){
        Student student = studentRepository.getOne(id);
        student.setAge(age);
        student.setName(name);
        studentRepository.save(student);
        return student;
    }
}

studentRepository:接口注入即可直接使用

getOne:查询,传入id

save:传入对象自动保存

delete:传入对象删除

  • 更新操作需要手动实现
  • 更多方法查看接口定义

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/82941948