Spring JDBC,JdbcTemplate对象(增删改,查询封装为自定义对象(或map或list)等操作)、BeanPropertyRowMapper

一、概念

Spring JDBC使用时还是得用到上一篇博客的druip和它的JDBCUtils的配置的,只不过它那些获取pstmt对象和.close方法就可以不用写(JdbcTemplate对象自动帮你弄好和关闭啥的,你只要专注写sql就行),就更加方便一点。传送门:上一篇博客

在这里插入图片描述

JdbcTemplate对象还是得用到druip和它的JDBCUtils,所以我们直接在上一篇博客下,添加驱动和创个JDBCTemplate_tset包:在这里插入图片描述

二、演示上面所说的增删改,查询封装为对象

我们要对这个数据库进行操作:
在这里插入图片描述
在这里插入图片描述
需求:
1. 修改1号数据的 salary 为 10000
2. 添加一条记录
3. 删除刚才添加的记录
4. 查询id为1的记录,将其封装为Map集合
5. 查询所有记录,将其封装为List
6. 查询所有记录,将其封装为Emp对象的List集合 (就是把数据库表中的每一行封装为你对应实体类的一个对象,返回一个list,那么你遍历这个list,就是你表中有多少行数据就输出多少个对象)
6. 查询总记录数

首先我们先创建数据库对应的实体类对象Emp(实体表中的成员变量设为包装类,防止查到的数据表的数据为null存为基本类型有可能空指针异常):(不清楚可以看

只有下下面代码中的template.query中的test6和test_02才要用Emp实体类

package cn.qlbf.domain;

import java.util.Date;

/**
 * @author QLBF
 * @version 1.0
 * @date 2020/11/19 20:20
 */
public class Emp {
    private Integer id;
    private String ename;
    private Integer job_id;
    private Integer mgr;
    private Date joindate;
    private Double salary;
    private Double bonus;
    private Integer dept_id;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public Integer getJob_id() {
        return job_id;
    }

    public void setJob_id(Integer job_id) {
        this.job_id = job_id;
    }

    public Integer getMgr() {
        return mgr;
    }

    public void setMgr(Integer mgr) {
        this.mgr = mgr;
    }

    public Date getJoindate() {
        return joindate;
    }

    public void setJoindate(Date joindate) {
        this.joindate = joindate;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Double getBonus() {
        return bonus;
    }

    public void setBonus(Double bonus) {
        this.bonus = bonus;
    }

    public Integer getDept_id() {
        return dept_id;
    }

    public void setDept_id(Integer dept_id) {
        this.dept_id = dept_id;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", ename='" + ename + '\'' +
                ", job_id=" + job_id +
                ", mgr=" + mgr +
                ", joindate=" + joindate +
                ", salary=" + salary +
                ", bonus=" + bonus +
                ", dept_id=" + dept_id +
                '}';
    }
}

在这里插入图片描述
query封装为对象,就是把数据库表的每一行数据封装为你对应数据库表的实体类对象,数据库表的每一行就封装为一个对象,然后你就可以拿这对象来干嘛就干嘛了

queryForObject还可以查表中的一行返回实体类对象,其实query也可以查一个对象,只不过它返回的是list而不是实体类对象:

queryForObject与query的区别,queryForObject只能返回一个对象,而query可返回一个对象也可以返回一个封装多个对象的集合

 public User login(User loginUser){
        try {
            //1.编写sql
            String sql = "select * from user where username = ? and password = ?";
            //2.调用query方法
            User user = template.queryForObject(sql,
                    new BeanPropertyRowMapper<User>(User.class),
                    loginUser.getUsername(), loginUser.getPassword());


            return user;
        }

然后我们就可以写需求的代码了:

package cn.qlbf.JDBCTemplate_tset;

import cn.qlbf.domain.Emp;
import cn.qlbf.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class demo01{

    //Junit单元测试,可以让方法独立执行


    //1. 获取JDBCTemplate对象,放在这里当成员变量,这样下面方法test就不用每次都加上了
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /**
     * 1. 修改id为1001号数据的 salary 为 10000
     */
    @Test
    public void test1(){

        //2. 定义sql,emp为数据库表
        String sql = "update emp set salary = ? where id = ?";
        //3. 执行sql
        int count = template.update(sql,10000,1001);
        System.out.println(count);
    }

    /**
     * 2. 添加一条记录
     */
    @Test
    public void test2(){
        String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";
        int count = template.update(sql, 1015, "郭靖", 10);
        System.out.println(count);

    }

    /**
     * 3.删除刚才添加的记录
     */
    @Test
    public void test3(){
        String sql = "delete from emp where id = ?";
        int count = template.update(sql, 1015);
        System.out.println(count);
    }

    /**
     * 4.查询id为1001的记录,将其封装为Map集合
     * 注意:这个方法查询的结果集长度只能是1
     */
    @Test
    public void test4(){
        String sql = "select * from emp where id = ? ";
        //String sql = "select * from emp where id = ? or id = ?";//查不了,expected 1, actual 2
        Map<String, Object> map = template.queryForMap(sql, 1001);
        System.out.println(map);
        //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
        Set<String> set = map.keySet();
        for (String key : set) {
            Object value = map.get(key);
            System.out.println(key+":"+value);
            /*  输出  id:1001
            ename:孙悟空
            job_id:4
            mgr:1004
            joindate:2000-12-17
            salary:19999.00
            bonus:null
            dept_id:20*/
        }

    }

    /**
     * 5. 查询所有记录,将其封装为List
     */
    @Test
    public void test5(){
        String sql = "select * from emp";
        List<Map<String, Object>> list = template.queryForList(sql);

        for (Map<String, Object> stringObjectMap : list) {
            System.out.println(stringObjectMap);
        }
    }

    /**
     * 6. 查询所有记录,将其封装为Emp对象的List集合
     */

    @Test
    public void test6(){
        String sql = "select * from emp";
        //自己实现RowMapper<Emp>接口比较麻烦(需自己实现抽象方法),所以我们一般使用test6_2的方法
        List<Emp> list = template.query(sql, new RowMapper<Emp>() {

            @Override
            public Emp mapRow(ResultSet rs, int i) throws SQLException {
                Emp emp = new Emp();
	//rs.getInt()括号里面是mysql的列名
                int id = rs.getInt("id");
                String ename = rs.getString("ename");
                int job_id = rs.getInt("job_id");
                int mgr = rs.getInt("mgr");
                Date joindate = rs.getDate("joindate");
                double salary = rs.getDouble("salary");
                double bonus = rs.getDouble("bonus");
                int dept_id = rs.getInt("dept_id");
	
	//下面setId等方法,是你对应实体类的方法
                emp.setId(id);
                emp.setEname(ename);
                emp.setJob_id(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDept_id(dept_id);

                return emp;
            }
        });


        for (Emp emp : list) {
            System.out.println(emp);
        }
    }

    /**
     * 6. 查询所有记录,将其封装为Emp对象的List集合
     */

    @Test
    public void test6_2(){
        String sql = "select * from emp";
	//Emp.class是你对应的实体类的字节码文件
        List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
        for (Emp emp : list) {
	//获取对象就可以做很多事情了,可以单单输出它们的姓名
            System.out.println(emp);
        }
    }

    /**
     * 7. 查询总记录数
     */

    @Test
    public void test7(){
        String sql = "select count(id) from emp";
        //写对应查出来的包装类型.class,若查出来是int类型,则写Integer.class
        Long total = template.queryForObject(sql, Long.class);
        System.out.println(total);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值