SpringBoot持久层技术(jdbcTemplate+mybatis+springdataJPA)

编程入门 行业动态 更新时间:2024-10-10 07:20:51

SpringBoot<a href=https://www.elefans.com/category/jswz/34/1771330.html style=持久层技术(jdbcTemplate+mybatis+springdataJPA)"/>

SpringBoot持久层技术(jdbcTemplate+mybatis+springdataJPA)

SpringBoot整合持久层技术

  • 整合jdbcTemplate
    • 案例
  • 整合Mybaits
    • 案例
  • 整合SpringDataJPA
    • 案例
  • 多数据源
    • JDBCTemplate多数据源
    • Mybatis多数据源

整合jdbcTemplate

jdbctemplate是Spring提供的JDBC框架,利用AOP技术来解决直接使用jdbc带来的大量代码的繁杂问题

SpringBoot对JdbcTemplate的使用提供了一套自动化配置类:JdbcTemplateAutoConfiguration类,所以想要使用只需要提供JdbcTemplate的依赖和dataSource依赖即可

案例

1.pom.xml配置

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency></dependencies>

2.配置数据库连接信息applicaion.properties

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///chapter05?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

3.创建JavaBean

public class Book {private int id;private String name;private Double price;//省略getter setter
}

4.创建持久层接口dao

jdbcTemplate 对于增删改都使用update方法

@Repository
public class BookDao {
//加入jdbc依赖后就可以直接注入使用@AutowiredJdbcTemplate jdbcTemplate;public int addBook(Book book){return jdbcTemplate.update("insert into book(name,price) values(?,?)",book.getName(),book.getPrice());}public int updateBook(Book book){return  jdbcTemplate.update("update book set name = ? , price = ? where id = ?" , book.getName(),book.getPrice(),book.getId());}public int deleteBookByid(Integer id){return  jdbcTemplate.update("delete from book where  id = ?",id);}public Book getBook(Integer  id){return  jdbcTemplate.queryForObject("select * from book where id = ?" , new BeanPropertyRowMapper<>(Book.class) , id);}public List<Book> getAllBooks(){return  jdbcTemplate.query("select * from book",new BeanPropertyRowMapper<>(Book.class));}
}

6.测试

@SpringBootTest
class JdbctemplateApplicationTests {
//注入service层@AutowiredBookService bookService;@Testvoid contextLoads() {Book book = new Book();book.setId(1);Book book1 = bookService.getBook(1);System.out.println(book1.toString());   }}

整合Mybaits

SpringBoot同样为Mybatis提供了自动化配置

案例

1.导入Mybatis依赖、数据库依赖、数据库连接池的依赖

2.配置数据源

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

3.创建DAO接口

public interface BuserMapper {List<Buser> getAllBuser();
}

4.创建对应mapper.xml文件

<mapper namespace="pljandsyx.top.mybatisdatasource.mapper.BuserMapper"><select id="getAllBuser" resultType="pljandsyx.top.mybatisdatasource.Buser">select * from t_buser</select>
</mapper>

5.扫描mapper.xml文件
两种方法:
第一种:在每个mapper.xml文件里添加@Mapper注解
第二种:在启动类添加包扫描注解@MapperScan(basePackages=“pljandsyx.top.mybatisdatasource.mapper”)

6.测试

//注入依赖@AutowiredBuserMapper buserMapper;@Testvoid contextLoads() {List<Buser> allBuser = buserMapper.getAllBuser();System.out.println(allBuser);}

关于mapper.xml文件的位置:
1.如果放在java目录下,编译时是不会被扫描到的,尽管添加了@Mapper注解或者扫描注解
2.可以在resources目录创建与java目录相同的文件路径
3.如果硬要放在java目录,在pom.xml添加配置resource路径,如下

		<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><!--            当然也要告诉服务器resources也是我们的资源路径--><resource><directory>src/main/resources</directory></resource></resources>

4.如果要放在resources目录下的mapper目,在application.properties:

mybatis.mapper-locations=classpath:/mybatis/

整合SpringDataJPA

SpringDataJPA可以有效减少访问数据库的代码

案例

多数据源

多数据源就是在一个javaEE项目中才用了不同数据库实例中的多个库,或者说同一个数据库实例中多个不同的库,中间件可以完成,当然SpringBooot也可以完成
下面是三种配置方式

JDBCTemplate多数据源

1.导入相同依赖(jdbc依赖,mysql连接依赖,druid连接池依赖),创建两个数据库实例test1&test2

2.配置两个不同的数据源

#数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql:///localhost:3360/test1
spring.datasource.one.username=root
spring.datasource.one.password=root#数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql:///localhost:3360/test2
spring.datasource.two.username=root
spring.datasource.two.password=root

因为提供了不同的数据源,所以就要自定义加载数据源配置以及提供两个不同的JdbcTemplate实例
3.配置datasource & jdbcTemplate

DataSourceConfig.class:

@Configuration
public class DataSourceConfig {
//因为在配置数据源的时候用了不同的前缀,所以要用类型安全的属性注入
//返回的Bean名称就是方法名@Bean@ConfigurationProperties(prefix = "spring.datasource.one")DataSource ds1(){return DruidDataSourceBuilder.create().build();}
//因为在配置数据源的时候用了不同的前缀,所以要用类型安全的属性注入
//返回的Bean名称就是方法名@Bean@ConfigurationProperties(prefix = "spring.datasource.two")DataSource ds2(){return DruidDataSourceBuilder.create().build();}
}

TemplateConfig.class:

@Configuration
public class TemplateConfig
{
//这里同样需要指定不用的数据源使用@Qualifier注解,指定对应的Bean,直接New返回一个加入dataSource为参数的JdbcTemplate@BeanJdbcTemplate jdbcTemplate1(@Qualifier(value = "ds1") DataSource  dataSource){return new JdbcTemplate(dataSource);}
//这里同样需要指定不用的数据源使用@Qualifier注解,指定对应的Bean,直接New返回一个加入dataSource为参数的JdbcTemplate@BeanJdbcTemplate jdbcTemplate2(@Qualifier(value = "ds2") DataSource  dataSource){return new JdbcTemplate(dataSource);}
}

4.测试

//这里要指定注入的不用JdbcTemplate,使用@Resource或者可以使用@AutoWired和@Qualfier组合@Resource(name = "jdbcTemplate1")JdbcTemplate jdbcTemplate1;@Resource(name = "jdbcTemplate2")JdbcTemplate jdbcTemplate2;@Testvoid contextLoads() {Buser buser1 = jdbcTemplate1.queryForObject("select * from t_buser where id = 1", new BeanPropertyRowMapper<>(Buser.class));System.out.println(buser1.toString());Buser buser2 = jdbcTemplate2.queryForObject("select * from t_buser where id = 1", new BeanPropertyRowMapper<>(Buser.class));System.out.println(buser2.toString());}

Mybatis多数据源

1.导入依赖

2.配置数据源

spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC
spring.datasource.one.username=root
spring.datasource.one.password=rootspring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC
spring.datasource.two.username=root
spring.datasource.two.password=root
@Configuration
public class DadaSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.one")DataSource dsone(){return DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.two")DataSource dstwo(){return DruidDataSourceBuilder.create().build();}
}

3.配置SqlSessionFactory&SqlSessionTemplate

@Configuration
@MapperScan(basePackages = "pljandsyx.top.mybatisdatasource.mapper1", sqlSessionFactoryRef ="sqlSessionFactory1" , sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MybatisConfigOne {@Resource(name = "dsone")DataSource dsone;@BeanSqlSessionFactory sqlSessionFactory1(){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();try{sqlSessionFactoryBean.setDataSource(dsone);return sqlSessionFactoryBean.getObject();}catch (Exception e){e.printStackTrace();}return null;}@BeanSqlSessionTemplate sqlSessionTemplate1(){return  new SqlSessionTemplate(sqlSessionFactory1());}
}
@Configuration
@MapperScan(basePackages = "pljandsyx.top.mybatisdatasource.mapper2" ,sqlSessionTemplateRef = "sqlSessionTemplate2" ,sqlSessionFactoryRef ="sqlSessionFactory2")
public class MybatisConfigTwo {
@Resource(name = "dstwo")DataSource dstwo;
@Bean
SqlSessionFactory sqlSessionFactory2(){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();try{sqlSessionFactoryBean.setDataSource(dstwo);return sqlSessionFactoryBean.getObject();}catch (Exception e){e.printStackTrace();}return null;}@BeanSqlSessionTemplate sqlSessionTemplate2(){return  new SqlSessionTemplate(sqlSessionFactory2());}
}

4.创建接口以及对应xml文件
第一个

@Repository
public interface BuserMapper1 {List<Buser> getAllBuser1();
}
<mapper namespace="pljandsyx.top.mybatisdatasource.mapper1.BuserMapper1"><select id="getAllBuser1" resultType="pljandsyx.top.mybatisdatasource.Buser">select * from t_buser</select>
</mapper>

第二个

@Repository
public interface BuserMapper2 {List<Buser> getAllBuser2();
}
<mapper namespace="pljandsyx.top.mybatisdatasource.mapper2.BuserMapper2"><select id="getAllBuser2" resultType="pljandsyx.top.mybatisdatasource.Buser">select * from t_buser</select>
</mapper>

5.测试

@SpringBootTest
class MybatisdatasourceApplicationTests {@AutowiredBuserMapper1 buserMapper1;@AutowiredBuserMapper2 buserMapper2;@Testvoid contextLoads() {List<Buser> allBuser1 = buserMapper1.getAllBuser1();System.out.println(allBuser1);List<Buser> allBuser2 = buserMapper2.getAllBuser2();System.out.println(allBuser2);}
}

最后这里有个疑问:
接口名称一定要跟xml文件名称一样吗?
当不一样时,找不到对应的方法,尽管xml文件里的namespace等都一一对应了;

更多推荐

SpringBoot持久层技术(jdbcTemplate+mybatis+springdataJPA)

本文发布于:2024-03-23 23:22:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1744061.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:持久   技术   SpringBoot   springdataJPA   mybatis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!