[关闭]
@wangzhuanyun 2023-04-28T09:48:35.000000Z 字数 7688 阅读 922

SpringBoot jdbcTemplate(二)

springboot


JdbcTemplate简介

Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。JdbcTemplate位于spring-jdbc.jar中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。

JdbcTemplate主要提供以下五类方法

JdbcTemplate使用(集成springboot)

  1. 引入jar
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>

2.在yml配置文件中添加数据库连接
3.创建相关package包(pojo,mapper,dao,service,controller)
4.创建相关文件并编写代码

  1. POJO实体类
  2. public class SfUser {
  3. private Long user_id;
  4. private String user_name;
  5. private String user_password;
  6. private String user_class;
  7. private String user_addtime;
  8. private int user_state;
  9. ......
  10. }
  11. dao接口
  12. public interface SfUserDao {
  13. //获取单个对象信息
  14. public SfUser getSfUserByUserId(Long user_id);
  15. }
  16. dao实现
  17. @Repository("sfUserDao")
  18. public class SfUserDaoImpl implements SfUserDao {
  19. @Autowired
  20. private JdbcTemplate jdbcTemplate;//spring自动创建JdbcTemplate容器
  21. @Override
  22. public SfUser getSfUserByUserId(Long user_id) {
  23. String sql = "select * from sf_user where user_id=?";
  24. return jdbcTemplate.queryForObject(sql,new Object[]{user_id},new BeanPropertyRowMapper<>(SfUser.class));
  25. }
  26. }
  27. //扫描com.hz下的包,使用注解
  28. @SpringBootApplication(scanBasePackages ="com.hz")

获取list对象集合数据
对象集合(一)

  1. 在实体类中封装方法,用于返回对象集合
  2. public static SfUser toObject(Map map) {
  3. SfUser sfUser = new SfUser();
  4. sfUser.setUser_id((Long)map.get("user_id"));
  5. sfUser.setUser_name((String)map.get("user_name"));
  6. sfUser.setUser_state((int)map.get("user_state"));
  7. sfUser.setUser_addtime((Date)map.get("user_addtime"));
  8. return sfUser;
  9. }
  10. public static List toObject(List<Map<String, Object>> lists){
  11. List users = new ArrayList();
  12. for (Map map : lists) {
  13. SfUser userInfo = SfUser.toObject(map);
  14. if (userInfo != null) {
  15. users.add(userInfo);
  16. }
  17. }
  18. return users;
  19. }
  20. dao实现
  21. @Override
  22. public List<SfUser> getSfUserList() {
  23. String sql = "select * from sf_user";
  24. List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  25. return SfUser.toObject(maps);
  26. }
  27. queryForListsqlnew Object[]{参数1,参数2})
  28. queryForList:返回集合queryForListsqlnew Object[]{}),但集合为 List<Map<String, Object>>需要转换为对象

对象集合(二)

  1. 使用内置泛型对象BeanPropertyRowMapper
  2. dao实现
  3. List<SfUser> sfUserList = jdbcTemplate.query(sql,new Object[]{user_sex},new BeanPropertyRowMapper<SfUser>(SfUser.class));
  4. new BeanPropertyRowMapper<实体类>(实体类.class)来实现映射

获取统计数据

  1. String sql="select count(*) from sf_user";
  2. int count= jdbcTemplate.queryForObject(sql, Integer.class);
  3. System.out.println(count);

修改数据

  1. String sql="update sf_user set user_name=?,user_state=? where user_id=?";
  2. jdbcTemplate.update(sql,new Object[]{"zhh",1,51});

添加数据

  1. String sql="delete from sf_user where user_id=?";
  2. jdbcTemplate.update(sql,51insert into user (name,deptid) values (?,?)";
  3. int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});
  4. System.out.println(count);

删除数据

  1. String sql="delete from sf_user where user_id=?";
  2. jdbcTemplate.update(sql,51);

对数据批量操作(添加,修改)

  1. String sql="insert into user (name,deptid) values (?,?)";
  2. List<Object[]> batchArgs=new ArrayList<Object[]>();
  3. batchArgs.add(new Object[]{"caoyc",6});
  4. batchArgs.add(new Object[]{"zhh",8});
  5. batchArgs.add(new Object[]{"cjx",8});
  6. jdbcTemplate.batchUpdate(sql, batchArgs);

自定义RowMapper
用于返回集合或返回单个对象时使用

  1. public class SfUserRowMapper implements RowMapper<SfUser> {
  2. @Override
  3. public SfUser mapRow(ResultSet rs, int i) throws SQLException {
  4. SfUser sfUser = new SfUser();
  5. sfUser.setName(rs.getString("name"));
  6. sfUser.setGender(rs.getString("gender"));
  7. sfUser.setEmail(rs.getString("email"));
  8. return sfUser;
  9. }
  10. }
  11. 使用自定义SfUserRowMapper
  12. jdbcTemplate.queryForObject(sql,new Object[]{user_id},new SfUserRowMapper());

jdbcTemplate使用druid配置多数据源

pom.xml引入阿里巴巴druidjar

  1. <!-- druid数据源驱动 -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid-spring-boot-starter</artifactId>
  5. <version>1.1.10</version>
  6. </dependency>

application.properties文件配置

  1. #数据源1
  2. spring.datasource.druid.one.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.druid.one.driver-class-name=com.mysql.cj.jdbc.Driver
  4. spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/xxshop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
  5. spring.datasource.druid.one.username=root
  6. spring.datasource.druid.one.password=root
  7. #数据源2
  8. spring.datasource.druid.two.type=com.alibaba.druid.pool.DruidDataSource
  9. spring.datasource.druid.two.driver-class-name=com.mysql.cj.jdbc.Driver
  10. spring.datasource.druid.two.url=jdbc:mysql://localhost:3306/myschool?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
  11. spring.datasource.druid.two.username=root
  12. spring.datasource.druid.two.password=root

创建DataSourceConfig类用于加载数据源(不需要spring自动加载)

  1. @Configuration
  2. public class DataSourceConfig {
  3. @Bean(name = "mysqldatasource1")
  4. @ConfigurationProperties("spring.datasource.druid.one")
  5. public DataSource dataSourceOne(){
  6. return DruidDataSourceBuilder.create().build();
  7. }
  8. @Bean(name = "mysqldatasource2")
  9. @ConfigurationProperties("spring.datasource.druid.two")
  10. public DataSource dataSourceTwo(){
  11. return DruidDataSourceBuilder.create().build();
  12. }
  13. @Bean(name = "mysqlJdbcTemplateOne")
  14. public JdbcTemplate primaryJdbcTemplate(
  15. @Qualifier("mysqldatasource1") DataSource dataSource) {
  16. return new JdbcTemplate(dataSource);
  17. }
  18. @Bean(name = "mysqlJdbcTemplateTwo")
  19. public JdbcTemplate secondaryJdbcTemplate(
  20. @Qualifier("mysqldatasource2") DataSource dataSource) {
  21. return new JdbcTemplate(dataSource);
  22. }
  23. }

使用数据源1和2

  1. dao实现分别注入mysqlJdbcTemplateOnemysqlJdbcTemplateTwo
  2. @Autowired
  3. @Qualifier("mysqlJdbcTemplateOne") //使用第一个数据源
  4. private JdbcTemplate jdbcTemplate;
  5. @Autowired
  6. @Qualifier("mysqlJdbcTemplateTwo") //使用第二个数据源
  7. private JdbcTemplate jdbcTemplate;

Mybatis引入多数据源与JdbcTemplate类似
1.引入jar
2.application.properties文件中编写数据源配置
3.创建数据源1

  1. @Configuration
  2. @MapperScan(basePackages = MysqlDatasourceConfigOne.PACKAGE, sqlSessionFactoryRef = "mysqlSqlSessionFactory")
  3. public class MysqlDatasourceConfigOne {
  4. //onedao扫描路径
  5. static final String PACKAGE = "com.springboot.onedao";
  6. // mybatis mapper扫描路径
  7. static final String MAPPER_LOCATION = "classpath:mapper/mysql/*.xml";
  8. @Primary
  9. @Bean(name = "mysqldatasourceone")
  10. @ConfigurationProperties("spring.datasource.druid.one")
  11. public DataSource mysqlDataSource() {
  12. return DruidDataSourceBuilder.create().build();
  13. }
  14. @Bean(name = "oneTransactionManager")
  15. @Primary
  16. public DataSourceTransactionManager mysqlTransactionManager() {
  17. return new DataSourceTransactionManager(mysqlDataSource());
  18. }
  19. @Bean(name = "oneSqlSessionFactory")
  20. @Primary
  21. public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqldatasourceone") DataSource dataSource)
  22. throws Exception {
  23. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  24. sessionFactory.setDataSource(dataSource);
  25. //如果不使用xml的方式配置mapper,则可以省去下面这行mapper location的配置。
  26. sessionFactory.setMapperLocations(
  27. new PathMatchingResourcePatternResolver().getResources(MysqlDatasourceConfigOne.MAPPER_LOCATION));
  28. return sessionFactory.getObject();
  29. }
  30. }

4.创建数据源2

  1. @Configuration
  2. @MapperScan(basePackages = MysqlDatasourceConfigTwo.PACKAGE, sqlSessionFactoryRef = "mysqlSqlSessionFactory")
  3. public class MysqlDatasourceConfigTwo {
  4. // twodao扫描路径
  5. static final String PACKAGE = "com.springboot.twodao";
  6. // mybatis mapper扫描路径
  7. static final String MAPPER_LOCATION = "classpath:mapper/mysql/*.xml";
  8. @Primary
  9. @Bean(name = "mysqldatasourcetwo")
  10. @ConfigurationProperties("spring.datasource.druid.mysql")
  11. public DataSource mysqlDataSource() {
  12. return DruidDataSourceBuilder.create().build();
  13. }
  14. @Bean(name = "twoTransactionManager")
  15. @Primary
  16. public DataSourceTransactionManager mysqlTransactionManager() {
  17. return new DataSourceTransactionManager(mysqlDataSource());
  18. }
  19. @Bean(name = "twoSqlSessionFactory")
  20. @Primary
  21. public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqldatasourcetwo") DataSource dataSource)
  22. throws Exception {
  23. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  24. sessionFactory.setDataSource(dataSource);
  25. //如果不使用xml的方式配置mapper,则可以省去下面这行mapper location的配置。
  26. sessionFactory.setMapperLocations(
  27. new PathMatchingResourcePatternResolver().getResources(MysqlDatasourceConfigTwo.MAPPER_LOCATION));
  28. return sessionFactory.getObject();
  29. }
  30. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注