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);
}