JavaWeb项目之QQ Zone:(二)对象封装

2.1 用户登陆

UserBasic类:

package qqzone.pojo;

import java.util.List;

public class UserBasic {
    private Integer id;
    private String loginId;
    private String nickName;
    private String pwd;
    private String headImg;

    private UserDetail userDetail;      //1:1
    private List<Topic> topicList;      //1:N
    private List<UserBasic> friendList; //M:N


    public UserBasic(){}

    public UserBasic(Integer id) {
        this.id = id;
    }

    public UserBasic(Integer id, String loginId, String nickName, String pwd, String headImg, UserDetail userDetail, List<Topic> topicList, List<UserBasic> friendList) {
        this.id = id;
        this.loginId = loginId;
        this.nickName = nickName;
        this.pwd = pwd;
        this.headImg = headImg;
        this.userDetail = userDetail;
        this.topicList = topicList;
        this.friendList = friendList;
    }

    public Integer getId() {
        return id;
    }

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

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getHeadImg() {
        return headImg;
    }

    public void setHeadImg(String headImg) {
        this.headImg = headImg;
    }

    public UserDetail getUserDetail() {
        return userDetail;
    }

    public void setUserDetail(UserDetail userDetail) {
        this.userDetail = userDetail;
    }

    public List<Topic> getTopicList() {
        return topicList;
    }

    public void setTopicList(List<Topic> topicList) {
        this.topicList = topicList;
    }

    public List<UserBasic> getFriendList() {
        return friendList;
    }

    public void setFriendList(List<UserBasic> friendList) {
        this.friendList = friendList;
    }
}

Topic类:

package qqzone.pojo;

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.List;

public class Topic {
    private Integer id;
    private String title;
    private String content;
    private Timestamp topicDate;
    private UserBasic author;
    private List<Reply> replyList;     //1:N

    public Topic(){

    }

    public Topic(Integer id) {
        this.id = id;
    }

    public Topic(Integer id, String title, String content, Timestamp topicDate, UserBasic author, List<Reply> replyList) {
        this.id = id;
        this.title = title;
        this.content = content;
        this.topicDate = topicDate;
        this.author = author;
        this.replyList = replyList;
    }

    public Integer getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Timestamp getTopicDate() {
        return topicDate;
    }

    public void setTopicDate(Timestamp topicDate) {
        this.topicDate = topicDate;
    }

    public UserBasic getAuthor() {
        return author;
    }

    public void setAuthor(UserBasic author) {
        this.author = author;
    }

    public List<Reply> getReplyList() {
        return replyList;
    }

    public void setReplyList(List<Reply> replyList) {
        this.replyList = replyList;
    }
}

UseController类:

package qqzone.controller;

import qqzone.pojo.Topic;
import qqzone.pojo.UserBasic;
import qqzone.service.TopicService;
import qqzone.service.UserBasicService;

import javax.servlet.http.HttpSession;
import java.util.List;

public class UserController {
    private UserBasicService userBasicService = null;
    private TopicService topicService = null;

    public String login(String loginId, String pwd, HttpSession session){
        // 1.登陆验证
        UserBasic userBasic = userBasicService.login(loginId, pwd);
        if(userBasic != null){
            List<UserBasic> friendList = userBasicService.getFriendList(userBasic);
            List<Topic> topicList = topicService.getTopicList(userBasic);

            userBasic.setFriendList(friendList);
            userBasic.setTopicList(topicList);

            session.setAttribute("userBasic", userBasic);
            session.setAttribute("friend", userBasic);
            return "index";
        }
        return "login";
    }
    ...
}

2.2 问题描述

Can not set com.atguigu.qqzone.pojo.UserBasic field com.atguigu.qqzone.pojo.Topic.author to java.lang.Integer

即Topic类中的属性Author是一个UserBasic对象,但是在数据库中,t_topic表中存储的author字段为t_user_basic表的主键引用,是一个int值,所以在查询封装对象的时候,无法将一个Integer对象赋值给一个UserBasic对象。

2.3 解决方案

修改BaseDAO中的getInstance()和getForList(),在进行对象属性赋值的时候,通过属性的类型进行判断是否可以直接赋值,若是自定义的类型则需要进行创建自定义对象后再赋值。.

public T getInstance(String sql, Object ...args){
    PreparedStatement ps = null;
    Connection connection = null;
    ResultSet rs = null;
    try {
        connection = JDBCUtils.getConnection();
        ps = connection.prepareStatement(sql);
        for (int i = 0; i < args.length; i++) {
            ps.setObject(i + 1, args[i]);
        }
        rs = ps.executeQuery();

        if(rs.next()){
            T t = clazz.getDeclaredConstructor().newInstance();
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            for (int i = 0; i < columnCount; i++) {
                Object columnValue = rs.getObject(i + 1);
                String columnLabel = metaData.getColumnLabel(i + 1);

                Field field = clazz.getDeclaredField(columnLabel);

                String typeName = field.getType().getName();
                //对象属性赋值判断
                if (isMyType(typeName)){
                    Class<?> typeNameClass = Class.forName(typeName);
                    Constructor<?> constructor = typeNameClass.getDeclaredConstructor(Integer.class);
                    columnValue = constructor.newInstance(columnValue);
                }

                field.setAccessible(true);
                field.set(t, columnValue);
            }
            return t;
        }
        return null;
    } catch (Exception e) {
        e.printStackTrace();
        throw new BaseDAOException("BaseDAO层getInstance操作出现异常...");
    } finally {
        JDBCUtils.closeResource(null,ps, rs);
    }
}


public List<T> getForList(String sql, Object ...args){
    PreparedStatement ps = null;
    Connection connection = null;
    ResultSet rs = null;
    try {
        connection = JDBCUtils.getConnection();
        ps = connection.prepareStatement(sql);
        for (int i = 0; i < args.length; i++) {
            ps.setObject(i + 1, args[i]);
        }
        rs = ps.executeQuery();

        //创建集合对象
        List<T> list = new ArrayList<>();

        while(rs.next()){
            T t = clazz.getDeclaredConstructor().newInstance();
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            for (int i = 0; i < columnCount; i++) {
                Object columnValue = rs.getObject(i + 1);
                String columnLabel = metaData.getColumnLabel(i + 1);
                Field field = clazz.getDeclaredField(columnLabel);
                String typeName = field.getType().getName();
                //对象属性赋值判断
                if (isMyType(typeName)){
                    Class<?> typeNameClass = Class.forName(typeName);
                    Constructor<?> constructor = typeNameClass.getDeclaredConstructor(Integer.class);
                    columnValue = constructor.newInstance(columnValue);
                }
                field.setAccessible(true);
                field.set(t, columnValue);
            }
            list.add(t);
        }
        return list;
    } catch (Exception e) {
        e.printStackTrace();
        throw new BaseDAOException("BaseDAO层getForList操作出现异常...");
    } finally {
        JDBCUtils.closeResource(null,ps, rs);
    }
}

private boolean isNotMyType(String typeName){
        return "java.lang.Integer".equals(typeName)
                || "java.lang.String".equals(typeName)
                || "java.util.Date".equals(typeName)
                || "java.sql.Date".equals(typeName)
                || "java.sql.Timestamp".equals(typeName);
    }

private boolean isMyType(String typeName){
    return !isNotMyType(typeName);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值