<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-->카드형태를 만들 때 주로 사용,elevation = 살짝 띄움 그림자효과<-->
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardBackgroundColor="#FFFFFFFF"
app:cardCornerRadius="10dp"
app:cardElevation="5dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/img1"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="5dp"
app:srcCompat="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="할일 제목"
android:textSize="26sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvTagetDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="2"
android:text="목표일자"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvDone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:gravity="right"
android:text="완료여부"
android:textAlignment="center"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
// 외부 조인해서 가져오기 메소드
public User getUserAndTodos(String userName) {
User user = null;
List<Todo> todoList = new ArrayList<Todo>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "";
sql += " SELECT u.id as user_id, u.password, u.userName, u.firstName, u.lastName, ";
sql += " t.id as todo_id, t.title, t.description, t.target_date, t.is_done ";
sql += " FROM users u LEFT OUTER JOIN todos t on u.userName = t.username ";
sql += " WHERE u.userName = ? ";
sql += " ORDER BY target_date DESC ";
try {
conn = JDBCUtils.getConnection();
// 이렇게 설정하면 rs에서 커서를 마음대로 움직일 수 있음
pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
pstmt.setString(1, userName);
rs = pstmt.executeQuery();
while (rs.next()) {
Todo todo = new Todo();
todo.setId(rs.getLong("todo_id"));
todo.setTitle(rs.getString("title"));
todo.setDescription(rs.getString("description"));
todo.setTargetDate(rs.getDate("target_date").toLocalDate());
todo.setStatus(rs.getBoolean("is_done"));
todoList.add(todo); // 리스트에 추가
} // while
// 1:N일 경우 1은 반복적인 데이터 이니 한 번만 등록
// 마지막 데이터 행으로 커서위치로 이동
if (rs.last()) {
user = new User();
user.setUserName(rs.getString("userName"));
user.setFirstName(rs.getString("firstName"));
user.setLastName(rs.getString("lastName"));
user.setPassword(rs.getString("password"));
user.setTodolist(todoList);
};
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(conn, pstmt, rs);
}
return user;
}// getUserAndTodos
public List<User> getAllUserAndTodoCount() {
List<User> userList = new ArrayList<User>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "";
sql += " SELECT u.id as user_id, u.userName, u.firstName, u.lastName, ";
sql += " COUNT(t.username) as todo_count ";
sql += " FROM users u LEFT OUTER JOIN todos t on u.userName = t.username ";
sql += " GROUP BY u.userName ";
sql += " ORDER BY target_date DESC ";
try {
conn = JDBCUtils.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
User user = new User();
user.setUserName(rs.getString("userName"));
user.setFirstName(rs.getString("firstName"));
user.setLastName(rs.getString("lastName"));
user.setTodoCount(rs.getInt("todo_count"));
userList.add(user);
} // while
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(conn, pstmt, rs);
}
return userList;
}// getUserAndTodos
Integer로 받는 이유는 Integer가 객체이기 때문에 null 값이 들어와도 에러가 생기지 않고 받을 수 있다.
private List<Todo> todolist; // 테이블 조인에서 1:N의 관계(1에다가 설정)
private Integer todoCount;
<User>
와 totalCount를 받을 bean 클래스를 생성package todoApp.rest.todo;
import java.util.List;
import todoApp.model.User;
public class TodoListUsersResult {
private boolean hasResult;
private int totalCount;
private List<User> userlist; // 조인결과로 user가 todoList를 포함함
public boolean isHasResult() {
return hasResult;
}
public void setHasResult(boolean hasResult) {
this.hasResult = hasResult;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List<User> getUserlist() {
return userlist;
}
public void setUserlist(List<User> userlist) {
this.userlist = userlist;
}
@Override
public String toString() {
return "TodoListUsersResult [hasResult=" + hasResult + ", totalCount=" + totalCount + ", userlist=" + userlist
+ "]";
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TodoRestServlet doGet() 호출됨");
// 레코드 한개 조회
// http://localhost:8090/todo/api/todo?category=one&id=1
// 레코드 특정 사용자의 데이터(여러개) 조회
// http://localhost:8090/todo/api/todo?category=me&username=hong
// 레코드 전체(여러개) 조회
// http://localhost:8090/todo/api/todo?category=all
String category = request.getParameter("category");
String strJson = "";
if (category.equals("one")) {
strJson = processGetOne(request);
} else if (category.equals("me")) {
strJson = processGetMe(request);
} else if (category.equals("all")) {
strJson = processGetAll(request);
}
sendResponse(strJson, response);
}
private String processGetOne(HttpServletRequest request) {
String strId = request.getParameter("id");
long id = Long.parseLong(strId);
Todo todo = todoDao.selectTodo(id);
TodoOneResult todoOneResult = new TodoOneResult();
if (todo != null) {
todoOneResult.setTodo(todo);
todoOneResult.setHasResult(true);
} else {
todoOneResult.setHasResult(false);
}
String strJson = gson.toJson(todoOneResult);
System.out.println("strJson = " + strJson);
return strJson;
}
private String processGetMe(HttpServletRequest request) {
String username = request.getParameter("username");
User user = todoDao.getUserAndTodos(username);
TodoListResult todoListResult = new TodoListResult();
if (user != null) {
todoListResult.setHasResult(true);
todoListResult.setTotalCount(user.getTodolist().size());
todoListResult.setUser(user);
} else { // user == null
todoListResult.setHasResult(false);
todoListResult.setTotalCount(0);
}
String strJson = gson.toJson(todoListResult);
System.out.println("strJson = " + strJson);
return strJson;
}
private String processGetAll(HttpServletRequest request) {
List<User> userList = todoDao.getAllUserAndTodoCount();
TodoListUsersResult result = new TodoListUsersResult();
if (userList.size() > 0) {
result.setUserlist(userList);
result.setHasResult(true);
result.setTotalCount(userList.size());
} else {
result.setHasResult(false);
result.setTotalCount(userList.size());
}
String strJson = gson.toJson(result);
System.out.println("strJson = " + strJson);
return strJson;
} // doGet