JavaEE學習日誌(八十六): MyBatis註解開發

JavaEE學習日誌持續更新----> 必看!JavaEE學習路線(文章總彙)

MyBatis

註解開發

package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserDao {
    /**
     * 查詢所有
     * @return
     */
    @Select("select * from user")
    List<User> findAll();

    /**
     * 根據ID查詢
     * @return
     */
    @Select("select * from user where id = #{id}")
    User findById(Integer id);

    /**
     * 根據姓名模糊查詢,注意sql語句不能用單引號
     * @param username
     * @return
     */
    @Select("select * from user where username like \"%\"#{username}\"%\"")
    List<User> findByUsername(String username);

    /**
     * 查詢總條數
     * @return
     */
    @Select("select count(*) from user")
    Integer findTotalCount();

    /**
     * 添加用戶
     * @param user
     */
    @Insert("insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})")
    void insert(User user);

    /**
     * 更新用戶
     * @param user
     */
    @Update("update user set username = #{username},password = #{password},sex = #{sex}+" +
            ", address = #{address},birthday = #{birthday} where id = #{id}")
    void update(User user);

    /**
     * 根據ID刪除用戶
     * @param id
     */
    @Delete("delete from user where id = #{id}")
    void del(Integer id);
}

結果集映射

注意:

  • @Results映射結果集
  • @Result映射不一樣的列(列名與屬性名不一樣的列)
  • id=true 該列爲主鍵,id的默認值爲false
  • 註解中,只需要寫列名和屬性名不一樣的,一樣的可以省略
/**
     * 查詢所有
     * @return
     */
    @Select("select * from user")
    @Results({
            @Result(id=true, column = "uid",property = "id"),
            @Result(column = "uname",property = "username")
    })
    List<User> findAll();

特殊情況:如果某列數據使用了兩次即以上,則兩次映射都要寫出來。
如:以下代碼將會獲取不到u_id

@Select("select * from account ")
@Results({
        @Result(property = "user",column = "u_id", javaType = User.class,
                one = @One(select = "com.itheima.dao.UserDao.findById", fetchType= FetchType.LAZY))
})
List<Account> findAll();

必須寫成這樣才能獲取到u_id

@Select("select * from account ")
@Results({
        @Result(property = "u_id",column = "u_id"),
        @Result(property = "user",column = "u_id", javaType = User.class,
                one = @One(select = "com.itheima.dao.UserDao.findById", fetchType= FetchType.LAZY))
})
List<Account> findAll();

主鍵回顯

使用註解時
@SelectKey保存後獲取主鍵:

  • keyProperty主鍵的屬性名
  • keyColumn主鍵的列名
  • resultType主鍵的類型
  • before=false 不是在添加之前,添加之後查詢
  • statement 需要執行的sql語句
    select last_insert_id()最後一次執行添加生成的主鍵
/**
     * 添加用戶
     * @param user
     */
    //保存後獲取主鍵,@SelectKey
    //keyProperty主鍵的屬性名
    //keyColumn主鍵的列名
    //resultType主鍵的類型
    //before=false 不是在添加之前,添加之後查詢
    //statement 需要執行的sql語句
    //select last_insert_id()最後一次執行添加生成的主鍵
    @SelectKey(keyProperty = "id",keyColumn = "id",resultType = Integer.class,before = false,
    statement = "select last_insert_id()")
    @Insert("insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})")
    void insert(User user);

使用xml時

<insert id="save" parameterType="com.itheima.domain.User">
        <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
            select last_insert_id()
        </selectKey>
        insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})
    </insert>

這樣在數據表是自動增長的id時,保存數據之後可以回顯主鍵

@Test
    public void test4(){
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setUsername("小王2");
        user.setSex("男");
        user.setPassword("123");
        user.setAddress("杭州");
        user.setBirthday(new Date());

        userDao.insert(user);//在數據庫中自動增長的id
        System.out.println(user.getId());//16

        sqlSession.commit();
        sqlSession.close();
    }

註解開發的一對一映射延遲加載

1、 pojo:User和Account
2、 AccountDao
注意:

  • one = @One(select = "", fetchType = "")對應一個對象
    select="namespace+id"
    fetchType= FetchType.LAZY 延遲加載
  • many:對應多個對象
package com.itheima.dao;

import com.itheima.domain.Account;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface AccountDao {
    /**
     * one = @One(select = "", fetchType = "")對應一個對象
     *      select="namespace+id"
     *      fetchType= FetchType.LAZY  延遲加載
     * many:對應多個對象
     * 查詢全部賬戶(包含用戶信息)
     * @return
     */
    @Select("select * from account ")
    @Results({
            @Result(property = "user",column = "u_id", javaType = User.class,
                    one = @One(select = "com.itheima.dao.UserDao.findById", fetchType= FetchType.LAZY))
    })
    List<Account> findAll();
}

3、UserDao

package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.Select;

public interface UserDao {
    /**
     * 根據id查詢用戶
     * @param id
     * @return
     */
    @Select("select * from user where id = #{id}")
    User findById(Integer id);
}

註解開發的一對多映射延遲加載

1、 pojo:User和Account
2、UserDao
注意:javaType = List.class可以省略

package com.itheima.dao;

import com.itheima.domain.Account;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface UserDao {
    /**
     * 查詢所有用戶對象,包含所有賬戶信息
     * @return
     */
    @Select("select * from user")
    @Results({
            @Result(property = "id",column = "id"),
            @Result(property = "accountList", column = "id", javaType = List.class,
            many = @Many(select = "com.itheima.dao.AccountDao.findByUserId",fetchType = FetchType.LAZY))
    })
    List<User> findAll();
}

2、AccountDao

package com.itheima.dao;

import com.itheima.domain.Account;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface AccountDao {
    /**
     * 根據userId獲取賬戶信息
     * @param uid
     * @return
     */
    @Select("select * from account where id = #{uid}")
    List<Account> findByUserId(Integer uid);

}

註解開發的動態sql語句

@SelectProvider:sql語句的提供者

  • type:sql語句提供者的類的字節碼
  • method:提供者類中的方法

UserDao

package com.itheima.dao;

import com.itheima.domain.User;
import com.itheima.provider.UserSqlProvider;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao {
    /**
     * 根據姓名模糊查詢,性別等於查詢
     * @SelectProvider:sql語句的提供者
     * type:sql語句提供者的類的字節碼
     * method:提供者類中的方法
     * @return
     */
    //@Select("select * from user where sex = #{sex} and username like \"%\"#{username}\"%\"")
    @SelectProvider(type = UserSqlProvider.class,method = "findAll")
    List<User> findByCondition(User user);


}

UserSqlProvider

package com.itheima.provider;

import com.itheima.domain.User;

/*
    user sql語句的提供者
 */
public class UserSqlProvider {
    public String findAll(User user){
        StringBuilder sb = new StringBuilder();
        sb.append("select * from user where 1=1 ");
        if(user.getSex() != null){
            sb.append(" and sex = #{sex} ");
        }
        if(user.getUsername() != null){
            sb.append(" and username like \"%\"#{username}\"%\" ");
        }
        return sb.toString();
    }
}

測試類

package com.itheima;

import com.itheima.dao.UserDao;
import com.itheima.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class TestMyBatis {
    @Test
    public void test(){
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user = new User();
        user.setUsername("明");
        List<User> userList = userDao.findByCondition(user);
        for (User u : userList) {
            System.out.println(u);
        }
        sqlSession.close();
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章