1. 程式人生 > 其它 >MyBatis——註解的CRUD操作 列名與屬性名不一致 延遲載入 立即載入 二級快取

MyBatis——註解的CRUD操作 列名與屬性名不一致 延遲載入 立即載入 二級快取

技術標籤:MyBatis框架

註解開發

CRUD操作

SqlMapConfig.xml檔案

<configuration>
    <!--引入外部配置檔案-->
    <properties resource="jdbcConfig.properties"></properties>
    <!--配置別名-->
    <typeAliases>
        <package name="com.atgw.domain"></package>
    </
typeAliases
>
<environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="
driver"
value="${jdbc.driver}">
</property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property
name="password" value="${jdbc.password}">
</property> </dataSource> </environment> </environments> <!--指定帶有註解的dao介面所在位置--> <mappers> <package name="com.atgw.dao"></package> </mappers> </configuration>

UserDao介面

public interface UserDao {

    //查詢所有使用者
    @Select(value = "select * from user")
    List<User> findAll();

    //插入資料
    @Insert(value = "insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")
    void saveUser(User user);

    //修改資料
    @Update(value = "update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
    void updateUser(User user);

    //刪除使用者
    @Delete(value = "delete from user where id=#{id}")
    void deleteUser(Integer id);

    //通過id查詢使用者
    @Select(value = "select * from user where id=#{id}")
    User findById(Integer id);

    //模糊查詢
    @Select(value = "select * from user where username like #{username}")
    List<User> findByUsername(String username);

    //查詢總數量
    @Select(value = "select count(*) from user")
    Integer findTotal();
}

測試

public class AnnotationCRUDTest {

    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession session;
    private UserDao userDao;

    @Before
    public void init() throws Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        factory = new SqlSessionFactoryBuilder().build(in);
        session = factory.openSession();
        userDao = session.getMapper(UserDao.class);
    }

    @After public void destroy() throws Exception{
        session.commit();
        session.close();
        in.close();
    }

    @Test
    public void testSaveUser(){
        User user = new User();
        user.setSex("女");
        user.setUsername("楊冪");
        user.setAddress("中");
        user.setBirthday(new Date());
        userDao.saveUser(user);
    }

    @Test
    public void testUpdateUser(){
        User user = new User();
        user.setId(56);
        user.setSex("女");
        user.setUsername("楊新安");
        user.setAddress("中國館");
        user.setBirthday(new Date());
        userDao.updateUser(user);
    }

    @Test
    public void testDeleteUser(){
        userDao.deleteUser(56);
    }

    @Test
    public void testFindById(){
        User user = userDao.findById(54);
        System.out.println(user);
    }

    @Test
    public void testFindByUsername(){
        List<User> users = userDao.findByUsername("%王%");
        for (User user : users){
            System.out.println(user);
        }
    }

    @Test
    public void testFindTotal(){
        Integer count = userDao.findTotal();
        System.out.println(count);
    }
}

列名與屬性名不一致

User類的屬性名

private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

UserDao介面

  • @Results註解解決列名不一致
  • @ResultMap註解引用註解
public interface UserDao {

    //查詢所有使用者
    @Select(value = "select * from user")
    @Results(id = "userMap", value = {
            @Result(id = true,column = "id", property = "userId"),//id=true表示主鍵
            @Result(column = "username", property = "userName"),
            @Result(column = "address", property = "userAddress"),
            @Result(column = "sex", property = "userSex"),
            @Result(column = "birthday", property = "userBirthday")
    })
    List<User> findAll();

    //通過id查詢使用者
    @Select(value = "select * from user where id=#{id}")
    @ResultMap(value = {"userMap"})//引用上面的註解
    User findById(Integer id);

    //模糊查詢
    @Select(value = "select * from user where username like #{username}")
    @ResultMap(value = {"userMap"})
    List<User> findByUsername(String username);
}

一對一(立即載入)

Account

    private Integer id;
    private Integer uid;
    private Double money;

    //多對一,(在mybatis中可以理解為一對一)一個賬戶只能屬於一個使用者
    private User user;

AccountDao介面

@Result(column = "uid",property = "user",one = @One(select = "com.atgw.dao.UserDao.findById",fetchType = FetchType.EAGER)

  • column = "uid":表示account表中的外來鍵,下面的方法通過這個列名來查詢
  • property = "user":Account類中的屬性
  • one = @One(select = "com.atgw.dao.UserDao.findById"):表示通過此方法查詢對應的User資訊
  • @One表示返回一個物件
  • FetchType.EAGER:表示立即載入
public interface AccountDao {

    //查詢所有賬戶,並且獲取每個賬戶所屬的使用者資訊
    @Select("select * from account")
    @Results(id="accountMap",value = {
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "uid",property = "uid"),
            @Result(column = "money",property = "money"),
            @Result(column = "uid",property = "user",one = @One(select = "com.atgw.dao.UserDao.findById",fetchType = FetchType.EAGER))
            /*
            column = "uid":表示account表中的外來鍵,下面的方法通過這個列名來查詢
            property = "user":Account類中的屬性
            one = @One(select = "com.atgw.dao.UserDao.findById"):表示通過此方法查詢對應的User資訊
            FetchType.EAGER:表示立即載入
             */
    })
    List<Account> findAll();

    //根據id查詢
    @Select("select * from account where id=#{id}")
    @ResultMap(value = {"accountMap"})
    Account findById(Integer id);

     //根據uid查詢
    @Select("select * from account where uid=#{uid}")
    @ResultMap(value = {"accountMap"})
    List<Account> findByByUid(Integer uid);
}

一對多(延遲載入)

User

 private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

    //一對多,一個使用者對應多個賬戶
    private List<Account> accounts;

UserDao介面

@Result(column = "id",property = "accounts",many = @Many(select = "com.atgw.dao.AccountDao.findByByUid",fetchType = FetchType.LAZY))

  • property = "accounts":表示User類中的accounts屬性
  • column = "id":表示User中的id
  • select = "com.atgw.dao.AccountDao.findByByUid":表示在Account表中通過uid來查詢對應的User
  • fetchType = FetchType.LAZY:表示延遲載入
//查詢所有使用者
    @Select(value = "select * from user")
    @Results(id = "userMap", value = {
            @Result(id = true,column = "id", property = "userId"),//id=true表示主鍵
            @Result(column = "username", property = "userName"),
            @Result(column = "address", property = "userAddress"),
            @Result(column = "sex", property = "userSex"),
            @Result(column = "birthday", property = "userBirthday"),
            @Result(column = "id",property = "accounts",many = @Many(select = "com.atgw.dao.AccountDao.findByByUid",fetchType = FetchType.LAZY))
            /*
            property = "accounts":表示User類中的accounts屬性
            column = "id":表示User中的id
            select = "com.atgw.dao.AccountDao.findByByUid":表示在Account表中通過uid來查詢對應的User
            fetchType = FetchType.LAZY:表示延遲載入
             */
    })
    List<User> findAll();

二級快取

SqlMapConfig.xml

    <!--開啟二級快取-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

UserDao介面

@CacheNamespace(blocking = true)
public interface UserDao {}
@Test
    public void testFindById(){
        SqlSession session = factory.openSession();
        UserDao userDao = session.getMapper(UserDao.class);
        User user = userDao.findById(54);
        System.out.println(user);
        session.close();//釋放一級快取

        SqlSession session1 = factory.openSession();
        UserDao userDao1 = session1.getMapper(UserDao.class);
        User user1 = userDao1.findById(54);
        System.out.println(user1);
        session1.close();
    }