MyBatis
MyBatis 라이브러리를 다운 받습니다.
https://blog.mybatis.org/p/products.html
Products
A blog about the the MyBatis data mapper framework.
blog.mybatis.org
이것은 mybatis가 DB(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 |