Tuesday, September 9, 2014

JSP + MyBatis + MySql 샘플

참고: http://www.mybatis.org/core/ko/index.html

아래 순서로 설명.
1. MySql DB 구축
2. 웹앱 생성
3. MyBatis 설정
  3.1. 필요한 라이브러리 설치
  3.2. 환경 설정
  3.3. 맵퍼 생성
  3.4. JSP 연동
4. 웹 페이지 생성
5. 테스트

최종 폴더 구조:



1. MySql DB 구축
- 테스트용 계정을 아래와 같이 설정했다.
User name : "username"
Password : "password"

1) test 스키마를 생성한다.
mysql> create schema test;

2) users 테이블을 생성한다.
mysql> use test;

mysql> create table users (
`username` varchar(255) not null,
`password` varchar(255) not null,
`email` varchar(255) not null,
primary key (`username`)
) default charset=utf8;

3) user 를 생성한다.
mysql> create user 'username'@'localhost' identified by 'password';

4) test 스키마에 대한 권한을 설정한다.
mysql> grant all privileges on test.* to 'username'@'locahost';

2. 웹앱 생성
- 폴더 구조
+ $WEB_APP/
  + WEB-INF/
    + libs/
    - web.xml
  + index.jsp

web.xml 소스:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  4.  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  5.  metadata-complete="true" version="3.0">  
  6.    
  7.  <welcome-file-list>  
  8.  <welcome-file>index.jsp</welcome-file>  
  9.  </welcome-file-list>  
  10.    
  11. </web-app>  

3. MyBatis 설정
3.1. 필요한 라이브러리 설치
- 다운로드

- 위 파일들을 다운로드 받아 $WEB_APP/WEB-INF/libs/ 에 복사한다.
!) MyBatis 폴더에 lib 폴더에 있는 파일들도 복사한다.
  • asm-3.3.1.jar
  • cglib-2.2.2.jar
  • commons-dbcp-1.4.jar
  • commons-logging-1.1.1.jar
  • commons-pool-1.6.jar
  • log4j-1.2.16.jar
  • mybatis-3.1.1.jar
  • mysql-connector-java-5.1.20-bin.jar
  • slf4j-api-1.6.2.jar
  • slf4j-log4j12-1.6.2.jar

3.2. 환경 설정
- mybatis 설정 파일인 mybatis-config.xml 파일을 생성한다.(파일 이름은 중요하지 않다)
!) com.sample.mybatis.config 패키지에 생성하였다.
!) 파일 내용: JDBC 설정만 들어 있다.
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration  
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5.   
  6. <configuration>  
  7.    
  8.  <environments default="development">  
  9.   <environment id="development">  
  10.    <transactionManager type="JDBC"/>  
  11.    <dataSource type="POOLED">  
  12.     <property name="driver" value="com.mysql.jdbc.Driver"/>  
  13.     <property name="url" value="jdbc:mysql://localhost:3306/test"/>  
  14.     <property name="username" value="username"/>  
  15.     <property name="password" value="password"/>  
  16.    </dataSource>  
  17.   </environment>  
  18.  </environments>  
  19.   
  20. </configuration>  

3.3. 맵퍼 생성
- 필요한 파일들
  • User.java - 레코드 아이템
  • UserMapper.java - SQL 문 수행을 위한 인터페이스
  • UserMap.xml - SQL 문 맵퍼

 - 소스 코드들
com.sample.mybatis.dto.User.java:
  1. package com.sample.mybatis.dto;  
  2.   
  3. public class User {  
  4.  private String username;  
  5.  private String password;  
  6.  private String email;  
  7.    
  8.  public String getUsername() {  
  9.   return username;  
  10.  }  
  11.  public void setUsername(String username) {  
  12.   this.username = username;  
  13.  }  
  14.  public String getPassword() {  
  15.   return password;  
  16.  }  
  17.  public void setPassword(String password) {  
  18.   this.password = password;  
  19.  }  
  20.  public String getEmail() {  
  21.   return email;  
  22.  }  
  23.  public void setEmail(String email) {  
  24.   this.email = email;  
  25.  }  
  26. }  
com.sample.mybatis.dao.UserMapper.java:
  1. package com.sample.mybatis.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.sample.mybatis.dto.User;  
  6.   
  7. public interface UserMapper {  
  8.  public List<User> selectAllUsers();  
  9.  public User selectUser(String username);  
  10.  public void insertUser(User user);  
  11.  public void updateUser(User user);  
  12.  public void deleteUser(String username);  
  13. }  
com.sample.mybatis.sqlmap.UserMap.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">  
  3.   
  4. <mapper namespace="com.sample.mybatis.dao.UserMapper">  
  5.   
  6. <select id="selectAllUsers" resultType="User">  
  7.  select username as username,  
  8.   password as password,  
  9.   email as email  
  10.  from users;  
  11. </select>  
  12.   
  13. <select id="selectUser" parameterType="string" resultType="User">  
  14.  select username as username,  
  15.   password as password,  
  16.   email as email  
  17.  from users  
  18.  where username=#{username};  
  19. </select>  
  20.   
  21. <insert id="insertUser" parameterType="User">  
  22.  insert into users (username, password, email)  
  23.   values (#{username}, #{password}, #{email});  
  24. </insert>  
  25.   
  26. <update id="updateUser" parameterType="User">  
  27.  update users set  
  28.   password=#{password},  
  29.   email=#{email}  
  30.  where username=#{username}  
  31. </update>  
  32.   
  33. <delete id="deleteUser" parameterType="string">  
  34.  delete from users  
  35.   where username=#{username}  
  36. </delete>  
  37.   
  38. </mapper>  

- mybatis-config.xml 에 추가
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration  
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5.   
  6. <configuration>  
  7.   
  8.  <!-- Type alias -->  
  9.  <typeAliases>  
  10.   <typeAlias alias="User" type="com.sample.mybatis.dto.User"/>  
  11.  </typeAliases>  
  12.    
  13.  <environments default="development">  
  14.   <environment id="development">  
  15.    <transactionManager type="JDBC"/>  
  16.    <dataSource type="POOLED">  
  17.     <property name="driver" value="com.mysql.jdbc.Driver"/>  
  18.     <property name="url" value="jdbc:mysql://localhost:3306/test"/>  
  19.     <property name="username" value="username"/>  
  20.     <property name="password" value="password"/>  
  21.    </dataSource>  
  22.   </environment>  
  23.  </environments>  
  24.   
  25.  <!-- UserMap.xml 등록 -->  
  26.  <mappers>  
  27.   <mapper resource="com/sample/mybatis/sqlmap/UserMap.xml" />  
  28.  </mappers>  
  29. </configuration>  

3.4. JSP 연동
- 서버 시작시에 SqlSessionFactory 를 생성해야 한다.
- SqlSessionFactory 를 생성하는 서블릿을 생성한다.

com.sample.mybatis.config.MyBatisConfig.java : 서버 시작시 init 함수가 실행된다.
  1. package com.sample.mybatis.config;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5.   
  6. import javax.servlet.http.HttpServlet;  
  7.   
  8. import org.apache.ibatis.io.Resources;  
  9. import org.apache.ibatis.session.SqlSessionFactory;  
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  11.   
  12. public class MyBatisConfig extends HttpServlet {  
  13.    
  14.  private static SqlSessionFactory sqlSessionFactory;  
  15.    
  16.  public void init() {  
  17.     
  18.   try {  
  19.    InputStream inputStream = Resources.getResourceAsStream("com/sample/mybatis/config/mybatis-config.xml");  
  20.    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  21.   } catch (IOException e) {  
  22.    e.printStackTrace();  
  23.   }  
  24.  }  
  25.   
  26.  public static SqlSessionFactory getSqlSessionFactory() {  
  27.   return sqlSessionFactory;  
  28.  }  
  29.   
  30.  public static void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {  
  31.   MyBatisConfig.sqlSessionFactory = sqlSessionFactory;  
  32.  }  
  33. }  

- web.xml 설정 : load-on-startup 을 설정해 줘야 한다.
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  4.  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  5.  metadata-complete="true" version="3.0">  
  6.    
  7.  <!-- MyBatis initializer 등록 -->  
  8.  <servlet>  
  9.  <servlet-name>MyBatisInitializer</servlet-name>  
  10.  <servlet-class>com.sample.mybatis.config.MyBatisConfig</servlet-class>  
  11.    
  12.  <load-on-startup>1</load-on-startup>  
  13.  </servlet>  
  14.    
  15.  <welcome-file-list>  
  16.  <welcome-file>index.jsp</welcome-file>  
  17.  </welcome-file-list>  
  18.    
  19. </web-app>  

4. 웹 페이지 생성
- User 레코드 생성, 수정, 삭제 할 수 있는 페이지 (validation 미포함)

user_control.jsp : 
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ page import="com.sample.mybatis.config.MyBatisConfig" %>  
  3. <%@ page import="com.sample.mybatis.dao.*" %>  
  4. <%@ page import="com.sample.mybatis.dto.*" %>  
  5. <%@ page import="org.apache.ibatis.session.*" %>  
  6. <%@ page import="java.util.*" %>  
  7.   
  8. <%  
  9.   
  10. // handle operation  
  11.   
  12. if (request.getMethod().equalsIgnoreCase("POST")) {  
  13.    
  14.  SqlSession sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);  
  15.  try {  
  16.   UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  17.    
  18.   String subtype = request.getParameter("subtype");  
  19.   if (subtype.equals("create-user")) {  
  20.    User user = new User();  
  21.    user.setUsername(request.getParameter("username"));  
  22.    user.setPassword(request.getParameter("password"));  
  23.    user.setEmail(request.getParameter("email"));  
  24.    userMapper.insertUser(user);  
  25.   } else if (subtype.equals("modify-user")) {  
  26.    User user = new User();  
  27.    user.setUsername(request.getParameter("username"));  
  28.    user.setPassword(request.getParameter("password"));  
  29.    user.setEmail(request.getParameter("email"));  
  30.    userMapper.updateUser(user);  
  31.   } else if (subtype.equals("delete-user")) {  
  32.    userMapper.deleteUser(request.getParameter("username"));  
  33.   }  
  34.  } finally {  
  35.   sqlSession.close();  
  36.  }  
  37. }  
  38.   
  39. // select users  
  40. List<User> users = null;  
  41.   
  42. SqlSession sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);  
  43. try {  
  44.  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
  45.    
  46.  users = userMapper.selectAllUsers();  
  47.    
  48. } finally {  
  49.  sqlSession.close();  
  50. }  
  51. %>  
  52.   
  53. <!DOCTYPE html>  
  54. <html>  
  55. <head>  
  56. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  57. <title>User Control</title>  
  58. </head>  
  59. <body>  
  60.   
  61. <h2>Create User</h2>  
  62. <form name="create-form" method="post">  
  63. <input type="hidden" name="subtype" value="create-user" />  
  64. Username: <input type="text" name="username" value="" />  
  65.   
  66. Password: <input type="password" name="password" value="" />  
  67.   
  68. Email: <input type="email" name="email" value="" />  
  69.   
  70. <input type="submit" value="Create" />  
  71. </form>  
  72.   
  73. <h2>User List</h2>  
  74. <ul>  
  75. <%  
  76. if (users == null || users.size() == 0) {  
  77.  %><li>no user</li><%  
  78. } else {  
  79.  for (User user : users) {  
  80. %>  
  81.  <li style="border:solid 1px black;padding:4px;margin-bottom:5px;">  
  82.  <form name="modify-form" method="post">  
  83.  <input type="hidden" name="subtype" value="modify-user" />  
  84.  <input type="hidden" name="username" value="<%= user.getUsername() %>" />  
  85.  Username: <%= user.getUsername() %>  
  86.   
  87.  Password: <input type="password" name="password" value="" />  
  88.   
  89.  Email: <input type="text" name="email" value="<%= user.getEmail() %>" />  
  90.   
  91.  <input type="submit" value="Modify" />  
  92.  </form>  
  93.  <form name="delete-form" method="post">  
  94.  <input type="hidden" name="subtype" value="delete-user" />  
  95.  <input type="hidden" name="username" value="<%= user.getUsername() %>" />  
  96.  <input type="submit" value="Delete" />  
  97.  </form>  
  98.  </li>  
  99. <%  
  100.  }  
  101. }  
  102. %>  
  103. </ul>  
  104.   
  105. </body>  
  106. </html>  
!) SqlSessionFactory.openSession() 함수에 true 를 인자로 주면 작업이 끝나면 자동으로 commit 한다.

5. 테스트




ref: http://webfortj.blogspot.com/2012/07/jsp-mybatis-mysql.html

No comments:

Post a Comment