MyBatis——註解的CRUD操作 列名與屬性名不一致 延遲載入 立即載入 二級快取
阿新 • • 發佈:2021-02-03
註解開發
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中的idselect = "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();
}