1、添加数据源
既然要使用JdbcTemplate,就需要添加jdbc的依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
2、连接数据源,以mysql为例:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
3、在src/main/resources/application.properties中配置数据源信息
注意:其中driver-class可以不写,Spring Boot会自动从url中解析使用的数据源类
Spring Boot默认采用tomcat-jdbc连接池,如果需要C3P0,DBCP,Druid等作为连接池,需要加入相关依赖以及配置,这里不作说明,采用默认配置即可。
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=... spring.datasource.password=...
底层默认使用tomcat-jdbc连接池,所以在默认情况下会创建一个基于Tomcat连接池的DataSource,并注入到Spring IOC容器中。
abstract class DataSourceConfiguration { @SuppressWarnings("unchecked") protected <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) { return (T) properties.initializeDataSourceBuilder().type(type).build(); } /** * Tomcat Pool DataSource configuration. */ @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true) static class Tomcat extends DataSourceConfiguration { //创建一个基于Tomcat连接池的DataSource的Bean //由于底层使用Tomcat连接池,在不引入外部数据连接池的jar包之前,默认使用Tomcat的DataSource @Bean @ConfigurationProperties(prefix = "spring.datasource.tomcat") public org.apache.tomcat.jdbc.pool.DataSource dataSource( DataSourceProperties properties) { org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource( properties, org.apache.tomcat.jdbc.pool.DataSource.class); DatabaseDriver databaseDriver = DatabaseDriver .fromJdbcUrl(properties.determineUrl()); String validationQuery = databaseDriver.getValidationQuery(); if (validationQuery != null) { dataSource.setTestOnBorrow(true); dataSource.setValidationQuery(validationQuery); } return dataSource; } } /** * Hikari DataSource configuration. */ @ConditionalOnClass(HikariDataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true) static class Hikari extends DataSourceConfiguration { //创建基于hikari的DataSource的Bean @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariDataSource dataSource(DataSourceProperties properties) { return createDataSource(properties, HikariDataSource.class); } } /** * DBCP DataSource configuration. * * @deprecated as of 1.5 in favor of DBCP2 */ @ConditionalOnClass(org.apache.commons.dbcp.BasicDataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.commons.dbcp.BasicDataSource", matchIfMissing = true) @Deprecated static class Dbcp extends DataSourceConfiguration { //创建基于dbcp的DataSource的Bean @Bean @ConfigurationProperties(prefix = "spring.datasource.dbcp") public org.apache.commons.dbcp.BasicDataSource dataSource( DataSourceProperties properties) { org.apache.commons.dbcp.BasicDataSource dataSource = createDataSource( properties, org.apache.commons.dbcp.BasicDataSource.class); DatabaseDriver databaseDriver = DatabaseDriver .fromJdbcUrl(properties.determineUrl()); String validationQuery = databaseDriver.getValidationQuery(); if (validationQuery != null) { dataSource.setTestOnBorrow(true); dataSource.setValidationQuery(validationQuery); } return dataSource; } } /** * DBCP DataSource configuration. */ @ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.commons.dbcp2.BasicDataSource", matchIfMissing = true) static class Dbcp2 extends DataSourceConfiguration { //创建基于dbcp2的DataSource的Bean @Bean @ConfigurationProperties(prefix = "spring.datasource.dbcp2") public org.apache.commons.dbcp2.BasicDataSource dataSource( DataSourceProperties properties) { return createDataSource(properties, org.apache.commons.dbcp2.BasicDataSource.class); } } /** * Generic DataSource configuration. */ @ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type") static class Generic { //可以在配置文件中通过spring.datasource.type指定外部的dataSource类型,并创建基于该type的DataSource的Bean @Bean public DataSource dataSource(DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } } }
4、使用JdbcTemplate操作数据库
SpringBoot中的 JdbcTemplate 是自动配置的,可以直接使用 @Autowired 或者 @Resource 来注入到需要的类中。
JdbcTemplateAutoConfiguration
@Configuration @ConditionalOnClass({ DataSource.class, JdbcTemplate.class }) @ConditionalOnSingleCandidate(DataSource.class) //在DataSourceAutoConfiguration自动配置类完成后再进行自动配置该类JdbcTemplateAutoConfiguration @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class JdbcTemplateAutoConfiguration { private final DataSource dataSource; public JdbcTemplateAutoConfiguration(DataSource dataSource) { this.dataSource = dataSource; } //创建一个JdbcTemplate的Bean @Bean @Primary @ConditionalOnMissingBean(JdbcOperations.class) public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(this.dataSource); } @Bean @Primary @ConditionalOnMissingBean(NamedParameterJdbcOperations.class) public NamedParameterJdbcTemplate namedParameterJdbcTemplate() { return new NamedParameterJdbcTemplate(this.dataSource); } }
JdbcTemplateAutoConfiguration类中会创建一个JdbcTemplate的Bean,所以在使用的时候可以直接注入。
DataSourceAutoConfiguration
@Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) //启动DataSourceProperties配置类 @EnableConfigurationProperties(DataSourceProperties.class) @Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class }) public class DataSourceAutoConfiguration { private static final Log logger = LogFactory .getLog(DataSourceAutoConfiguration.class); @Bean @ConditionalOnMissingBean public DataSourceInitializer dataSourceInitializer(DataSourceProperties properties, ApplicationContext applicationContext) { //根据配置文件属性创建DataSource的初始化器 return new DataSourceInitializer(properties, applicationContext); } //... }
class DataSourceInitializer implements ApplicationListener<DataSourceInitializedEvent> { private final DataSourceProperties properties; private final ApplicationContext applicationContext; private DataSource dataSource; private boolean initialized = false; DataSourceInitializer(DataSourceProperties properties, ApplicationContext applicationContext) { this.properties = properties; this.applicationContext = applicationContext; } @PostConstruct public void init() { //当DataSourceProperties初始化完成后 if (!this.properties.isInitialize()) { logger.debug("Initialization disabled (not running DDL scripts)"); return; } if (this.applicationContext.getBeanNamesForType(DataSource.class, false, false).length > 0) { //获取DataSource的bean this.dataSource = this.applicationContext.getBean(DataSource.class); } if (this.dataSource == null) { logger.debug("No DataSource found so not initializing"); return; } //... } }
JdbcTemplate操作数据库,就类似在Spring框架中使用JdbcTemplate一样,这里就不再累赘了。
扫描二维码关注公众号,回复:
146903 查看本文章
附上代码:
User实体类:
public class User implements Serializable { private Integer uid; private String uname; private int uage; //getter和setter }
User控制器:
@RestController @RequestMapping("/user") public class UserController { @Autowired private IUserService userService; @PostMapping("/") public String insertUser(User user){ int count = userService.insertUser(user); if(count != 1){ return "error"; }else{ return "success"; } } @GetMapping("/{uid}") public User getUserById(@PathVariable Integer uid){ User user = userService.getUserById(uid); return user; } @GetMapping("/") public List<User> getAllUsers(){ return userService.getAllUsers(); } @PutMapping("/{uid}") public String updateUserById(@PathVariable Integer uid, User user){ return userService.updateUserById(uid, user) == 1 ? "success" : "error"; } @DeleteMapping("/{uid}") public String deleteUserById(@PathVariable Integer uid){ return userService.deleteUserById(uid) == 1 ? "success" : "error"; } }
User业务层接口:
public interface IUserService { int insertUser(User user); User getUserById(Integer id); List<User> getAllUsers(); int updateUserById(Integer uid, User user); int deleteUserById(Integer uid); }
User业务层接口实现类:
@Service public class UserServiceImpl implements IUserService { @Autowired private IUserDao userDao; @Override public int insertUser(User user) { return userDao.insertUser(user); } @Override public User getUserById(Integer id) { return userDao.getUserById(id); } @Override public List<User> getAllUsers() { return userDao.getAllUsers(); } @Override public int updateUserById(Integer uid, User user) { return userDao.updateUserById(uid, user); } @Override public int deleteUserById(Integer uid) { return userDao.deleteUserById(uid); } }
User持久层接口:
public interface IUserDao { int insertUser(User user); User getUserById(Integer id); List<User> getAllUsers(); int updateUserById(Integer uid, User user); int deleteUserById(Integer uid); }
User持久层接口实现类:
@Repository public class UserDaoImpl implements IUserDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public int insertUser(User user) { return jdbcTemplate.update("insert into user values(null, ?, ?)", user.getUname(), user.getUage()); } @Override public User getUserById(Integer id) { Object[] params = {id}; return jdbcTemplate.queryForObject("select * from user where uid=?", params, new UserRowMapper()); } @Override public List<User> getAllUsers() { return jdbcTemplate.query("select * from user", new UserRowMapper()); } @Override public int updateUserById(Integer uid, User user) { StringBuilder sb = new StringBuilder(); List<Object> params = new ArrayList<>(); boolean isUpdate = false; if (user != null) { sb.append("update user set "); if (user.getUname() != null && !"".equals(StringUtils.trimWhitespace(user.getUname()))) { isUpdate = true; sb.append(" uname = ?,"); params.add(StringUtils.trimWhitespace(user.getUname())); } if (user.getUage() != 0) { isUpdate = true; sb.append(" uage = ?,"); params.add(user.getUage()); } } if (isUpdate) { sb.deleteCharAt(sb.length() - 1); sb.append(" where uid = ? "); params.add(user.getUid()); return jdbcTemplate.update(sb.toString(), params.toArray()); } else { return 0; } } @Override public int deleteUserById(Integer uid) { return jdbcTemplate.update("delete from user where uid = ?", uid); } }
User数据映射类:
public class UserRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet resultSet, int i) throws SQLException { User user = new User(); user.setUid(resultSet.getInt("uid")); user.setUname(resultSet.getString("uname")); user.setUage(resultSet.getInt("uage")); return user; } }
本节使用Restful风格进行编写,大概知道Restful格式即可,此处不多讲述。
====================打个广告,欢迎关注====================
QQ: |
412425870 |
微信公众号:Cay课堂 |
|
csdn博客: |
http://blog.csdn.net/caychen |
码云: |
https://gitee.com/caychen/ |
github: |
https://github.com/caychen |
点击群号或者扫描二维码即可加入QQ群: |
|
|