본문 바로가기

컴퓨터 프로그래밍/SpringFrameWork

[SFW]02

 

MyBatis

 

MyBatis 라이브러리를 다운 받습니다. 

https://blog.mybatis.org/p/products.html

 

Products

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

 

이것은 mybatisDB(sql)과 연결 되는 것은 위에 라이브러리를 통해서 됩니다. 이를 통해서 가져온 data를 core(DI)연결해야 사용할 수 있습니다. 그러기위해서는 DI랑 연결하는게 필요합니다. 그것이 아래있는 것입니다. 

 

MyBatis

MyBatis 는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. MyBatis 는 JDBC 코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거한다. MyBatis 는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML 과 애노테이션을 사용할 수 있다.

시작하기

모든 MyBatis 애플리케이션은 SqlSessionFactory 인스턴스를 사용한다. SqlSessionFactory 인스턴스는 SqlSessionFactoryBuilder 사용하여 만들수 있다. SqlSessionFactoryBuilder 는 XML 설정파일에서 SqlSessionFactory 인스턴스를 빌드할 수 있다.

예제를 통해서 MyBatis를 파헤쳐 봅니다. 

- DB를 만들고, VO를 만듭니다. 

create table mysawon(
num int(10) auto_increment primary key,
id varchar(10) not null,
pwd varchar(20),
name varchar(20),
age int(3),
hiredate date,
constraint mysawon_id_uq unique(id));

MySawon.java

package com.encore.myBatis.vo;
/*
 * Framwork에서는 반드시 기본 생성자를 넣어야 합니다.
 * myBatis에서는 값의 주입을 setter로 하고 받아 올때는 getter로 합니다. 
 * 값의 주입을 생성자로 하지 않습니다. 그러니까, 생성자를 따로 만들지 않습니다. 
 * 그러면, 알아서 기본 생성자를 만듭니다. 
 */
public class MySawon {
	private int num, age;
	private String id, pwd, name, hiredate;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getHiredate() {
		return hiredate;
	}
	public void setHiredate(String hiredate) {
		this.hiredate = hiredate;
	}

	
	
}

 

1. DB서버 연결 정보

dbconn.properties

### dbconn.properties file....dbServer Information Storing
jdbc.mysql.driver=com.mysql.cj.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/scott?characterEncoding=UTF-8&serverTimezone=UTC
jdbc.mysql.username=root
jdbc.mysql.password=1234

*DB서버에 대한 상수값에 대한 정보를 메타데이터화 합니다. 맵 방식으로 넣습니다.

 

mysawon_mapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper     
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mysawonMapper">
<!--테이블명 뒤에 mapper를 붙인다. 엔티티당 도메인(vo)이 여러개 나온다. 각각의  mapper를 구분하기 위해서 namespace를 씁니다.-->
	
	<insert id="sawonAdd" parameterType="mySawon">
	<!--여기 알리아스된 것을 파라미터 타입으로 넣습니다.<typeAlias type="com.encore.myBatis.vo.MySawon" alias="mySawon"/>   -->
	INSERT
	INTO mysawon (id, pwd, name, age, hiredate) VALUES(#{id}, #{pwd}, #{name}, #{age}, curDate)
	<!--VO.getId()=>#{id}  -->
	</insert>
	
	<select id="sawonList" resultType="mySawon"><!--여기서 결과타입이 ArrayList<mySawon>인데, 제너릭을 써줍니다. -->
	SELECT
	num, id, name, age, hiredate
	FROM mysawon
	ORDER BY num DESC
	</select>
	
</mapper>

*dtd 선언부에 유의해야합니다. 

 

위에 두가지 파일을 가지는

SqlMapConfig.xml을 만듭니다. 

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- wiring 시킨다. 자동으로 연결시킨다. 비슷한 것이 이것을 가진다. hasing -->
	<properties resource="config/dbconn.properties" />
	
	<typeAliases>
		<typeAlias type="com.encore.myBatis.vo.MySawon" alias="mySawon"/>
		<!-- typeAlias의 의미는 VO를 의미합니다. alias는 vo객체 이름에서 앞에 
        대문자만 소문자로 바꿉니다. MySawon에서 mySawon으로-->
	</typeAliases>
	
	<!--default와 id를 아무 값이나 똑같은 걸 넣어야한다.   -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="UNPOOLED">
				<!--datasource방식일때는 pooled, or JDNI로 쓸수 있습니다.unpooled는 drivermanager방식 -->
				<!-- setDriver("com.mysql.cj.jdbc.Driver") -->
				<!-- 
				현재 지금 하드코딩 되어 있습니다. 그래서 모듈화 된 걸로 바꿔줍니다. 
                EL을 사용하게 됩니다. 그안에 properties에 있는 key를 통해서 값을 가져옵니다. 
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/scott?characterEncoding=UTF-8&serverTimezone=UTC"/>
				<property name="username" value=root/>
				<property name="password" value="1234"/>
				-->
				<property name="driver" value="${jdbc.mysql.driver}"/>
				<property name="url" value="${jdbc.mysql.url}"/>
				<property name="username" value="${jdbc.mysql.username}"/>
				<property name="password" value="${jdbc.mysql.password}"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="mapper/mysawon_mapping.xml"/>
	</mappers>
</configuration>

test를 합니다. 

SimpleMyBatisAppTest.java

package com.encore.myBatis.test;

import java.io.Reader;
import java.util.Scanner;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.encore.myBatis.vo.MySawon;

/*
 * Scanner를 통해서 값을 입력(화면을 대신한다.)
 * 입력 받은 값을 MyBatis 라이브러리를 사용해서
 * DB에 Access하는 로직을 작성
 */

public class SimpleMyBatisAppTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// VO에 있는 값을 넣는 것입니다.
		MySawon vo=new MySawon();
		
		System.out.println("아이디: ");
		vo.setId(sc.next());
		
		System.out.println("비밀번호: ");
		vo.setPwd(sc.next());
		
		System.out.println("이름: ");
		vo.setName(sc.next());
		
		System.out.println("나이: ");
		vo.setAge(sc.nextInt());
		
		//MyBatis 라이브러리 사용-> 그림을 완성합니다.
		try {
			//1. SqlMapConfig.xml을 읽어 들입니다. 
			Reader r=Resources.getResourceAsReader("config/SqlMapConfig.xml");
			
			//2. SqlSessionFactory를 리턴받는다.
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(r);
			
			//3. SqlSession을 리턴받는다. 
			SqlSession session = factory.openSession();
			
			//4. session에 쿼리문을 실행하는 모든 기능이 다 있다. 
			// insert(), delete(), update(), selectList(), selectOne()
			// session.
			session.insert("mysawonMapper.sawonAdd", vo);
			session.commit();//dml(다라이버 매니저 로딩방식)일때는 반드시 넣어 줘야함
			session.close();//spring di일때는 포함되어 있다. 
			
			System.out.println(vo.getName()+"님 정보 입력 성공^^");
		}catch(Exception e) {
			System.out.println(e);
		}
	}
}

SimpleMyBatisAppTest2.java

package com.encore.myBatis.test;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.encore.myBatis.vo.MySawon;


/*
 * mysawon 테이블에 있는 모든 사원의 정보를 출력하는 코드를 작성
 */

public class SimpleMyBatisAppTest2 {
	public static void main(String[] args) {
		
		try {
			//1. SqlMapConfig.xml을 읽어 들입니다. 
			Reader r=Resources.getResourceAsReader("config/SqlMapConfig.xml");
			
			//2. SqlSessionFactory를 리턴받는다.
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(r);
			
			//3. SqlSession을 리턴받는다. 
			SqlSession session = factory.openSession();
			
			System.out.println("==================================================");
			/*
			 *  SqlSession 
			 * query statement  execute method
			 * INSERT INTO -----insert() 
			 * DELETE FROM -----delete()
			 * UPDATE TABLE-----update()
			 * SELECT ALL-------List selectList()
			 * SELECT ONE-------Object selectOne()
			 */
			
	
			List<MySawon> list = session.selectList("mysawonMapper.sawonList");
			for (MySawon vo : list)
				System.out.println(vo.getId()+","+vo.getName()+","+vo.getHiredate());
		}catch(Exception e) {
			System.out.println(e);
		}
	}
}

//1. SqlMapConfig.xml을 읽어 들입니다.

Reader r=Resources.getResourceAsReader("config/SqlMapConfig.xml");

//2. SqlSessionFactory리턴받는다.

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(r);

//3. SqlSession리턴받는다.

SqlSession session = factory.openSession();

 

위 부분을 따로 만듭니다. 

package com.encore.myBatis.test;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/*
 * sqlSessionFactory 하나 받아 오는 로직을 따로 분리합니다. 
 */
public class FactoryService {
	static SqlSessionFactory factory;
	static {
		try {
			Reader r=Resources.getResourceAsReader("config/SqlMapConfig.xml");
			factory = new SqlSessionFactoryBuilder().build(r);
		}catch(Exception e) {
			System.out.println(e);
		}
	}//static
	
	public static SqlSessionFactory getFactory() {
		return factory;
	}
}

SimpleMyBatisAppTest3.java

package com.encore.myBatis.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.encore.myBatis.vo.MySawon;

public class SimpleMyBatisAppTest3 {
	public static void main(String[] args) {
		SqlSessionFactory factory = FactoryService.getFactory();
		SqlSession session = factory.openSession();
		
		List<MySawon> list = session.selectList("mysawonMapper.sawonList");
		for (MySawon vo : list)
			System.out.println(vo.getId() + "," + vo.getName() + "," + vo.getHiredate());
	}
}

 

 

본격적으로 예제를 통해서 MyBatis를 사용해 봅니다. 

DB 구축

create table mysawon(
num int(10) auto_increment primary key,
id varchar(10) not null,
pwd varchar(20),
name varchar(20),
age int(3),
hiredate date,
constraint mysawon_id_uq unique(id));

VO 객체 생성

User.java

package ibatis.services.domain;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

/*
 * FileName : User.java  
 * ㅇ User 의 정보를 갖는 Value Object (도메인객체,비지니스객체)
 * ㅇ USERS TABLE 의 1개의 ROW 의 정보를 갖는다.  
*/ 
public class User implements Serializable {

	///Field
    private String userId; 			// 회원 ID 
    private String userName;		// 회원 이름 
    private String password;     // 비밀번호 
    private Integer age;    			// 나이 :: Integer wrapper class 사용 :: 추후 용도 확인  
    private int grade;    				// 등급 :: int primitive 사용 :: :: 추후 용도 확인 
    private Timestamp regDate	= new Timestamp(new Date().getTime()); // 가입일자 
    private boolean active; 
    
    ///Constructor
    public User() {
	}
    public User (	String userId, String userName,String password, 
    							  	Integer age, int grade ) {
		this.userId = userId;
		this.userName = userName;
		this.password = password;
		this.age = age;
		this.grade = grade;
	}    

	///Method (getter/setter)
	public String getUserId(){
		return this.userId;
	}
	public void setUserId( String userId ){
	   this.userId= userId;
	}
	public String getPassword(){
	   return this.password;
	}
	public void setPassword( String password ){
	   this.password= password;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public java.sql.Timestamp getRegDate() {
		return regDate;
	}
	public void setRegDate(java.sql.Timestamp regDate) {
		this.regDate = regDate;
	}
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public void setActive(boolean active) {
		this.active = active;
	}
	public boolean isActive() {
		return active;
	}
	@Override
	public String toString() {
		return "User [userid=" + userId + ", userName=" + userName + ", password="
				+ password + ", age=" + age + ", grade=" + grade+ ", active=" + active
				+ ", regDate=" + regDate + "]";
	}
}//end of class

DB의 컬럼명과 VO객체의 field명이 다릅니다. DB같은 경우 _로 단어와 단어 사이를 구분하고, vo가 java로 된 경우 거의 대부분 camel case로 하게 됩니다.  
쿼리문을 만들 때, spring jdbc같은 경우에는 알아서 _를 카멜케이스로 만들어주지만, MyBastis의 경우는 그렇게 해주지 않으므로, 직접 as로 alias를 줘야합니다.  
아래 예시가 나옵니다. 꼭 참고합니다. 

 

dbconn.properties (DB 서버 정보를 담고 있습니다. )

### dbconn.properties file....dbServer Information Storing
jdbc.mysql.driver=com.mysql.cj.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/scott?characterEncoding=UTF-8&serverTimezone=UTC
jdbc.mysql.username=root
jdbc.mysql.password=1234

 

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!--1. properties 파일 연결  -->
	<properties resource="config/dbconn.properties" />
	
	<!-- 2.vo 연결 및 alias 지정  -->
	<typeAliases>
		<typeAlias type="ibatis.services.domain.User" alias="user"/>
	</typeAliases>
	
	<!-- 3.디비서버 정보 -->
	<environments default="develop">
		<environment id="develop">
			<transactionManager type="JDBC" />
			<dataSource type="UNPOOLED">
				<property name="driver" value="${jdbc.mysql.driver}"/>
				<property name="url" value="${jdbc.mysql.url}"/>
				<property name="username" value="${jdbc.mysql.username}"/>
				<property name="password" value="${jdbc.mysql.password}"/>
			</dataSource>	
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="sql/mybatis-userservice-mapping.xml"/>
		<mapper resource="sql/mybatis-userservice-mapping01.xml"/>
		<mapper resource="sql/mybatis-userservice-mapping02.xml"/>
		<mapper resource="sql/mybatis-userservice-mapping03.xml"/>
	</mappers>
</configuration>

<mappers></mappers>

이 사이에 계속해서 <mapper />를 넣어 줄 수 있습니다. 

 

 

컬럼명과 vo 클래스의 필드명이 다를때는 반드시 as 뒤에 필드명을 지정해야한다. 이게 Framework마다 다릅니다. 
spring JDBC는 알아서 camelcase를 바꿔줍니다. MyBatis는 꼭 바꿔줘야합니다. 

mybatis-userservice-mapping.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--	
	mybatis-userservice-mapping.xml : SQL 를 갖는 설정화일 (MetaData) 
	- MyBatis Framework 은 XML MetaData를 사용 SQL구문을 관리하며,
	  (SQL은 xml 을 통해 적절히 캡슐화 되어 애플리케이선 의 외부로 분리함)
	- SQL문의 입력(?) / 출력(?)을 매핑한다.  <== 아래의 select element 참조
 -->
 
<!-- SQL definition -->
<mapper namespace="UserMapper">
	<!--
		ㅇ Application 에서 User.getUserList id 로 아래의 SQL 을 참조 할 수 있다.    
	 -->
	 
	 <!-- 
	 	입력(?) / 출력(?) 관리의 이해
	 	- 아래의 query 수행 후 결과 resultType attribute 에 선언된 UserVO 객체 Field
	 	  ( property )에 자동연결(?,자동 바인딩)
	 	- SQL/Query 의 별칭(Alias)와 UserVO객체의 Field 의 변수이름이 동일한 것 확인.  
	  -->
	  <select id="getUserList" resultType="user">
	  <!--SQL definition  -->
	  <!--컬럼명과 vo 클래스의 필드명이 다를때는 반드시 as 뒤에 필드명을 지정해야한다. 이게 Framework마다 다릅니다.
	  spring JDBC는 알아서 camelcase를 바꿔줍니다. MyBatis는 꼭 바꿔줘야합니다. 
	  -->
	SELECT
	user_id AS userId,
	user_name AS userName,
	password AS password,
	age AS age, 
	grade AS grade,
	reg_date AS regDate
	FROM users
	  </select>
	
</mapper>

 

MyBATISTestApp.java(test)

package ibatis.services.user.test;

import ibatis.services.domain.User;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


/**
 * FileName : MyBATISTestApp.java
  * ㅇ JBDCTestApp.java 와 비교 이해.
  * ㅇ mybatis Framework 에서 제공하는 API을 사용 users table 의 정보 SELECT   
 */
public class MyBATISTestApp {
	///Main method
	public static void main(String[] args) throws Exception{
		
		Reader reader=Resources.getResourceAsReader("config/SqlMapConfig.xml");		
		
		//==> 2. Reader 객체를 이용 xml metadata 에 설정된 각정 정보를 접근, 사용가능한 
		//==>    읽어들인 reader를 바탕으로 SqlSessionFactory를 리턴받는다.
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
		
		//==> 3.factory의 openSession()을 통해서 SqlSession을 리턴 받는다.
		SqlSession session=factory.openSession();
		
		List<User> list=session.selectList("UserMapper.getUserList");
		System.out.println("#####################################");
		System.out.println(":: 회원정보 출력");
		
		for (User user : list) {
			System.out.println( user.toString() ) ;
		}
		System.out.println("#####################################");
	}// end of main
}//end of class

/*
 * ■ MyBATISTestApp / JDBCTestApp 를 통한 MyBATIS Framework 의 이해
 * ㅇ SQL,커넥션,트랜잭선 를 메타데이타 캡술화였으며, 
 *     :: 참조 => SqlMapConfig.xml / mybatis-userservice-mapping.xml
 * ㅇ JDBC철차 :  Connection => Statement => ResultSet
 *      resource 관리 : close
 *      query 수행 결과 비지니스객체(VO) 바인딩 JDBC API 를 사용하여 수행시 반복적으로 반드시
 *      수행하는 일련의 과정을 수행함.
 *      :: 참조 =>List<User> list = session.selectList("UserMapper.getUserList");
 *  
 *  ■ MyBATIS Framework 의 장점
 *  ㅇ 작고 간단하다 ( mybatis-3.2.8.jar / 약 400kb / 다른 라이브러리와 의존관계 없다. )
 *  ㅇ 기존 애플리케이션/테이터베이스 변경 불필요 
 *      (SQL Mapper(Data Mapper) =>SQL 과 비지니스 객체와의 바인딩)
 *  ㅇ 생산성 / 성능 / 작업의 분배 (소스코드와 SQL 의 분리)
 *  ㅇ 관심사의 분리 
 *       ( DBMS 에 독립적인 API제공 및 JDBC API가 아닌 비지니스 객체만 가지고 작업가능)
 *        
  *  ■ MyBATIS Framework 은 JDBC 절차를 간결화한 lib 이다
  *     ( JDBC를 절차 은닉한 lib)        
*/

 

 

1. myBatis에서 조건에 해당하는 단순 파라미터값 받아 올때는 
  #{value}문법을 사용합니다.
2. MyBatis에서 collection, 자바 라이브러리 클래스의 alias를 사용
 - string, int, list, arraylist 

 

mybatis-userservice-mapping01.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="UserMapper01">
<!--
 1. myBatis에서 조건에 해당하는 단순 파라미터값 받아 올때는 
 	#{value}문법을 사용합니다.
 2. MyBatis에서 collection, 자바 라이브러리 클래스의 alias를 사용
 - string, int, list, arraylist 
-->
 	<select id="getUser" parameterType="string" resultType="user">
		SELECT
		user_id AS userId,
		user_name AS userName,
		password AS password,
		age AS age, 
		grade AS grade,
		reg_date AS regDate
		FROM users
		WHERE user_id=#{value}
	  </select>
	
	  <select id="findUserId" parameterType="user" resultType="string">
		SELECT
		user_name
		FROM users
		WHERE user_id=#{userId} AND password=#{password}
		<!--파라미터 타입에 vo가 들어오면, #{value}해쉬맵 문법이 아닌, #{userId} 등등  -->
	  </select>
</mapper>

MyBatisTestApp01.java

package ibatis.services.user.test;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import ibatis.services.domain.User;

/*
 * FileName : MyBatisTestApp01.java
  * ㅇ SqlMapConfig.xml / mybatis-userservice-mapping01.xml
  * ㅇ MyBATIS Framework 이용 QUERY ( SELECT ) TEST 
  */
public class MyBatisTestApp01 {
	public static void main(String[] args) throws Exception {
		Reader reader = Resources.getResourceAsReader("config/SqlMapConfig.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = factory.openSession();
		
		List<User> list = session.selectList("UserMapper.getUserList");
		// 0. getUserList :: 모든 user 정보
		System.out.println(":: 0. all User(SELECT)  ? ");
		for (int i = 0; i < list.size(); i++) {
			System.out.println("<" + (i + 1) + "> 번째 회원.." + list.get(i).toString());
		}
		System.out.println("\n");

		// 1. getUser :: 특정 userid 정보
		User user = (User) session.selectOne("UserMapper01.getUser", "user01");
		System.out.println(":: 1. get(SELECT)  ? " + user.toString());
		System.out.println("\n");

		// 2. findUserId :: 특정 userid / password 정보 
		user.setUserId("user03");
		user.setPassword("user03");
		String name = (String) session.selectOne("UserMapper01.findUserId", user);
		System.out.println(":: 2. get(SELECT)  ? " + name);
	}// end of main
}// end of class

 

특정 문자열을 포함하는 것들을 받아 올 때는 like 연산자를 사용합니다. 이때 와일드 카드 %와 _사용합니다. 

mybatis-userservice-mapping02.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="UserMapper02">
 	<select id="getUser01" parameterType="string" resultType="user">
		SELECT
		user_id AS userId,
		user_name AS userName,
		password AS password,
		age AS age, 
		grade AS grade,
		reg_date AS regDate
		FROM users
		WHERE user_id LIKE #{value}
	 </select>
	  
	 <select id="getUser02" parameterType="user" resultType="user">
		SELECT
		user_id AS userId,
		user_name AS userName,
		password AS password,
		age AS age, 
		grade AS grade,
		reg_date AS regDate
		FROM users
		WHERE user_id LIKE #{userId}
	 </select>
	  
	 <select id="getUser03" parameterType="string" resultType="user">
		SELECT
		user_id AS userId,
		user_name AS userName,
		password AS password,
		age AS age, 
		grade AS grade,
		reg_date AS regDate
		FROM users
		WHERE user_id LIKE #{value} '%'
	 </select>
	  
	  <select id="getUser04" parameterType="user" resultType="user">
		SELECT
		user_id AS userId,
		user_name AS userName,
		password AS password,
		age AS age, 
		grade AS grade,
		reg_date AS regDate
		FROM users
		WHERE user_id LIKE '%' #{userId}
	  </select>	  
</mapper>

https://dongram.tistory.com/12

 

[MyBatis] 동적 쿼리 LIKE 문 삽질 주의

[MyBatis] 동적 쿼리 생성시 삽질 주의 MyBatis로 동적 쿼리 생성시 주의 해야 할 점. MyBatis 문법은 RDBMS 별로 쿼리가 조금 씩 달라지며, 자신이 사용하는 디비에 맞지 않게 사용하면 하루종일 삽질하��

dongram.tistory.com

MyBatisTestApp02.java

package ibatis.services.user.test;

import ibatis.services.domain.User;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/*
 * FileName : MyBatisTestApp02.java
  * ㅇ SqlMapConfig01.xml / mybatis-userservice-mapping02.xml
  * ㅇ My Framework 이용 QUERY ( SELECT ) TEST 
  */
public class 	MyBatisTestApp02 {
	///Main method
	public static void main(String[] args) throws Exception{
		
		///==> SqlMapConfig01.xml : MyBATIS Framework 의 핵심 환경설정화일 (MetaData)
		//==> mybatis-userservice-mapping02.xml : SQL 를 갖는 설정화일 (MetaData) 

		Reader reader=Resources.getResourceAsReader("config/SqlMapConfig.xml");
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
		SqlSession session=factory.openSession();
		
		//0. getUser :: # 대입자를 이용한 like 연산자 검색 ==> 검색결과 없는것 확인
		System.out.println(":: 0. user로시작하는 userId User(SELECT)  ? ");
		List<User> list = session.selectList("UserMapper02.getUser01","user");
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
		
		//1. getUser :: # 대입자를 이용한 like 연산자 검색 
		// ==> 검색결과 존재 확인 :: %와일드카드 직접입력경우 
		System.out.println(":: 1. user로시작하는 userId User(SELECT)  ? ");
		list = session.selectList("UserMapper02.getUser01","user%");
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
		
	
		//2.  getUser :: # 대입자를 이용한 like 연산자 검색 ==> 검색결과 없는것 확인
		User user = new User();
		user.setUserId("01");
		
		System.out.println(":: 2. 01로 끝나는 userId User(SELECT)  ? ");
		 list = session.selectList("UserMapper02.getUser02",user);
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
		
		
		//3. getUser :: # 대입자를 이용한  like 연산자 검색 
		//				==> 검색결과 존재 확인 :: %와일드카드 직접입력경우
		user.setUserId("%01");
		System.out.println(":: 3. 01로 끝나는 userId User(SELECT)  ? ");
		list = session.selectList("UserMapper02.getUser02",user);
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
		
		
		//4. getUser :: $ 대입자를 이용한 like 연산자 검색==> 검색결과 존재 확인 
		System.out.println(":: 4. user로시작하는 userId User(SELECT)  ? ");
		list = session.selectList("UserMapper02.getUser03","user");
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
		
		
	
		//5. getUser :: $ 대입자를 이용한 like 연산자 검색==> 검색결과 존재 확인 
		user.setUserId("01");
		System.out.println(":: 5. 01로 끝나는 userId User(SELECT)  ? ");
		 list = session.selectList("UserMapper02.getUser04",user);
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
	
	}//end of main
}//end of class

Delete, Insert, Update

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--Delete, Insert, Update  -->
<!--CRUD 완성  -->
<!--get=> #{}  -->
<mapper namespace="UserMapper03">
 	<insert id="addUser" parameterType="user">
		INSERT INTO users(user_id, user_name, password, age, grade, reg_date) 
		values(#{userId}, #{userName}, #{password}, #{age}, #{grade}, #{regDate})
	 </insert>
	 
	 <update id="updateUser" parameterType="user">
	 	update users 
	 	set user_name = #{userName}
	 	where user_id = #{userId}
	 </update>
	 <delete id="removeUser" parameterType="string">
		DELETE
		FROM users
		WHERE user_id = #{value} 
	 </delete>
</mapper>

 

MyBatisTestApp03.java

package ibatis.services.user.test;

import ibatis.services.domain.User;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/*
 * FileName : MyBatisTestApp03.java
  * ㅇ SqlMapConfig01.xml / mybatis-userservice-mapping03.xml
  * ㅇ My Framework 이용 QUERY ( SELECT ) TEST 
  * 
  * 
  * parameterType(MyBatis)|parameterMap(Ibatis, 비권장)
  * resultType|resultMap(권장, 잘 써야합니다.)
  * 
  */
public class MyBatisTestApp03 {
	///Main method
	public static void main(String[] args) throws Exception{
		
		///==> SqlMapConfig.xml : MyBATIS Framework 의 핵심 환경설정화일 (MetaData)
		//==> mybatis-userservice-mapping.xml : SQL 를 갖는 설정화일 (MetaData) 
		
		//==> 1. xml metadata 읽는 Stream 생성
		Reader reader=Resources.getResourceAsReader("config/SqlMapConfig.xml");
		
		//==> 2. Reader 객체를 이용 xml metadata 에 설정된 각정 정보를 접근, 사용가능한 
		//==>   SqlSession  객체 생성
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
		SqlSession session=factory.openSession();
		
		//0. User01.getUserList 
		System.out.println(":: 0. getUserList(SELECT)  ? ");
		List<User> list = session.selectList("UserMapper.getUserList");
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
		System.out.println("\n");
		
		//==> Test 용 UserVO instance 생성
		User user = new User("user04","주몽","user04",40,4);
		
		//1.User03.addUser Test
		Object obj = session.insert("UserMapper03.addUser", user);
		//insert는 원래 반환값이 없는데, object로 나옵니다. 들어가면 1 안들어 가면, 0입니다. 
		session.commit(); //이 부분 반드시 해줘야 한다....mvc에서는 생략가능.
		//iBatis와 다르게 insert문의 리턴타입은 insert된 row수를 반환한다.
		System.out.println(":: 1. addUser(INSERT)  result ? "+obj); //1
		System.out.println("\n");
		
		//2.User01.findUserId Test
		String userName = (String)session.selectOne("UserMapper01.findUserId", user);
		System.out.println(":: 2. findUserId(SELECT)  ? "+userName); //주몽
		System.out.println("\n");
	
		//3.User03.uadateUser Test
		user.setUserName("장보고");
		int updateResult = session.update("UserMapper03.updateUser", user);//insert에서는 object가 나왔었는데, 지금은 int다.
		session.commit(); //이부분 반드시 해줘야 한다.
		System.out.println(":: 3. updateUser(UPDATE) result ? "+updateResult);//1
		System.out.println("\n");
		
		//4.User01.findUserId Test
		userName = (String)session.selectOne("UserMapper01.findUserId", user);
		System.out.println(":: 4. findUserId(SELECT)  ? "+userName); //장보고
		System.out.println("\n");
		
		//5.UserMapper03.removeUser Test
		int deleteResult = session.delete("UserMapper03.removeUser", user.getUserId());
		session.commit(); //이 부분 반드시 해줘야 한다.
		System.out.println(":: 5. removeUser(DELETE) result ? "+deleteResult);
		System.out.println("\n");
		
		//6. User01.getUserList 
		System.out.println(":: 6. getUserList(SELECT)  ? ");
		 list = session.selectList("UserMapper.getUserList");
		for (int i =0 ;  i < list.size() ; i++) {
			System.out.println( "<"+ ( i +1 )+"> 번째 회원.."+ list.get(i).toString() );
		}
	}//end of main
}//end of class

 

'컴퓨터 프로그래밍 > SpringFrameWork' 카테고리의 다른 글

[SFW]03  (0) 2020.08.05
[SFW]01  (0) 2020.08.03