Mybatis注解的使用


一、mybatis 簡單注解

關鍵注解詞 : 

@Insert : 插入sql , 和xml insert sql語法完全一樣
@Select : 查詢sql,  和xml select sql語法完全一樣
@Update : 更新sql,  和xml update sql語法完全一樣
@Delete : 刪除sql,  和xml delete sql語法完全一樣
@Param :  入參
@Results : 結果集合
@Result : 結果



1.bean領域模型
package cn.xm.exam.bean.common;

import java.util.Date;

import org.apache.struts2.json.annotations.JSON;
/**
 * 查詢年齡大於55歲的人()
 * @author QiaoLiQiang
 * @time 2018年1月25日下午4:03:02
 */
public class Message {
    private String messageid;

    private String name;

    private String idcode;

    private String sex;

    private Date birthday;

    private String emptype;

    private String isdispose;

    public String getMessageid() {
        return messageid;
    }

    public void setMessageid(String messageid) {
        this.messageid = messageid == null ? null : messageid.trim();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getIdcode() {
        return idcode;
    }

    public void setIdcode(String idcode) {
        this.idcode = idcode == null ? null : idcode.trim();
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex == null ? null : sex.trim();
    }
    @JSON(format="yyyy-MM-dd")
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getEmptype() {
        return emptype;
    }

    public void setEmptype(String emptype) {
        this.emptype = emptype == null ? null : emptype.trim();
    }

    public String getIsdispose() {
        return isdispose;
    }

    public void setIsdispose(String isdispose) {
        this.isdispose = isdispose == null ? null : isdispose.trim();
    }

    @Override
    public String toString() {
        return "Message [messageid=" + messageid + ", name=" + name + ", idcode=" + idcode + ", sex=" + sex
                + ", birthday=" + birthday + ", emptype=" + emptype + ", isdispose=" + isdispose + "]";
    }
    
}

 

 

 

 

2.Mapper接口定義:

MessageCustomMapper.java(最后五個方法注解實現)

package cn.xm.exam.mapper.common.custom;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import cn.xm.exam.bean.common.Message;

/**
 * 消息mapper(查詢內部外部年齡超過55的人)
 * 
 * @author QiaoLiQiang
 * @time 2018年1月25日下午4:07:45
 */
public interface MessageCustomMapper {
    /**
     * 根據員工類型查詢超過55歲的人
     * 
     * @return
     * @param empType:員工類型:0短委,1內部
     * @throws SQLException
     */
    public List<Message> getMessageByEmptype(String empType) throws SQLException;

    /**
     * 修改消息的狀態(設置為已讀 1)
     * 
     * @param messageId
     *            消息ID
     * @return
     * @throws SQLException
     */
    public int updateMessageStatusByMessageId(String messageId) throws SQLException;

    /**
     * 測試注解使用Mybatis
     */
    
    @Insert(" insert into message values (#{messageid,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{idcode,jdbcType=CHAR}, #{sex,jdbcType=VARCHAR}, #{birthday,jdbcType=DATE}, #{emptype,jdbcType=VARCHAR},#{isdispose,jdbcType=VARCHAR})")
    public int insertIntoByAnnotation(Message message) throws SQLException;
    
    @Select("select * from message where messageid = #{messageId}")
    public Message getMessageById(@Param("messageId")String messageId)throws SQLException;
    
    @Update("update message set name=#{name} where messageid=#{messageid}")
    public int updateMessageById(Message message)throws SQLException;
    
    @Select("select * from message where messageid = #{messageId}")
    public Map getMessageMapById(@Param("messageId")String messageId)throws SQLException;
    
    @Delete("delete from message where messageid = #{messageId}")
    public int deleteByMessageId(@Param("messageId")String messageid)throws SQLException;
    

}

 

 

MessageCustomMapper.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="cn.xm.exam.mapper.common.custom.MessageCustomMapper">
    <!-- 查詢未讀的消息,每次顯示6條 -->
    <select id="getMessageByEmptype" parameterType="string"
        resultType="cn.xm.exam.bean.common.Message">
        select * from message where empType=#{value} and isDispose='0' limit 0,6
    </select>
    <!-- 根據ID設置消息狀態 -->
    <update id="updateMessageStatusByMessageId">
    update message set isDispose='1' where messageid = #{value}
    </update>
</mapper>

 

 

3.測試如下:

package cn.xm.exam.test.daoTest;

import java.sql.SQLException;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.xm.exam.bean.common.Message;
import cn.xm.exam.mapper.common.custom.MessageCustomMapper;

/**
 * mybatis注解測試
 * 
 * @author QiaoLiQiang
 * @time 2018年3月10日下午3:47:40
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/application*")
public class MybatisAnnotationTest {

    @Autowired
    private MessageCustomMapper messageCustomMapper;
    
    @Test
    public void testAdd() throws SQLException{
        Message message = new Message();
        message.setSex("1");
        message.setMessageid("001");
        message.setName("張三");
        int result = messageCustomMapper.insertIntoByAnnotation(message);
        System.out.println(result);
    }
    @Test
    public void testSelect() throws SQLException{
        Message result = messageCustomMapper.getMessageById("001");
        System.out.println(result);
    }
    @Test
    public void testUpdate() throws SQLException{
        Message message = new Message();
        message.setSex("2");
        message.setMessageid("001");
        message.setName("李四");
        int result = messageCustomMapper.updateMessageById(message);
        System.out.println(result);
    }
    
    @Test
    public void testSelectMap() throws SQLException{
        Map result = messageCustomMapper.getMessageMapById("001");
        System.out.println(result);
    }
    @Test
    public void testDelete() throws SQLException{
        int result = messageCustomMapper.deleteByMessageId("001");
        System.out.println(result);
    }
}

 

結果:

(1)testAdd方法:

  

 

 (2)testSelect方法:

 

 (3)testUpdate方法:

1

 

(4)testSelectMap方法:(測試返回類型是Map)

{sex=1, name=李四, messageid=001}

 

(5)testDelete方法:

 1

 

 

二、動態SQL 

 

 對應關系如下

@Insert :@InsertProvider
@Select :@SelectProvider
@Update :@UpdateProvider
@Delete :@DeleteProvider

四個provider注解標識 使用了動態SQL, 使用語法格式 : 
@UpdateProvider(type = UserProvider.class, method =

 

如何使用動態SQL:

public class UserProvider {

    /**
     * udpate
     * @param UserDO userDO
     * @return
     */
    public String updateSQL(final UserDO userDO) {
        return new SQL() {
            {
                UPDATE("t_user");
                SET("gmt_modified = now()");
                if (userDO.getUserName() != null) {
                    SET("user_name = #{userName}");
                }
                WHERE("id = #{id}}");
            }
        }.toString();
    }
}

  由此可見動態SQL還是用XML寫SQL語句比較方便

本文提到的知識點比較基礎, 如需深入了解見官網文檔or看下源碼。

 

 總結:

  1、xml 和 注解 如何選擇 ? 因人而異, 每個人的擼碼各有各的習慣, xml 、注解各有優缺點, xml的缺點 : 當模型屬性有變更時, 需要從DO改到DAO改到xml, 想想就蛋疼了~ xml也有優點 , SQL片段復用方便, 語法平易近人, 不像注解, 構造個動態語句, 還得建個類, 而且當你需要構造一段SQL被多處引用時, annotation 顯得無能為力了~重復寫相同的SQL片段, 代碼就顯得冗余了, 這時必須借助 xml來抽取共同使用。吐槽了下mybatis注解, 那注解豈不是毫無用處? no , mybatis 適合模型屬性經常變更的場景, 因為可以結合反射, 正則匹配動態構造SQL(純粹瞎歪歪, 個人想法, 應該可以實現, 改天擼一發)。可以說, mybatis的注解 優點 很好彌補了 xml缺點。兩者互補~

  2、古人語 : 熊和魚掌不可得兼 ~ 而mybatis注解 和 xml 可以混合使用。只要你願意~~

 

 

更全的參考:http://blog.csdn.net/hjm824/article/details/52972738

 


免責聲明!

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



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