一、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