xinrong2019 / xinrong2019.github.io

My Blog
https://xinrong2019.github.io
1 stars 1 forks source link

20190520之从SpringJDBC到SpringDataJDBC #19

Closed xinrong2019 closed 5 years ago

xinrong2019 commented 5 years ago

SpringDataJDBC和SpringJDBC是什么关系?

Spring本身对JDBC提供支持,可以引入spring-boot-starter-jdbc,使用JdbcTemplate或者ORM技术访问数据库。

SpringDataJDBC是Spring Data项目下的一个子项目,为访问关系型数据库提供更便捷的功能。可以通过引入spring-boot-starter-data-jdbc依赖使用SpringDataJDBC。只需要实现CrudRepository接口就可以完成基本的CURD操作,不需要写SQL语句,要写复杂的SQL语句,可以通过@Query注解来完成。

关系型数据库访问

spring-data-jdbc learn 官方文档

官网demo


昨天折腾了好久,使用yml文件方式配置druid数据源总是配置失败。后来换成了.properties文件配置好了。

又因为需要使用数据库密码加密功能,采用javaconfig方式,调用init方法,才能使druid的configFilter生效。

但是配置好了后,使用JdbcTemplate执行了一个查询语句,返回id,oracle数据库是NUMBER类型,resultset使用long和bigdecimal都不能接收,内心有点崩溃。。

这个坑目前也不想踩了,意义不大,不能提高我的工作效率,还是用回Mybatis。

但是昨天一些项目搭建的内容记录一下:

首先pom文件中引入依赖:

引入parent

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

引入依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>10.2.0.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
    </dependencies>

   <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

application.properties配置文件:

image

配置类:

@Component
public class Config {

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.druid.filters}")
    private String filters;

    @Value("${spring.datasource.druid.connection-properties}")
    private String connectionProperties;

    @Bean(initMethod = "init",destroyMethod = "close")
    public DruidDataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        try {
            druidDataSource.setFilters(filters);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        druidDataSource.setConnectionProperties(connectionProperties);
        return druidDataSource;
    }
}

启动类:

@SpringBootApplication
public class DevopsApplication implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(DevopsApplication.class);

    @Autowired
    JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(DevopsApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("run a select");

        log.info("Querying for customer records where first_name = 'Josh':");
        jdbcTemplate.query("select f.id from table1 f where f.problemno = ?", new Object[] { "MI-0003949" },
                (rs, rowNum) -> new FiProblemEntity(Long.valueOf(rs.getLong("id")))
        ).forEach(fiProblem -> log.info(fiProblem.toString()));

    }
}

Entity类FiProblemEntity.java:

public class FiProblemEntity {
    private Long id;

    public FiProblemEntity(long id) {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "DemoEntity{" +
                "id=" + id +
                '}';
    }
}

使用Mybatis方式访问数据库:

依赖上面已经引入了。

只需要改两个地方:

首先加一个mapper接口:

@Mapper
public interface FiProblemMapper {

    @Select("select f.id from gpis_fi_problem f where f.problemno = #{problemNo}")
    FiProblemEntity selectFiProblemByProblemNo(@Param("problemNo") String problemNo);
}

然后修改启动类的测试内容:

@SpringBootApplication
public class DevopsApplication implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(DevopsApplication.class);

    @Autowired
    private FiProblemMapper fiProblemMapper;

    public static void main(String[] args) {
        SpringApplication.run(DevopsApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("run a select");
        FiProblemEntity fiProblemEntity = fiProblemMapper.selectFiProblemByProblemNo("MI-0003949");
        log.info(fiProblemEntity.toString());
    }
}

运行之后,报FiProblemEntity构造函数无法匹配BigDecimal类型,说明和工具本身关系不是特别大,之前搜的都是JdbcTemplate访问oracle如何接收BigDecimal,因为当时也没有报异常,只是id接收的是null。

官网例子的坑

Google一下(还是要Google,百度垃圾),然后搜到了!Mybatis使用的时候要求模型类有一个无参构造器,把FiProblemEntity的有参构造器删除后,果然运行成功。

然后代码回退,测试了JdbcTemplate,无参构造器删除后,果然也可以了。不过后续还是用Mybatis,个人习惯问题。

有参构造器这个是官网例子啊,,,坑逼了。。。

总结:

1、使用Google,而不是百度!

2、使用熟悉的工具,况且Mybatis本身在ORM方面做得足够好,够用!JdbcTemplate运行的时候报错少,没有Mybatis好用。

最后提醒自己,不需要再在jdbc访问工具上面做过多尝试,这里不是重点,选Mybatis就OK了。有这些时间,用来继续研究consul多好。。。