Mybatis註解開發

使用註解實現基本CRUD

  1. 編寫實體類
package com.liang.domain;

import java.util.Date;

/**
 * 用戶實體類
 */
public class User {

    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
  1. 使用註解方式開發持久層接口
package com.liang.dao;

import com.liang.domain.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao{

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

    /**
     * 通過id查詢用戶
     * @param id
     * @return
     */
    @Select("select *from user where id = #{id}")
    User findById(int id);

    /**
     *保存用戶
     * @param user
     */
    @Insert("insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})")
    void saveUser(User user);

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

    /**
     *刪除用戶
     * @param id
     */
    @Delete("delete from user where id = #{id}")
    void deleteUser(int id);

    /**
     * 查詢總記錄條數
     * @return
     */
    @Select("select count(*) from user")
    int findTotal();

    /**
     * 通過用戶名模糊查詢用戶
     * @param name
     * @return
     */
    @Select("select *from user where username like #{username}")
    List<User> findByName(String name);
}
  1. 編寫Mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--引用連接數據庫文件 databases.properties
        resource屬性:用於指定properties配置文件的位置,要求配置文件必須在類路徑下
    -->
    <properties resource="databases.properties" ></properties>
    <!--配置別名,只能配置domain中類的別名-->
    <typeAliases>
        <!--批量定義別名,指定一個報名,MyBatis會在包名下自動搜索需要的類
            此時,別名爲類名(別名就不在區分大小寫)-->
        <package name="com.liang.domain"/>
    </typeAliases>

    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--將包內的映射器接口實現全部註冊爲映射器
     此方法要求dao接口名稱和dao映射文件名稱相同,且放在同一目錄下-->
    <mappers>
        <package name="com.liang.dao"/>
    </mappers>

</configuration>
  1. 編寫測試類
import com.liang.dao.UserDao;
import com.liang.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class TestMyBatis {

    private SqlSession sqlSession = null;
    private InputStream inputStream = null;
    private UserDao userDao = null;

    @Before
    public void init() throws IOException {
        inputStream = Resources.getResourceAsStream("SqlConfig.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        sqlSession = sqlSessionFactory.openSession();
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After
    public void destroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
        inputStream.close();
    }

    /**
     * 查詢所有用戶信息
     */
    @Test
    public void testFindAll() {
        List<User> users = userDao.findAll();
        for (User user: users)
        {
            System.out.println(user);
        }
    }

    /**
     * 通過id查詢用戶
     */
    @Test
    public void testFindById() {
        User user = userDao.findById(41);
        System.out.println(user);
    }

    /**
     * 保存用戶
     */
    @Test
    public void testSaveUser() {
        User user = new User();
        user.setUsername("註解開發");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("陝西");
        userDao.saveUser(user);
        System.out.println(user);
    }

    /**
     * 更新用戶
     */
    @Test
    public void testUpdateUser() {
        User user = userDao.findById(78);
        user.setSex("女");
        userDao.updateUser(user);
    }

    /**
     * 刪除用戶
     */
    @Test
    public void testDeleteUserUser() {
        userDao.deleteUser(71);
    }


    /**
     * 查詢總記錄條數
     */
    @Test
    public void testFindTotal() {
        int total = userDao.findTotal();
        System.out.println(total);
    }

    /**
     * 根據用戶名模糊查詢用戶
     */
    @Test
    public void testFindByName() {
        List<User> users = userDao.findByName("%王%");
        for (User user:users)
        {
            System.out.println(user);
        }
    }
}

列名、屬性名不對應的映射

  •  @Results註解:代替的是標籤<resultMap>
      @Result註解:代替了<id>標籤和<result>標籤,其屬性如下:
      				-- id  是否是主鍵字段
      				-- column 數據庫的列名
      				-- property 封裝類的屬性名
      				-- one 需要使用@One註解
      				-- many 需要使用@Many註解
    
  1. 編寫實體類
package com.liang.domain;

import java.util.Date;

/**
 * 用戶實體類
 */
public class User {

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

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userBirthday=" + userBirthday +
                ", userSex='" + userSex + '\'' +
                ", userAddress='" + userAddress + '\'' +
                '}';
    }
}
  1. 使用註解方式開發持久層接口
package com.liang.dao;

import com.liang.domain.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao{



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

    /**
     * 通過id查詢用戶
     * @param id
     * @return
     */
    @Select("select *from user where id = #{id}")
    @ResultMap("userMap")
    User findById(int id);

    /**
     *保存用戶
     * @param user
     */
    @Insert("insert into user(username,sex,birthday,address) values(#{userName},#{userSex},#{userBirthday},#{userAddress})")
    void saveUser(User user);

    /**
     *更新用戶
     * @param user
     */
    @Update("update user set username=#{userName}, sex=#{userSex}, birthday=#{userBirthday}, address=#{userAddress} where id=#{userId} ")
    void updateUser(User user);

    /**
     *刪除用戶
     * @param id
     */
    @Delete("delete from user where id = #{id}")
    void deleteUser(int id);

    /**
     * 查詢總記錄條數
     * @return
     */
    @Select("select count(*) from user")
    int findTotal();

    /**
     * 通過用戶名模糊查詢用戶
     * @param name
     * @return
     */
    @Select("select *from user where username like #{userName}")
    @ResultMap("userMap")
    List<User> findByName(String name);
}
  1. 編寫Mybatis配置文件,這一步沒變化
  2. 編寫測試類
import com.liang.dao.UserDao;
import com.liang.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class TestMyBatis {

    private SqlSession sqlSession = null;
    private InputStream inputStream = null;
    private UserDao userDao = null;

    @Before
    public void init() throws IOException {
        inputStream = Resources.getResourceAsStream("SqlConfig.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        sqlSession = sqlSessionFactory.openSession();
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After
    public void destroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
        inputStream.close();
    }

    /**
     * 查詢所有用戶信息
     */
    @Test
    public void testFindAll() {
        List<User> users = userDao.findAll();
        for (User user: users)
        {
            System.out.println(user);
        }
    }

    /**
     * 通過id查詢用戶
     */
    @Test
    public void testFindById() {
        User user = userDao.findById(41);
        System.out.println(user);
    }

    /**
     * 保存用戶
     */
    @Test
    public void testSaveUser() {
        User user = new User();
        user.setUserName("註解開發");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        user.setUserAddress("陝西");
        userDao.saveUser(user);
        System.out.println(user);
    }

    /**
     * 更新用戶
     */
    @Test
    public void testUpdateUser() {
        User user = userDao.findById(78);
        user.setUserSex("女");
        userDao.updateUser(user);
    }

    /**
     * 刪除用戶
     */
    @Test
    public void testDeleteUserUser() {
        userDao.deleteUser(71);
    }


    /**
     * 查詢總記錄條數
     */
    @Test
    public void testFindTotal() {
        int total = userDao.findTotal();
        System.out.println(total);
    }

    /**
     * 根據用戶名模糊查詢用戶
     */
    @Test
    public void testFindByName() {
        List<User> users = userDao.findByName("%王%");
        for (User user:users)
        {
            System.out.println(user);
        }
    }
}

一對一關係的映射

  • @One註解:代替了<assocation>標籤,主要用於多表查詢一對一,返回單一對象。其屬性如下:
     			-- select: 指定用來多表查詢的方法
     			-- fetchType:設置加載方式(立即加載、延時加載)
    

查詢賬戶,並且查詢該賬戶持有者信息

  1. 添加賬戶實體類
package com.liang.domain;

public class Account {

    private int id;
    private int uid;
    private Double money;

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}
  1. 添加持久層接口類

package com.liang.dao;

import com.liang.domain.Account;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

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.liang.dao.UserDao.findById",fetchType = FetchType.EAGER))
    })
    List<Account> findAll();
}
  1. 編寫測試類
import com.liang.dao.AccountDao;
import com.liang.domain.Account;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

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

public class TestAccount {


    private SqlSession sqlSession = null;
    private InputStream inputStream = null;
    private AccountDao accountDao = null;

    @Before
    public void init() throws IOException {
        inputStream = Resources.getResourceAsStream("SqlConfig.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        sqlSession = sqlSessionFactory.openSession();
        accountDao = sqlSession.getMapper(AccountDao.class);
    }

    @After
    public void destroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
        inputStream.close();
    }

    /**
     * 查詢賬戶以及持有者信息
     */
    @Test
    public void testFindAll() {
        List<Account> accounts = accountDao.findAll();
        for (Account account: accounts)
        {
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }

}

一對多關係的映射

  • @Many註解:代替了<collection>標籤,用於多表查詢中的一對多,返回對象集合。
    

查詢所有用戶,並且顯示其賬戶信息

  1. 修改用戶實體類
package com.liang.domain;

import java.util.Date;
import java.util.List;

/**
 * 用戶實體類
 */
public class User {

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

    private List<Account> accountList;

    public List<Account> getAccountList() {
        return accountList;
    }

    public void setAccountList(List<Account> accountList) {
        this.accountList = accountList;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userBirthday=" + userBirthday +
                ", userSex='" + userSex + '\'' +
                ", userAddress='" + userAddress + '\'' +
                '}';
    }
}
  1. 修改持久層接口類
    /**
     * 查詢所有用戶,並且顯示其賬戶信息
     * @return
     */
    @Select(value = "select *from user")
    @Results(id = "userMap",
            value = {
                    @Result(id = true, column = "id",property = "userId"),
                    @Result(column = "username", property = "userName"),
                    @Result(column = "sex", property = "userSex"),
                    @Result(column = "birthday", property = "userBirthday"),
                    @Result(column = "address", property = "userAddress"),
                    @Result(column = "id", property = "accountList", many = @Many(select = "com.liang.dao.AccountDao.findByUid",fetchType = FetchType.LAZY))
            })
    List<User> findAll();
  1. 修改測試方法
  /**
     * 查詢所有用戶,並且顯示其賬戶信息
     */
    @Test
    public void testFindAll() {
        List<User> users = userDao.findAll();
        for (User user: users)
        {
            System.out.println(user);
            System.out.println(user.getAccountList());
        }
    }

測試延遲加載的時候,需要在MyBatis配置文件中配置延遲加載

  <settings>
        <!--
            lazyLoadingEnabled : 延遲加載的全局開關。當開啓時,所有關聯對象都會延遲加載。
            aggressiveLazyLoading : 當開啓時,任何方法的調用都會加載該對象的所有屬性
        -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
發佈了71 篇原創文章 · 獲贊 6 · 訪問量 5387
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章