Mybatis之注解實現動態sql


    通過注解實現動態sql一共需要三部:1.創建表,2.創建entity類,3.創建mapper類, 4.創建動態sql的Provider類。1.和2.可以參見該系列其他文章,這里主要對3和4進行演示,並編寫測試。(單元測試是一個好習慣,可以減少bug,避免后期修復的時間損耗)

 

1. 創建mapper.java

package com.blueStarWei.mappers;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

import com.blueStarWei.entity.TPersonInfo;

public interface PersonMapper {

    
    @SelectProvider(type=PersonDynamicSqlProvider.class, method="select")
    List<TPersonInfo> findByNameAndAge(Map<String,Object> map);
    
    @InsertProvider(type=PersonDynamicSqlProvider.class, method="insert")
    void insert(TPersonInfo person);
    
    @UpdateProvider(type=PersonDynamicSqlProvider.class, method="update")
    void update(TPersonInfo person);
    
}

 

2. 創建provider.java

package com.blueStarWei.mappers;

import java.util.Map;

import org.apache.ibatis.jdbc.SQL;

import com.blueStarWei.entity.TPersonInfo;

public class PersonDynamicSqlProvider {

    public String insert(TPersonInfo person){
        return new SQL(){
            {
                INSERT_INTO("T_PERSON_INFO");
                if(person.getName() != null){
                    VALUES("name", "#{name}");
                    
                    //VALUES("name", person.getName());
                    //Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'Java' in 'field list'
                }
                if(person.getAge() != null){
                    VALUES("age", "#{age}");
                }
            }
        }.toString();
    }
    
    public String update(TPersonInfo person){
        return new SQL(){
            {
                UPDATE("T_PERSON_INFO");
                if(person.getName() != null){
                    SET("name=#{name}");
                }
                if(person.getAge() != null){
                    SET("age=#{age}");
                }
                WHERE("id=#{id}");
            }
        }.toString();
    }
    
    public String select(Map<String,Object> map){
        return new SQL(){
            {
                SELECT("*");
                FROM("T_PERSON_INFO");
                
                StringBuilder whereClause = new StringBuilder();
                if(map.get("name") != null){
                    whereClause.append(" and name like '%").append(map.get("name")).append("%' ");
                }
                if(map.get("age") != null){
                    whereClause.append(" and age = ").append(map.get("age"));
                }
if(!"".equals(whereClause.toString())){ WHERE(whereClause.toString().replaceFirst(
"and", ""));
} } }.toString(); } }

 

3. UnitTest

    @Test
    public void testInsertPerson(){
        SqlSession session = SqlSessionFactoryUtil.openSession();
        PersonMapper mapper = session.getMapper(PersonMapper.class);
        TPersonInfo person = new TPersonInfo();
        person.setName("Java");
        person.setAge(18);
        mapper.insert(person);
        session.commit();
        
        session.close();
    }
    
    @Test
    public void testUpdatePerson(){
        SqlSession session = SqlSessionFactoryUtil.openSession();
        PersonMapper mapper = session.getMapper(PersonMapper.class);
        Map<String, Object>  map = new HashMap<>();
        map.put("name", "Java");
        map.put("age", 18);
        List<TPersonInfo> persons = mapper.findByNameAndAge(map);
        for (TPersonInfo person : persons) {
            person.setName("Mybatis");
            person.setAge(22);
            mapper.update(person);            
        }
        session.commit();
        
        session.close();
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM