【java学习】spring mvc 公共dao的实现,定义基本的增删改查

简介: 接口类:    package com.blog.db.dao; import com.blog.util.Pagination; import java.util.List; public interface PublicDao { public void se...

接口类:

  

package com.blog.db.dao;

import com.blog.util.Pagination;

import java.util.List;

public interface PublicDao<T> {
    public void setMapper(Class t);
    public void setTableName(String tn);
    public List<T> queryList(Pagination pagination);
    public void deleteByID(int ID);
    public void add(T t,Object[] values,int[] types); 
    public T queryById(int id);
    public T queryByField(String fieldname,String value);
    public void updateByID(T t,int ID,Object[] values,int[] types);
}

 

实现类:

package com.blog.db.dao.impl;

import com.blog.db.dao.PublicDao;
import com.blog.util.Pagination;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.sql.Types;
import java.util.List;
/**
 * 公共dao实现
 * @deprecated  提供常见的列表、插入、查询单个、更新数据服务
 * @author ztf
 * */
@Repository("publicDao")
public class PublicDaoimpl<T> implements PublicDao<T> {
    @Resource
    private JdbcTemplate jdbcTemplate;
    private String table_name = ""; //表名称
    private List<String> fields; //表字段
    @Value("${db_schema}")
    private String schema; //表模式
    private RowMapper<T> mapper;
    /**
     * 设置Mapper映射
     */

    public void setMapper(Class t){
        this.mapper = new BeanPropertyRowMapper<T>(t);
    }
    public RowMapper<T> getMapper(){
        return mapper;
    }
    public void setTableName(String tn){
        this.table_name = tn;
    }
    public String getTable_name() {
        return schema+"."+table_name;
    }
    public List<String> getFields(){
        return this.fields;
    }
    public String getFieldsToString(){
        String _fields;
        List<String> fields = getFields();
        _fields = String.join(",",fields);
        return _fields;
    }
    /**
     *  查询列表
     *  @param pagination 传入公共util中定义的分页对象
     *  @return List<T>
     * */
    public List<T> queryList(Pagination pagination) {
        List lists = null;
        String sql = "select * from ? ?";
        lists = jdbcTemplate.queryForList(
                sql,
                getTable_name(),
                pagination.getSql(),
                getMapper()

        );
        return lists;
    }
    /**
     *  根据ID删除某一个行
     *  @param ID 传入行id
     * */
    public void deleteByID(int ID) {
        String sql = "delete from "+
                getTable_name()+" where ID=?";

        jdbcTemplate.update(
                sql,
                new Object[] { ID },
                new int[] {Types.INTEGER}
        );
    }
    /**
     *  插入数据
     *  @param t 传入操作的数据对象
     *  @param values 值的object[]对象
     *  @param types 值对象的类型
     * */
    public void add(T t,Object[] values,int[] types) {
        String sql = "insert into "+getTable_name()+"("+getFieldsToString()+") values(?)";
        jdbcTemplate.update(
                sql,
                values,
                types
        );
    }
    /**
     *  根据ID查询指定的行
     *  @param id 传入id
     * */
    public T queryById(int id) {
        T t = null;
        String sql = "select * from "+getTable_name()+" where ID=?";
        try{
            t = jdbcTemplate.queryForObject(
                    sql,
                    new Object[] {id},
                    new int[] {Types.INTEGER},
                    getMapper()
            );
        }catch(EmptyResultDataAccessException e){
            t = null;
        }
        return t;
    }
    /**
     *  根据指定的fieldname查询指定值的单行数据
     *  @param fieldname 传入id
     * */
    public T queryByField(String fieldname,String value) {
        T t = null;
        String sql = "select * from "+getTable_name()+" where "+fieldname+"=?";
        try{
            t = jdbcTemplate.queryForObject(
                    sql,
                    new Object[] {value},
                    new int[] {Types.VARCHAR},
                    getMapper()
            );
        }catch(EmptyResultDataAccessException e){
            t = null;
        }
        return t;
    }
    /**
     *  根据指定的id更新指定值的单行数据
     *  @param t 传入更新对象
     *  @param ID 传入指定的ID
     *  @param values 值的object[]对象
     *  @param types 值对象的类型 int[]
     * */
    public void updateByID(T t, int ID,Object[] values,int[] types) {
        String sql = "update "+getTable_name()+" set username=?,password=?,pic=?,describe=?,check_time=? where ID="+ID;
        jdbcTemplate.update(
                sql,
                values,
                types
        );
    }
}

核心的地方在:如何传递Mapper

这里我使用的是

private RowMapper<T> mapper;
    /**
     * 设置Mapper映射
     */

    public void setMapper(Class t){
        this.mapper = new BeanPropertyRowMapper<T>(t);
    }
    public RowMapper<T> getMapper(){
        return mapper;
    }

在调用Dao时传入 T类的.class对象

调用例如(部分代码):

 @Qualifier("publicDao")
    private PublicDao<User> ud;

    public User Sign(String username, String password) throws UnsupportedEncodingException {
        String md5_pass = MD5Encryption.getEncryption(password);

        ud.setTableName("users"); //指定查询表名
        ud.setMapper(User.class); //指定映射class对象
        User user = ud.queryByField("username",username); //根据字段 username查询值为xxx 

可以实现基本表的增删改查,提升开发效率,

如果有特殊的Dao可以自定义一个专属Dao  再添加特殊方法

======================================================== 转载请注明出处。
目录
相关文章
|
4月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
153 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
4月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
104 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
4月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
184 0
|
4月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
124 0
|
4月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
154 0
|
4月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
129 0
|
3月前
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
107 20
|
4月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
103 25
|
4月前
|
存储 监控 Java
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
95 23
|
3月前
|
存储 Java 数据挖掘
Java 中数组的多种定义方式
本文深入解析了Java中数组的多种定义方式,涵盖基础的`new`关键字创建、直接初始化、动态初始化,到多维数组、`Arrays.fill()`方法以及集合类转换为数组等高级用法。通过理论与实践结合的方式,探讨了每种定义方法的适用场景、优缺点及其背后的原理,帮助开发者掌握高效、灵活的数组操作技巧,从而编写更优质的Java代码。
128 0

热门文章

最新文章