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

2022-05-07 16:21:19 浏览数 (1)

   摘要:本文主要讲解SpringBoot使用JdbcTemplate访问数据库。

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

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

1.pom.xml

引入JdbcTemplate必要的依赖

代码语言:javascript复制
<!--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没有什么额外配置,我们只需要配置好数据库即可。

代码语言:javascript复制
# 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访问数据库,我们可以直接把对数据库的操作写在业务层即可;这里我们写几个增删改查方法示例一下。首先,此文演示的接口和业务层结构如下,是比较传统的分层结构:

代码如下:

3.1JDBCTemplateController.java

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

代码语言:javascript复制
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
代码语言:javascript复制
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,然后就可以使用模板类的增删改查等方法了。

代码语言:javascript复制
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;
    }
}

附建表语句:

代码语言:javascript复制
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的拼接。

0 人点赞