springboot与jdbc
来源:互联网 发布:爰淘宝 编辑:程序博客网 时间:2024/06/05 11:16
本文将介绍如何将spring boot 与 JdbcTemplate一起工作。
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。 JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans. 在maven中,我们需要增加spring-boot-starter-jdbc模块
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency>
通过这个模块为我们做了以下几件事
tomcat-jdbc-{version}.jar为我们自动配置DataSource.
如果你没有定义任何DataSource,SpringBoot将会自动配置一个内存的数据库资源设置
如果没有设置任一个beans,SpringBoot会自动注册它
初始化数据库
如果我们在classpath里定义了schema.sql和data.sql文件,springBoot将会使用这些文件自动初始化数据库(但你必须选建库)除了载入schema.sql和data.sql外,SpringBoot也会载入schema-${platform}.sql和data-${platform}.sql,如果在你的classpath下存在的话。
spring.datasource.schema=xxxx-db.sql 可以定义你的建库文件spring.datasource.data=xxxx-data.sql 可以定义你的数据文件spring.datasource.initialize=true|false 可以决定是不是要初始化这些数据库文件spring.datasource.continueOnError=true|false 有了错误是否继续运行
定义数据库驱动信息
/src/main/resources/application.yml
logging: level: org.springframework: INFO com.example: DEBUG################### DataSource Configuration ##########################spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/gs-jdbc username: root password: initialize: trueinit-db: true
其中
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/gs-jdbc username: root password:
我是用的mysql,你也可以定义其它或者不定义,如果不定义,springBoot会自动为我们配置一个嵌入的数据库( Embedded database)
自定义数据源
如果你不想用默认的配置数据源,如你想用阿里巴巴的数据池管理数据源,你也可以自己配置
先排除tomcat-jdbc的默认配置dataSource
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions></dependency>
定义自己的数据资源 这里使用了阿里巴巴的数据池管理,你也可以使用BasicDataSource
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version></dependency>
/src/main/java/com/example/SpringBootJdbcDemoApplication.java
package com.example;import com.alibaba.druid.pool.DruidDataSource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.core.env.Environment;import javax.sql.DataSource;/** * Created by tom on 2016/5/21. */@SpringBootApplicationpublic class SpringBootJdbcDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootJdbcDemoApplication.class, args); } @Autowired private Environment env; @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(env.getProperty("spring.datasource.url")); dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名 dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码 dataSource.setInitialSize(2); dataSource.setMaxActive(20); dataSource.setMinIdle(0); dataSource.setMaxWait(60000); dataSource.setValidationQuery("SELECT 1"); dataSource.setTestOnBorrow(false); dataSource.setTestWhileIdle(true); dataSource.setPoolPreparedStatements(false); return dataSource; }}
你也可以用别的:
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version></dependency>
@Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); dataSource.setUrl(env.getProperty("spring.datasource.url")); dataSource.setUsername(env.getProperty("spring.datasource.username")); dataSource.setPassword(env.getProperty("spring.datasource.password")); return dataSource; }
创建实体对象
/src/main/java/com/example/domain/User.java
package com.example.domain;/** * Created by tom on 2016/5/21. */public class User{ private Integer id; private String name; private String email; public User() { } public User(Integer id, String name, String email) { this.id = id; this.name = name; this.email = email; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; }}
创建持久层
有了上面的数据源配置,我们可以注入JdbcTemplate到数据访问组件并与数据库交互。 /src/main/java/com/example/repositories/UserRepository.java
package com.example.repositories;import com.example.domain.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.PreparedStatementCreator;import org.springframework.jdbc.core.RowMapper;import org.springframework.jdbc.support.GeneratedKeyHolder;import org.springframework.jdbc.support.KeyHolder;import org.springframework.stereotype.Repository;import org.springframework.transaction.annotation.Transactional;import java.sql.*;import java.util.List;/** * Created by tom on 2016/5/21. */@Repositorypublic class UserRepository { @Autowired private JdbcTemplate jdbcTemplate; @Transactional(readOnly = true) public List<User> findAll() { return jdbcTemplate.query("select * from users", new UserRowMapper()); } @Transactional(readOnly = true) public User findUserById(int id) { return jdbcTemplate.queryForObject("select * from users where id=?", new Object[]{id}, new UserRowMapper()); } public User create(final User user) { final String sql = "insert into users(name,email) values(?,?)"; KeyHolder holder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.setString(1, user.getName()); ps.setString(2, user.getEmail()); return ps; } }, holder); int newUserId = holder.getKey().intValue(); user.setId(newUserId); return user; } public void delete(final Integer id) { final String sql = "delete from users where id=?"; jdbcTemplate.update(sql, new Object[]{id}, new int[]{java.sql.Types.INTEGER}); } public void update(final User user) { jdbcTemplate.update( "update users set name=?,email=? where id=?", new Object[]{user.getName(), user.getEmail(), user.getId()}); }}class UserRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); return user; }}
你或许己注意到,大多数时候,我们都在应用中做这些配置的事。
创建单元测试测试我们的持久层方法
/src/test/java/SpringBootJdbcDemoApplicationTests.java
import com.example.SpringBootJdbcDemoApplication;import com.example.domain.User;import com.example.repositories.UserRepository;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.SpringApplicationConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;import static org.junit.Assert.*;import static org.junit.Assert.assertEquals;/** * Created by tom on 2016/5/21. */@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(SpringBootJdbcDemoApplication.class)public class SpringBootJdbcDemoApplicationTests{ Logger logger= LoggerFactory.getLogger(SpringBootJdbcDemoApplicationTests.class); @Autowired private UserRepository userRepository; @Test public void testAll(){ findAllUsers(); findUserById(); createUser(); } @Test public void findAllUsers() { List<User> users = userRepository.findAll(); assertNotNull(users); assertTrue(!users.isEmpty()); } @Test public void findUserById() { User user = userRepository.findUserById(1); assertNotNull(user); } private void updateById(Integer id) { User newUser = new User(id, "JackChen", "JackChen@qq.com"); userRepository.update(newUser); User newUser2 = userRepository.findUserById(newUser.getId()); assertEquals(newUser.getName(), newUser2.getName()); assertEquals(newUser.getEmail(), newUser2.getEmail()); } @Test public void createUser() { User user = new User(0, "tom", "tom@gmail.com"); User savedUser = userRepository.create(user); logger.debug("{}",savedUser); User newUser = userRepository.findUserById(savedUser.getId()); assertEquals("tom", newUser.getName()); assertEquals("tom@gmail.com", newUser.getEmail()); updateById(newUser.getId()); userRepository.delete(newUser.getId()); }}
源代码请访问: https://github.com/tomlxq/best-practice/tree/master/gs-jdbc
- springboot与jdbc
- springboot学习-JDBC
- SpringBoot之JDBC(I)
- 1 SpringBoot 使用sharding jdbc进行分库分表
- springboot分表sharding-jdbc-core
- SpringBoot学习笔记之JDBC使用
- FastDFS与Springboot集成
- springboot与敏捷开发
- springboot与mybatis整合
- SpringBoot 入门与配置
- MyBatis与SpringBoot
- FastDFS与Springboot集成
- FastDFS与Springboot集成
- FastDFS与Springboot集成
- Springboot与Aop
- 转载 springBoot与redis
- SpringBoot与Thymeleaf整合
- FastDFS与Springboot集成
- 实心菱形
- Python中re.compile遇到only supports 100 named groups的问题
- 空心菱形
- Leet常用数据结构【LeetCode】
- 最大公约数,最小公倍数
- springboot与jdbc
- 切换
- 数字反转(升级版)
- 解释器模式 详解
- 下拉列表小例子
- rabbitmq 消息确认机制
- numpy module 1 -- Numpy tutorial
- [Cloud Computing]Mechanisms: Endpoint Threat Detection and Response
- 最少硬币问题