相比於mybatis XML方法的配置方法,基於註解的方式更加簡單一點。XML方式的配置需要在文件中配置許多東西。而基於註解的方式則只需要每次在具體實現類中在方法名上面加上註解即可。先看一個簡單的例子:
一個用戶多個賬戶查詢
項目結構:
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">
<!--mybatis主配置文件-->
<configuration>
<typeAliases>
<package name="com.xatu.domain"></package>
</typeAliases>
<!--- 配置環境-->
<environments default="mysql">
<!---配置mysql的環境-->
<environment id="mysql">
<!--- 配置事務的類型-->
<transactionManager type="JDBC"></transactionManager>
<!--- 配置數據源(連接池)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test1?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!---指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件 -->
<mappers>
<package name="com.xatu.dao"></package>
</mappers>
</configuration>
User實體類
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer 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 + '\'' +
'}';
}
}
賬戶實體類
public class Account implements Serializable {
private Integer id;
private Integer uid;
private double money;
private User user; //因爲是通過賬戶Id查找用戶 所以要有用戶對象
//多對一 (mybatis中稱爲一對一關係)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer 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 +
'}';
}
}
操作類
IUserDao.java
public interface IUserDao {
@Select("select * from user where id = #{id}")
//通過用戶id查找用戶信息
User findById(Integer userId);
}
IAccountDao.java
public interface IAccountDao {
/**
* 多表查詢,查詢所有
* @return
*/
@Select("select * from account")
@Results(id="AccountMap",value ={
@Result(id=true,column = "id",property = "id"), //id=true 用來指定主鍵
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
@Result(column = "uid",property = "user",one = @One(select = "com.xatu.dao.IUserDao.findById",fetchType=FetchType.EAGER)) //這樣寫的目的是在User表中通過uid查找。多對一就要使用@one標籤
})
List<Account> findAll();
}
/**
除了@one標籤 還有@many標籤 對應多對多和一對多關係,除此之外FetchType也有三種屬性
EAGER:預加載
DEFAULT:默認
LAZY:懶加載
*/
測試類
mybatisTest02 .java
public class mybatisTest02 {
static private InputStream in=null;
static private SqlSessionFactoryBuilder builder=null;
static private SqlSessionFactory factory=null;
static private SqlSession sqlSession=null;
static private IAccountDao accountDao=null;
@Before
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlMapConfig.xml");
builder=new SqlSessionFactoryBuilder();
factory = builder.build(in);
sqlSession = factory.openSession();
accountDao = sqlSession.getMapper(IAccountDao.class);
}
@After
public void destory() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
}
/**
* 測試基於註解的mybatis使用
*/
@Test
public void TestfindAll() {
List<Account> accounts=accountDao.findAll();
for (Account account:
accounts) {
System.out.println(account);
System.out.println(account.getUser());
}
}
}