ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • day57 - MyBatis(parameterType, resultType)
    KIC/MyBatis 2021. 9. 3. 12:19
    반응형

     

    [parameterType]

    - 마이바티스에서 parameterType 속성을 사용해서 해당 파라미터의 자료형을 명시해준다. 위에서는 student 객체에 결과가 담긴다. student는  미리 생성해둔 Model 객체이다.

     

    [resultType]

    -  select 된 데이터를 반환할 그릇을 의미한다고 한다.

     

     

     

    -> 즉  parameterType으로 col 과 value가 Map 자료형임을 명시하고

    -> resultType으로 결과 값이 student 객체에 담길 것이라는 의미

     

     

     

    [#{}]

    - #{} 사용시 PreparedStatement 생성되고 PreparedStatement 매개 변수 값 안전하게 설정한다.


    - PreparedStatement 가 제공하는 set 계열의 메소드를 사용하여 (?)를 대체할 값을 지정한다.

    - 데이터 문자열을 자동으로 인식하기 때문에 자동 따옴표 붙인다.

     

    - 쿼리 주입을 예방할 수 있어서 보안 측면에서 유리하다.

     

     

    [${}]

    - ${} 사용시 Statement 생성하고 Statement 매개변수 값 그대로 전달한다.

     

    - 전달한 문자열에 따옴표가 붙지 않는다.

     

    - 테이블이나 컬럼명을 파라미터로 전달하고 싶을 때 사용한다.

     

    - ORDER BY 함수를 사용할 때 자동 따옴표가 붙으면 함수가 안먹기 때문에 ${}를 써야한다고 한다.

     

    - 쿼리 주입을 예방할 수 없어서 보안 측면에서는 불리하다.

     

     

    [StudentMapper2.xml]

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- /src/mapperXML/StudentMapper2.xml --> 
    <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="student2">
    
    <select id="select" resultType="student">
    	select * from student
    
    </select>
    
    <select id="select2" resultType="student" parameterType="map">
    	select * from student
    	<where>
    		<if test="grade !=null"> grade=#{grade}</if>
    		<if test="height !=null">height >= #{height}</if>
    		<if test="studno !=null">studno = #{studno}</if>
    	</where>
    </select>
    
    
    <!-- map 에서 내가 원하는 컬럼을 골라 사용 가능 하도록 where ${col} = #{value}로 지정 -->
    <select id="select3" resultType="student" parameterType="map">
    	select * from student
    		where ${col} = #{value}
    </select>
    
    <select id="select4" resultType="student" parameterType="map">
    	select ${col} from student
    </select>
    
    <select id="select5" resultType="student" parameterType="map">
    	select * from student
    	<choose>
    	<when test="grade !=null and height !=null">
    	where grade = #{grade} and height = #{height}
    	</when>
    	<when test="grade!=null">where grade = #{grade}</when>
    	<when test="height!=null">where height >= #{height}</when>
    	</choose>
    </select>
    
    <select id="select6" resultType="student" parameterType="map">
    	select * from student
    	<trim prefix="where" prefixOverrides="AND || OR">
    		<if test="grade != null"> and grade = #{grade}</if>
    		<if test="height != null"> and height >= #{height}</if>
    		<if test="weight != null"> and weight >= #{weight}</if>
    	</trim>
    </select>
    
    <select id="select7" resultType="student" parameterType="map">
    	select * from student
    	<if test="datas !=null">
    	where ${col} in
    	<foreach collection="datas" item="d" separator=","
    		open="("  close=")">#{d}
    	</foreach>
    	</if>
    		
    </select>
    
    </mapper>

     

    [Main3StudentXML.java]

    package main;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    
    import model.Student;
    
    public class Main3StudentXML {
    	private final static String NS = "student."; 
    	private static Map map = new HashMap(); 
    	public static void main(String[] args) {
    
    		SqlSessionFactory sqlMap = Main1.initMybatis(); 
    		SqlSession session = sqlMap.openSession();
    		
    		System.out.println("student table 추가");
    		Student s= new Student();
    		s.setStudno(1111);
    		s.setName("케이아");
    		s.setGrade(1);
    		s.setId("kic001");
    		s.setJumin("1111111111");
    		s.setDeptno1(101);
    		
    //		int cnt = session.insert(NS+"insert" , s);
    //		System.out.println("student record 추가: " + cnt);
    //		session.commit();
    		
    		s.setGrade(2);
    		s.setWeight(60);
    		s.setHeight(180);
    		s.setProfno(2222);
    		s.setStudno(1111);
    		
    //		int cnt = session.update(NS + "update", s);
    //		System.out.println("student record 수정: " + cnt);
    //		session.commit();
    		
    //		int cnt = session.delete(NS + "delete", 1111);
    //		System.out.println("student record 삭제: " + cnt);
    //		session.commit();
    		
    
    		
    		//전체 뽑기
    		//List<Student> li = session.selectList (NS+"select" , s);
    		
    		// 1111만 선택해 뽑기
    		List<Student> li = session.selectList (NS+"select" , 1111); 
    		System.out.println("student row count: "+li.size());
    
    		for (Student st : li) {
    			System.out.println(st);
    		}
    		
    		li = session.selectList(NS + "selectRMap");
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    	}
    }

     

     

    [Main4StudentXML.java]

    package main;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    
    import model.Student;
    
    public class Main4StudentXML {
    	// 수정 사항
    	//1, config.xml에 <mapper resource="mapperXML/StudentMapper2.xml"/>를 추가해줘야 한다.
    	//2. StudentMapper2 의 namespace와 NS ="student2."가 같아야 한다.
    	//3. parameterType가 아니라 resultType="student" 로 수정해야 한다.
    	private final static String NS ="student2.";
    	private static Map map = new HashMap();
    	
    	public static void main(String[] args) {
    		SqlSessionFactory sqlMap = Main1.initMybatis(); 
    		SqlSession session = sqlMap.openSession();
    		List<Student> li = session.selectList (NS+"select"); 
    //		
    //		Student s= new Student();
    //		System.out.println("student row count: "+li.size());
    //
    //		for (Student st : li) {
    //			System.out.println(st);
    //		}
    		
    		
    		
    		//map.put("grade", 1);
    		//map.put("height", 180);
    		map.put("studno", 9711);
    		li = session.selectList(NS+"select2", map);
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    		
    		System.out.println("=====================================================");
    		
    		// 이렇게 내가 원하는 컬럼을 골라 사용 가능
    		map.clear();
    		map.put("col", "height");
    		map.put("value", 180);
    		
    //		map.put("col", "weight");
    //		map.put("value", 70);
    		li = session.selectList(NS+"select3", map);
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    		
    		map.clear();
    		map.put("col", "name");
    		li = session.selectList(NS+"select4", map);
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    		
    		System.out.println("=====================================================");
    		
    		
    		map.clear();
    		//map.put("grade", "1");
    		map.put("height", 170);
    		li = session.selectList(NS+"select5", map);
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    		
    		
    		System.out.println("=====================================================");
    		
    		
    		map.clear();
    		map.put("grade", "1");
    		map.put("height", 170);
    		map.put("height", 60);
    		li = session.selectList(NS+"select6", map);
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    		
    		
    		
    		System.out.println("=====================================================");
    		List<Integer> ali = Arrays.asList(101, 201);
    		map.clear();
    		map.put("col", "deptno1");
    		map.put("datas", ali);
    		li = session.selectList(NS+"select7", map);
    		System.out.println("student row count: "+li.size());
    		for (Student st : li) {
    			System.out.println(st);
    		}
    
    	}
    }

     

    300x250

    댓글

Designed by Tistory.