使用註解實現基本CRUD
- 編寫實體類
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 + '\'' +
'}';
}
}
- 使用註解方式開發持久層接口
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);
}
- 編寫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>
- 編寫測試類
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註解
- 編寫實體類
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 + '\'' +
'}';
}
}
- 使用註解方式開發持久層接口
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);
}
- 編寫Mybatis配置文件,這一步沒變化
- 編寫測試類
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:設置加載方式(立即加載、延時加載)
查詢賬戶,並且查詢該賬戶持有者信息
- 添加賬戶實體類
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 +
'}';
}
}
- 添加持久層接口類
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();
}
- 編寫測試類
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>標籤,用於多表查詢中的一對多,返回對象集合。
查詢所有用戶,並且顯示其賬戶信息
- 修改用戶實體類
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 + '\'' +
'}';
}
}
- 修改持久層接口類
/**
* 查詢所有用戶,並且顯示其賬戶信息
* @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();
- 修改測試方法
/**
* 查詢所有用戶,並且顯示其賬戶信息
*/
@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>