springboot数据访问
SpringBoot整合MyBatis
======================================
第一步:先导入MyBatis的依赖,依赖如下
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
第二步:配置相关的配置文件
spring:
datasource:
username: root
password: abcde
url: jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 自定义数据源
#上面是数据库和数据源的配置
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
#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,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#mybatis的xml配置 不配置的话 xml找不到文件
mybatis:
# 配置mybatis的xml配置文件的位置
mapper-locations: classpath:mapper/*.xml
#配置xml映射文件中指定的实体类别名路径
type-aliases-package: com.codel.mybatis.pojo
因为使用了druid数据源,而且还配置了新的配置信息,所以要创建一个新的配置类,去更新druid数据源的配置信息。
package com.codel.mybatis.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;
@Configuration
public class DruidConfig {
/*
将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
第三步:数据库创建表,创建实体类bean
package com.codel.mybatis.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String username;
private String password;
private String realname;
private Integer role;
}
第四步:创建映射数据库的mapper接口
package com.codel.mybatis.mapper;
import com.codel.mybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper //@Mapper : 表示本类是一个 MyBatis 的 Mapper
@Repository
public interface UserMapper {
// 这种是注解的方式
@Select("select * from user")
List<User> userLists();
//xml的方式配置
List<User> userLists2();
}
如果使用xml配置的方式,就要在配置文件里面进行配置,然后我们只需要通过对应的配置文件,就可以使用。
#mybatis的xml配置 不配置的话 xml找不到文件
mybatis:
# 配置mybatis的xml配置文件的位置
mapper-locations: classpath:mapper/*.xml
#配置xml映射文件中指定的实体类别名路径
type-aliases-package: com.codel.mybatis.pojo
<?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.codel.mybatis.mapper.UserMapper">
<select id="getUserByName" resultType="com.codel.mybatis.pojo.User">
<bind name="name" value="'%'+name+'%'"/>
select *
from user
where name like #{name}
</select>
<select id="getUserById" resultType="com.codel.mybatis.pojo.User">
select *
from user
where id = #{id};
</select>
</mapper>
如果不用@Mapper在每一个mapper类里面注解的,就可以使用MapperScan批量扫描所有的Mapper接口。
@MapperScan("com.codel.mybatis.mapper")
然后写controller配置类去测试mapper是否能获取到数据库里面的值
@RestController
public class UserController {
//注入
@Autowired
UserMapper userMapper;
@GetMapping("/getUsers")
public List<User> getUsers() {
return userMapper.userLists2();
}
springboot整合JPA
第一:导进JPA的架包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
第二:写好数据库配置文件application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=abcde
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
创建好实体类并配置好映射关系之后,我们接着编写一个Dao接口来操作实体类对应的数据表**(Repository)**
@Entity表示它是一个实体类。@Table是表名,如果不写就会生成类名小写的表。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
表示这是id字段并且主键自增。
@Column(name = "last_name",length = 20)
指明了表中的字段名称和大小。
package com.codel.jpa.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import javax.persistence.Entity;
import javax.persistence.Id;
//@Component
//@ConfigurationProperties(prefix = "user")
@Entity
public class User {
@Id
private int id;
private String name;
private String password;
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
实现接口CrudRepository或者JpaRepository都可以
package com.codel.jpa.mapper;
import com.codel.jpa.pojo.User;
import org.springframework.data.repository.CrudRepository;
//user是类名 integer是主键 关键是主键,根据主键来增删查改数据的
public interface UserRepository extends CrudRepository<User, Integer> {
}
注意了,JPA默认使用的hibernate,所以可以在配置文件中进行如下基本的配置
spring:
jpa:
hibernate:
# 更新或者创建数据表结构 自动建表。
ddl-auto: update
# 控制台显示SQL
show-sql: true
第三:controller获取数据库里面的数据
package com.codel.jpa.controller;
import com.codel.jpa.mapper.UserRepository;
import com.codel.jpa.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
public class UserController {
@Autowired
public UserRepository userRepository;
@Autowired
User user;
// 使用迭代器获取所有用户
@GetMapping("/finduser")
public Iterable<User> findUser() {
Iterable<User> all = userRepository.findAll();
return all;
}
@GetMapping("/findById")
public Optional<User> findById(int id) {
// id为唯一,防止为空的
Optional<User> byId = userRepository.findById(id);
return byId;
}
@GetMapping("/user")
public User getUser() {
return user;
}
@GetMapping("findName")
public User findName(int id, Model model) {
Optional<User> byId = userRepository.findById(id);
if (byId.isPresent()) {
User user = byId.get();
String name = user.getName();
String email = user.getEmail();
return user;
}
//因为是使用Optional来判断是否为空,要判断不为空才能拿到user的值,所以要进行上面的操作
}
}