程序员的知识教程库

网站首页 > 教程分享 正文

Spring Boot2.X数据访问的三种主流姿势JDBC、MyBatis、JPA

henian88 2024-10-14 10:03:59 教程分享 9 ℃ 0 评论

本文参照官方说明文档,可放心引用。

创建Spring Boot项目之后,开始对Dao层配置。

一、原生默认的数据库统一接口标准JDBC

1、pom文件中添加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>


2、application.yml配置文件中添加配置

spring:
 datasource:
 username: username
 password: password
 url: jdbc:mysql://192.168.1.12:3306/jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
 driver-class-name: com.mysql.jdbc.Driver

Spring Boot默认用org.apache.tomcat.jdbc.pool.DataSource作为数据源;

具体的数据源相关配置都在DataSourceProperties里面;

3、如何自定义JDBC配置:

@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name= "spring.datasource.type")
static classGeneric {
 
 @Bean
 public DataSourcedataSource(DataSourceProperties properties) {
 //使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
 returnproperties.initializeDataSourceBuilder().build();
 }
}

Spring Boot 默认配置JdbcTemplate框架操作数据库。

二、轻量级不完全ORM的框架Mybatis

1、pom文件中添加mybatis依赖(mybatis会自动引入jdbc部分依赖,所以不用手动添加)

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.0.0</version>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

2、application.yml配置文件中添加配置

spring:
 datasource:
 username: username
 password: password
 url: jdbc:mysql://192.168.1.12:3306/jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
 driver-class-name: com.mysql.jdbc.Driver

3、创建JavaBean

publicclass PojoBean {
 public int id;
 public String username;
 
 public PojoBean(int id, String username) {
 this.id = id;
 this.username = username;
 }
 
 public int getId() {
 return id;
 }
 
 public void setId(int id) {
 this.id = id;
 }
 
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
}

3、创建mapper映射

//指定这是一个操作数据库的mapper
@Mapper
public interfacePojoBeanMapper {
 
 @Select("select * from pojobean whereid=#{id}")
 public PojoBean getPojoById(Integer id);
 
 @Delete("delete from pojobean whereid=#{id}")
 public int deletePojoById(Integer id);
 
 @Options(useGeneratedKeys =true,keyProperty = "id")
 @Insert("insert intopojobean(username) values(#{username})")
 public int insertPojo(PojoBean department);
 
 @Update("update pojobean setusername=#{newusername} where id=#{id}")
 public int updatePojo(PojoBean username);
}

4、如何自定义MyBatis的配置规则?给容器中添加一个ConfigurationCustomizer;

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

5、使用MapperScan批量扫描所有的Mapper接口

@MapperScan(value= "com.springboot.name.mapper")
@SpringBootApplication
public classSpringBootDataMybatisApplication {
 
publicstatic void main(String[] args) {
SpringApplication.run(SpringBootDataMybatisApplication.class,args);
 }
}

三、ORM框架的统一接口标准JPA

1、pom文件中添加JPA依赖(JPA底层是对hibernate的再封装,会自动引入hibernate的依赖)

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
</dependency>


2、application.yml配置文件中添加配置

spring:
 datasource:
 username: username
 password: password
 url:jdbc:mysql://127.0.0.1:3307/springdata?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
 driver-class-name: com.mysql.jdbc.Driver
 jpa:
 hibernate:
# 更新或者创建数据表结构,无表用create
 ddl-auto: update
# 控制台显示SQL
 show-sql: true


3、编写一个实体类(bean)和数据表进行映射,并配置好映射关系

//使用JPA注解配置映射关系
@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;
//此处省略get、set
}

4、编写一个Dao接口来操作实体类对应的数据表(Repository)

//继承JpaRepository后即可对数据库进行操作,不需要写具体实现类。
public interfaceUserRepository extends JpaRepository<User,Integer> {
}

如果想在spring data jpa中自己写sql 语句,jpa支持两种扩展方式:

方式1、通过@query 注解指定nativeQuery,这样就可以使用原生sql查询,官方文档示例代码:

public interfaceUserRepository extends JpaRepository<User, Long> { 
@Query(value ="SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
UserfindByEmailAddress(String emailAddress);
}

方式2、通过Customizingindividual repositories 提供的功能去实现。这种方式通过自定义接口,例如CustomizedUserRepository ,和他的实现类,在实现类里用其他dao框架,如mybatis ,jdbcTemplate ,最后在用UserRepository去继承CustomizedUserRepository接口方式,实现和其他dao 框架的组合使用。

官方文档实例代码:

interfaceCustomizedUserRepository {
 voidsomeCustomMethod(User user);
}
classCustomizedUserRepositoryImpl implements CustomizedUserRepository {
public voidsomeCustomMethod(User user) {
 // Your custom implementation
 }
}
interfaceUserRepository extends CrudRepository<User, Long>,CustomizedUserRepository {
// Declare querymethods here
}

记录一下初次遇到的坑点:

坑1、Spring Boot 1.5X 和 2.X 版本中,使用JPA操作语句存在变化,例如1.5X版本的findOne()方法在2.X版本中会报类型错误,将findOne()修改为findById(id).get()即可,结果完全相同。

2.X版本使用 示例如下:


坑2、用Spring Boot做多模块开发,模块之间和父子模块之间的依赖能够自动直接或间接传递,但配置不会传递,配置文件名相同时,只有一个配置文件生效,项目中的配置最好单独存放。


总的来说,JDBC是原生默认的,是大多数人第一次所接触的。MyBatis和Spring DataJPA都是很不错且被广泛使用的持久层解决方案,要使用哪一种,根据项目选择即可。

最新的ORM框架使用率排行

免费分享Java架构资料,需要的可以私信我

原文:https://mp.weixin.qq.com/s/LfUrERYCgKGfhRg2BLqVUQ

来源:专注一行代码

作者:专注一行代码

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表