前面我们已经讲了​​SpringBoot如何使用JPA访问数据库​​​,​​如何使用mybatis访问数据库​​,本文讲述如何使用JdbcTemplate访问数据库。这三种技术,应该如何选型,网上众说纷纭,这个还得看公司的业务类型,这里就不做分析。


JdbcTemplate的使用,也是很简单的:引入依赖-->配置数据源-->引入JdbcTemplate模板-->调用模板方法,具体使用细节如下。


1.pom.xml


引入JdbcTemplate必要的依赖

<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--JdbcTemplate-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2.application.properties


使用JdbcTemplate没有什么额外配置,我们只需要配置好数据库即可。

# mysql  
spring.datasource.url=jdbc:mysql://22.22.22.22/ss
spring.datasource.username=root
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3.service层


使用JdbcTemplate访问数据库,我们可以直接把对数据库的操作写在业务层即可;这里我们写几个增删改查方法示例一下。首先,此文演示的接口和业务层结构如下,是比较传统的分层结构:

(9)SpringBoot使用JdbcTemplate访问数据库_bc

代码如下:


3.1JDBCTemplateController.java


接口类中没有什么需要强调的,内容如下:

package com.java4all.controller;
import com.java4all.entity.User;
import com.java4all.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Author: momo
* Date: 2018/4/3
* Description:演示JDBCTemplate
*/
@RestController
@RequestMapping("jdbcUser")
public class JDBCTemplateController {
@Autowired
private UserService userService;
@RequestMapping(value = "getCount",method = RequestMethod.GET)
public Integer getCount(){
Integer count = userService.getCount();
return count;
}
@RequestMapping(value = "deleteUserById",method = RequestMethod.GET)
public void deleteUserById(Integer id){
userService.deleteUserById(id);
}
@RequestMapping(value = "updateUserById",method = RequestMethod.GET)
public void updateUserById(String userName,Integer id){
userService.updateUserById(userName,id);
}
@RequestMapping(value = "getUserByProvinceAndCity",method = RequestMethod.GET)
public List<User> getUserByProvinceAndCity(String province,String city){
List<User> list = userService.getUserByProvinceAndCity(province, city);
return list;
}
}
3.2UserService.java


package com.java4all.service;
import com.java4all.entity.User;
import java.util.List;
/**
* Author: momo
* Date: 2018/3/29
* Description:
*/
public interface UserService {
User getById(Integer id);
Integer getCount();
void deleteUserById(Integer id);
void updateUserById(String userName,Integer id);
List<User> getUserByProvinceAndCity(String province, String city);
}
3.3UserServiceImpl.java


我们在此实现类中,@Autowired引入JdbcTemplate,然后就可以使用模板类的增删改查等方法了。

package com.java4all.serviceImpl;
import com.java4all.dao.UserDao;
import com.java4all.entity.User;
import com.java4all.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Author: momo
* Date: 2018/3/29
* Description:
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public User getById(Integer id) {
User user = userDao.getById(id);
return user;
}
/** JdbcTemplate */
@Override
public Integer getCount() {
String sql = "SELECT COUNT(*) FROM user";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
@Override
public void deleteUserById(Integer id) {
String sql = "delete from user where id = ?";
jdbcTemplate.update(sql,id);
}
@Override
public void updateUserById(String userName,Integer id) {
String sql = "update user set user_name = ? where id = ?";
jdbcTemplate.update(sql,userName,id);
}
@Override
public List<User> getUserByProvinceAndCity(String province, String city) {
//错误写法,如果打印出此sql,会发现?还是?,并没有被参数替换掉
String sql = "select * from user where 1= 1 and province = ? and city = ?";
String sql2 = "select * from user where 1= 1 and province ='"+ province +"' and city ='"+city + "'";
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql2);
List<User> listRe = new ArrayList<>();
for(int i = 0 , length = list.size();i < length; i ++){
Map<String, Object> map = list.get(i);
User user = new User();
//这个map转为实体的方式,可以抽取出来,其他方法可复用
user.setId((int)map.get("id"));
user.setUserName((String)map.get("user_name"));
user.setRealName((String)map.get("real_name"));
user.setPassword((String)map.get("password"));
user.setCountry((String)map.get("country"));
user.setProvince((String)map.get("province"));
user.setCity((String)map.get("city"));
user.setPhone((String)map.get("phone"));
user.setCreateTime((Date) map.get("create_time"));
user.setDevLanguage((String)map.get("dev_language"));
user.setSchoolName((String)map.get("school_name"));
user.setSchoolMajor((String)map.get("school_major"));
listRe.add(user);
}
return listRe;
}
}

附建表语句:

CREATE TABLE `user` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`user_name` varchar(32) DEFAULT NULL COMMENT '用户名',
`real_name` varchar(32) DEFAULT NULL COMMENT '真实姓名',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`country` varchar(11) DEFAULT NULL COMMENT '省',
`province` varchar(11) DEFAULT NULL COMMENT '市',
`city` varchar(11) DEFAULT NULL COMMENT '县',
`phone` varchar(32) DEFAULT NULL COMMENT '电话',
`create_time` date DEFAULT NULL COMMENT '创建时间',
`dev_language` varchar(11) DEFAULT NULL COMMENT '开发语言',
`school_name` varchar(32) DEFAULT NULL COMMENT '学校',
`school_major` varchar(32) DEFAULT NULL COMMENT '大学专业',
PRIMARY KEY (`id`),
KEY `user_name_index` (`user_name`),
KEY `school_major_index` (`school_major`)
) ENGINE=InnoDB AUTO_INCREMENT=1600003 DEFAULT CHARSET=utf8

User实体在​​(5)SpringBoot使用JPA访问数据库​​一文中已经给出,这里不再黏贴。


添加,更新,删除,查询单个对象,都比较简单,这里重点注意查询列表,上面的方法,查询出的列表,里面是map的格式,需要我们手动转换一下,我们可以把这个转换过程抽取出来,其他的查询列表方法也可以复用;而且,注意sql的拼接。


点击阅读原文,查看完整源码。


(9)SpringBoot使用JdbcTemplate访问数据库_java_02