Mybatis目录
注解开发的crud
1.IUserDao接口中使用注解
2.测试类
注解开发的多表查询
多对一(一对一)
1.IAccountDao接口中使用注解
2.Account类中(从表类)
3.测试类
一对多(多对多)
1.IUserDao接口中使用注解
2.User类中(从表类)
注解开启二级缓存
注解开发的crud
1.IUserDao接口中使用注解
public interface IUserDao {/*** 查询所有用户* @return*/@Select("select * from user")List<User> findAll();/*** 保存用户* @param user*/@Insert("insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")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 userId*/@Delete("delete from user where id=#{id} ")void deleteUser(Integer userId);/*** 根据id查询用户* @param userId* @return*/@Select("select * from user where id=#{id} ")User findById(Integer userId);/*** 根据用户名称模糊查询* @param username* @return*/
// @Select("select * from user where username like #{username} ")@Select("select * from user where username like '%${value}%' ")List<User> findUserByName(String username);/*** 查询总用户数量* @return*/@Select("select count(*) from user ")int findTotalUser();
}
2.测试类
public class AnnotationCRUDTest {private InputStream in;private SqlSessionFactory factory;private SqlSession session;private IUserDao userDao;@Beforepublic void init()throws Exception{in = Resources.getResourceAsStream("SqlMapConfig.xml");factory = new SqlSessionFactoryBuilder().build(in);session = factory.openSession();userDao = session.getMapper(IUserDao.class);}@Afterpublic void destroy()throws Exception{session.commit();session.close();in.close();}@Testpublic void testSave(){User user = new User();user.setUsername("mybatis annotation");user.setAddress("北京市昌平区");userDao.saveUser(user);}@Testpublic void testUpdate(){User user = new User();user.setId(57);user.setUsername("mybatis annotation update");user.setAddress("北京市海淀区");user.setSex("男");user.setBirthday(new Date());userDao.updateUser(user);}@Testpublic void testDelete(){userDao.deleteUser(51);}@Testpublic void testFindOne(){User user = userDao.findById(57);System.out.println(user);}@Testpublic void testFindByName(){
// List<User> users = userDao.findUserByName("%mybatis%");List<User> users = userDao.findUserByName("mybatis");for(User user : users){System.out.println(user);}}@Testpublic void testFindTotal(){int total = userDao.findTotalUser();System.out.println(total);}
}
注解开发的多表查询
可以这么记忆:
你所需要对应的表是很多个注解用many
对应一个的话就用one
demo功能阐述
查询用户账户的时候 返回用户的信息
因为多个账户或者一个账户才对应一个用户
多对一(Mybatis中 一对一)
1.IAccountDao接口中使用注解
public interface IAccountDao {/*** 查询所有账户,并且获取每个账户所属的用户信息* @return*/@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"),//这个注解是引入主表 FetchType(加载时机) EAGER(立即加载)@Result(property = "user",column = "uid",one=@One(select="com.itheima.dao.IUserDao.findById",fetchType= FetchType.EAGER))})List<Account> findAll();/*** 根据用户id查询账户信息* @param userId* @return*/@Select("select * from account where uid = #{userId}")List<Account> findAccountByUid(Integer userId);
}
2.Account类中(从表类)
//多对一(mybatis中称之为一对一)的映射:一个账户只能属于一个用户private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}
3.测试类
public class AccountTest {private InputStream in;private SqlSessionFactory factory;private SqlSession session;private IAccountDao accountDao;@Beforepublic void init()throws Exception{in = Resources.getResourceAsStream("SqlMapConfig.xml");factory = new SqlSessionFactoryBuilder().build(in);session = factory.openSession();accountDao = session.getMapper(IAccountDao.class);}@Afterpublic void destroy()throws Exception{session.commit();session.close();in.close();}@Testpublic void testFindAll(){List<Account> accounts = accountDao.findAll();for(Account account : accounts){System.out.println("----每个账户的信息-----");System.out.println(account);System.out.println(account.getUser());}}
}
一对多(多对多)
查询用户信息的时候 返回用户的账户信息
因为一个用户对应多个用户的账户信息
使用的是延迟加载
1.IUserDao接口中使用注解
public interface IUserDao {/*** 查询所有用户* @return*/@Select("select * from user")@Results(id="userMap",value={@Result(id=true,column = "id",property = "userId"),@Result(column = "username",property = "userName"),@Result(column = "address",property = "userAddress"),@Result(column = "sex",property = "userSex"),@Result(column = "birthday",property = "userBirthday"),@Result(property = "accounts",column = "id",many = @Many(select = "com.itheima.dao.IAccountDao.findAccountByUid",fetchType = FetchType.LAZY))})List<User> findAll();/*** 根据id查询用户* @param userId* @return*/@Select("select * from user where id=#{id} ")@ResultMap("userMap")User findById(Integer userId);/*** 根据用户名称模糊查询* @param username* @return*/@Select("select * from user where username like #{username} ")@ResultMap("userMap")List<User> findUserByName(String username);
}
2.User类中(从表类)
//一对多关系映射:一个用户对应多个账户private List<Account> accounts;public List<Account> getAccounts() {return accounts;}public void setAccounts(List<Account> accounts) {this.accounts = accounts;}
注解开启二级缓存
哪个Dao接口需要就写在哪儿
@CacheNamespace(blocking = true) 位于到的顶部!!