spring boot統合mybatisは注釈開発及び動的sqlの使用に基づいています.

20743 ワード

前のブログのmybatisはどのようにその役割を果たしていたかを思い出してみましょう.主に3種類のファイル、第一mapperインタフェース、第二xmlファイル、第三大域配置ファイル、そして今日はmybatisの仕事を簡略化するために来ました.
まずmapperインターフェースコードを貼り付けます.
@Mapper
public
interface UserMapper { // public List getUser() throws Exception; // id public void deleteUser(int id)throws Exception; // public void addUser(User user)throws Exception; // public void updateUser(User user) throws Exception; }
前回のコードよりユーザー情報を修正するインターフェースが追加されましたが、どのようにすればxmlの代わりができますか?
以上の添削調査の操作に対して、4つの注釈@Select、@Delete、@Insert、@Updateがあります.注釈の中に上の前のxmlに書いたsqlを加えればいいです.だから、完全なmapperインターフェースのファイルは以下の通りです.
@Mapper
public
interface UserMapper { // @Select("select * from user") public List getUser() throws Exception; // id @Delete("delete from user where id = #{id}") public void deleteUser(int id)throws Exception; // @Insert("insert into user(id,username,age)values(#{id},#{username},#{age})") public void addUser(User user)throws Exception; // @Update("update user set username = #{name} where id = #{id}") public void updateUser(User user) throws Exception; }
 残りのserviceとcontrolerのコードは簡単で、xml開発中の書き方と一致しています.注意すべきなのは、各インターフェースやクラスの上位に対応する注釈をつけておくことを忘れないことです.@Mapper、@Service、@Componentなど、springではスキャンできません.ここでは、起动类类に注解@MapperScan(「comp.XXX.dao」)を加えると、@Mapper注解が省けます.
注释の開発を終えました.このような需要を見にきました.もしデータベースの中にオブジェクトを更新したいなら、フロントから送られてきたオブジェクトの中にいくつかの属性が与えられていません.ですから、私達のcontrolerは受信時にこれらの属性を空にします.空でない属性を更新したいですが、どうすればいいですか?もちろんserviceでこの対象を処理してデータベースに更新することができますが、実は動的sqlは直接にこの問題を解決することができます.まず問題をクラスに分ける.
if+set/where
例えば、フロントからこのようなオブジェクトが送られてきます.
{
    "id":1,
    "age":12
}
私のコントローラの方法は
  //    
    public String updateUser(User user)throws Exception{
        userService.updateUser(user);
        return "id "+user.getId()+"      ";
    }
バックグラウンドに直接更新したら、このレコードの前のユーザー名は明らかに空になります.(データベースでこのフィールドが空いていることを許可されています.)だから、直接に私のダイナミックsqlコードを見にきます.
    <update id="updateUser" parameterType="com.fc.pojo.User">
        update user set        
            <if test = "username != null">
                user.username = #{username},
            if>
            <if test = "age != 0">
                user.age = #{age}
            if>
            where id = #{id}
update>
このようなsql綴りコードは簡単に見えますが、一つの問題があります.age属性が0(フロントがage属性を伝えないとデフォルトでは0)になると、最終的にsql文はudate user set user.username=?where id=
これは明らかに間違っています.だから、mybatisはラベルを提供してくれました.余分なカンマを除いて、最終的な動きはsqlになります.
<update id="updateUser" parameterType="com.fc.pojo.User">
        update user 
            <set>
                <if test = "username != null">
                    user.username = #{username},
                if>
                <if test = "age != 0">
                    user.age = #{age}
                if>
            set>    
            where id = #{id}
    update>
これで私たちの問題を解決しました.同じ意味でselect文の中にも、このような問題があります.
<select id="getUser" parameterType="com.fc.pojo.User" resultType="com.fc.pojo.User">
        select * from user where    
         <if test="username != null">
           username=#{username}
        if>
         
        <if test="age!= null">
           and age=#{age}
        if>
   select>
メッセージが空だったらsqlはselect*from user where and age=?ラベルを付けます.このように改善したのはxmlです.
    <select id="getUser" parameterType="com.fc.pojo.User" resultType="com.fc.pojo.User">
        select * from user 
        <where>
         <if test="username != null">
           username=#{username}
        if>
         
        <if test="age!= null">
           and age=#{age}
        if>
        where>
    select>
foreach
私たちは開発する時によくこのような要求に出会います.複数のオブジェクトを削除して、フロントから直接に一つのオブジェクトIDの集合を伝えます.この時の慣例は集合処理で、idを一つずつ取り出して削除します.実はセットを一つの包装類に入れて、直接包装類をparameterTypeとしてxmlに入れて、xmlの中でidを処理します.次は包装類です.私は配列の方式を加えました.id集合だけではなく、id配列もあります.この方法で作ってもいいです.
public class UserVo {
  private ListidList;//id  
  private int[]idArray;       //id  
  public List getIdList() {
    return idList;
  }
  public void setIdList(List idList) {
    this.idList = idList;
  }
  public int[] getIdArray() {
    return idArray;
  }
  public void setIdArray(int[] idArray) {
    this.idArray = idArray;
  }
  
}
xmlファイルではforeachタグを使いますが、el式とjsには同じような使い方があるようです.ループ操作をするためには、collectionの値は包装類の属性名と一致するはずです.具体的なコードは以下の通りです

    <delete id="deleteByIdList" parameterType="com.fc.pojo.UserVo">
        delete from user
        where id in
        <foreach item="id" collection="idList" open="(" separator="," close=")">
         #{id}
        foreach>
    delete>
    
    <delete id="deleteByIdArray" parameterType="com.fc.pojo.UserVo">
        delete from user
        where id in
        <foreach item="id" collection="idArray" open="(" separator="," close=")">
         #{id}
        foreach>
    delete>
それから、Controllerコードです.
    //  id  
    @RequestMapping(value="deleteByIdList",method=RequestMethod.DELETE)
    public String deleteByIdList(@RequestBody UserVo userVo)throws Exception{
      userService.deleteByIdList(userVo);
      return "id          ";
    }
     //  id  
    @RequestMapping(value="deleteByIdArray",method=RequestMethod.DELETE)
    public String deleteByIdArray(@RequestBody UserVo userVo)throws Exception{
      userService.deleteByIdArray(userVo);
      return "id          ";
    }
mapperインターフェースとserviceのコードはもう貼りません.ロードは前と同じです.
最後はテスト用のjsonです.一番目は測定配列で、二つ目の測定セットです.
{
    "idArray":[1,2,3]  
}
{
    "idList":[1,2,3]
}
sqlセグメント
sqlセグメントとは、重複率の高いsqlを抽出し、他のsqlの呼び出しに効果的にコードの多重化率を向上させることができます.これは多くの話ではありません.たとえば、ユーザーが追加された時に、ユーザーIDを追加する必要があります.以前のコードの中にすでにユーザーのsqlが追加されています.繰り返し書いたら、多すぎると思います.挿入語句を何度も引き出すことができます.コードは次のようになります.効果を見るために、以前に追加されたユーザーの語句もsql断片を呼び出す方法を使います.
<sql id="base_insert_sql" >
        insert into user(id,username,age)values(#{id},#{username},#{age})
    sql>
    
    <insert id="addUser" parameterType="com.fc.pojo.User">
        <include refid="base_insert_sql" />
    insert>
    
    <insert id="addUserWithId" parameterType="com.fc.pojo.User">
        <selectKey keyProperty="id" resultType="int">  
            select LAST_INSERT_ID()  
        selectKey> 
        <include refid="base_insert_sql" />
    insert>
はい、開発でよく使われているダイナミックsqlはこれだけです.上のxmlファイルを注釈にする方法は怠けています.時間があれば補充します.最後にアムウェイのテストソフトPostmanが使えます.会社もこれを使っています.以上のコードは全部PostManでテストして合格しました.結局、ブラウザもpostとdeleteの要求ができません.だから.ソースにします
 
転載先:https://www.cnblogs.com/scuury/p/9932324.html