Mybatis注解开发-2020.03.25

mybatis注解开发的环境搭建

  • pom.xml and SqlMapConfig.xml
   

   4.0.0

   com.itheima
   day04_eesy_03annotation_mybatis
   1.0-SNAPSHOT
   jar

   
       
           org.mybatis
           mybatis
           3.4.5
       
       
           mysql
           mysql-connector-java
           5.1.6
       
       
           log4j
           log4j
           1.2.12
       
       
           junit
           junit
           4.10
       
   






   
   
   
   
       
   
   
   
       
           
           
               
               
               
               
           
       
   
   
   
       
   

  • User.java and IUserDao.java
   package com.itheima.domain;

import java.io.Serializable;
import java.util.Date;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class User implements Serializable{

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

   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 String getAddress() {
       return address;
   }

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

   public String getSex() {
       return sex;
   }

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

   public Date getBirthday() {
       return birthday;
   }

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

   @Override
   public String toString() {
       return "User{" +
               "id=" + id +
               ", username='" + username + '\'' +
               ", address='" + address + '\'' +
               ", sex='" + sex + '\'' +
               ", birthday=" + birthday +
               '}';
   }
}


package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
* 在mybatis中针对,CRUD一共有四个注解
*  @Select @Insert @Update @Delete
*/
public interface IUserDao {

   /**
    * 查询所有用户
    * @return
    */
   @Select("select * from user")
   List findAll();
}

mybatis注解开发测试和使用注意事项

  • MybatisAnnoTest.java
    package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.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 java.io.InputStream;
import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class MybatisAnnoTest {

   /**
    * 测试基于注解的mybatis使用
    * @param args
    */
   public static void main(String[] args) throws  Exception{
       //1.获取字节输入流
       InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
       //2.根据字节输入流构建SqlSessionFactory
       SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
       //3.根据SqlSessionFactory生产一个SqlSession
       SqlSession session = factory.openSession();
       //4.使用SqlSession获取Dao的代理对象
       IUserDao userDao = session.getMapper(IUserDao.class);
       //5.执行Dao的方法
       List users = userDao.findAll();
       for(User user : users){
           System.out.println(user);
       }
       //6.释放资源
       session.close();
       in.close();
   }
}

mybatis注解开发保存和更新功能

  • IuserDao.java
  package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
* 在mybatis中针对,CRUD一共有四个注解
*  @Select @Insert @Update @Delete
*/
public interface IUserDao {

   /**
    * 查询所有用户
    * @return
    */
   @Select("select * from user")
   List 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);

  
}

  • AnnotationCRUDTest.java
    package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.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.InputStream;
import java.util.Date;
import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class AnnotationCRUDTest {
   private InputStream in;
   private SqlSessionFactory factory;
   private SqlSession session;
   private IUserDao userDao;

   @Before
   public  void init()throws Exception{
       in = Resources.getResourceAsStream("SqlMapConfig.xml");
       factory = new SqlSessionFactoryBuilder().build(in);
       session = factory.openSession();
       userDao = session.getMapper(IUserDao.class);
   }

   @After
   public  void destroy()throws  Exception{
       session.commit();
       session.close();
       in.close();
   }


   @Test
   public void testSave(){
       User user = new User();
       user.setUsername("mybatis annotation");
       user.setAddress("北京市昌平区");

       userDao.saveUser(user);
   }

   @Test
   public 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);
   }

}

mybatis注解开发CRUD和其他操作

  • IuserDao.java
     /**
    * 删除用户
    * @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 findUserByName(String username);

   /**
    * 查询总用户数量
    * @return
    */
   @Select("select count(*) from user ")
   int findTotalUser();
  • AnnotationCRUDTest.java
   @Test
   public void testDelete(){
       userDao.deleteUser(51);
   }

   @Test
   public void testFindOne(){
       User user = userDao.findById(57);
       System.out.println(user);
   }


   @Test
   public  void testFindByName(){
//        List users = userDao.findUserByName("%mybatis%");
       List users = userDao.findUserByName("mybatis");
       for(User user : users){
           System.out.println(user);
       }
   }

   @Test
   public  void testFindTotal(){
       int total = userDao.findTotalUser();
       System.out.println(total);
   }

mybatis注解建立实体类属性和数据库表中列的对应关系

  • User.java
  package com.itheima.domain;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class User implements Serializable{

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


   public void setAccounts(List accounts) {
       this.accounts = accounts;
   }

   public Integer getUserId() {
       return userId;
   }

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

   public String getUserName() {
       return userName;
   }

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

   public String getUserAddress() {
       return userAddress;
   }

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

   public String getUserSex() {
       return userSex;
   }

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

   public Date getUserBirthday() {
       return userBirthday;
   }

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

   @Override
   public String toString() {
       return "User{" +
               "userId=" + userId +
               ", userName='" + userName + '\'' +
               ", userAddress='" + userAddress + '\'' +
               ", userSex='" + userSex + '\'' +
               ", userBirthday=" + userBirthday +
               '}';
   }
}

  • IUserDao.java
  package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
* 在mybatis中针对,CRUD一共有四个注解
*  @Select @Insert @Update @Delete
*/
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"),
   })
   List 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 findUserByName(String username);


}

mybatis注解开发一对一的查询配置

  • Account.java
 package com.itheima.domain;

import java.io.Serializable;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class Account implements Serializable {

   private Integer id;
   private Integer uid;
   private Double money;

   //多对一(mybatis中称之为一对一)的映射:一个账户只能属于一个用户
   private User user;

   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 +
               '}';
   }
}

  • IAccountDao.java
  package com.itheima.dao;

import com.itheima.domain.Account;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
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"),
           @Result(property = "user",column = "uid",one=@One(select="com.itheima.dao.IUserDao.findById",fetchType= FetchType.EAGER))
   })
   List findAll();

   /**
    * 根据用户id查询账户信息
    * @param userId
    * @return
    */
   @Select("select * from account where uid = #{userId}")
   List findAccountByUid(Integer userId);
}

mybatis注解开发一对多的查询配置

  • User.java
  
   //一对多关系映射:一个用户对应多个账户
   private List accounts;

   public List getAccounts() {
       return accounts;
   }

   public void setAccounts(List accounts) {
       this.accounts = accounts;
   }
  • IUserDao.java
      /**
    * 查询所有用户
    * @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 findAll();
  • IAccountDao.java
  package com.itheima.dao;

import com.itheima.domain.Account;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
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"),
           @Result(property = "user",column = "uid",one=@One(select="com.itheima.dao.IUserDao.findById",fetchType= FetchType.EAGER))
   })
   List findAll();

   /**
    * 根据用户id查询账户信息
    * @param userId
    * @return
    */
   @Select("select * from account where uid = #{userId}")
   List findAccountByUid(Integer userId);
}

  • AnnotationCRUDTest.java
  package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.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.InputStream;
import java.util.List;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class AnnotationCRUDTest {
   private InputStream in;
   private SqlSessionFactory factory;
   private SqlSession session;
   private IUserDao userDao;

   @Before
   public  void init()throws Exception{
       in = Resources.getResourceAsStream("SqlMapConfig.xml");
       factory = new SqlSessionFactoryBuilder().build(in);
       session = factory.openSession();
       userDao = session.getMapper(IUserDao.class);
   }

   @After
   public  void destroy()throws  Exception{
       session.commit();
       session.close();
       in.close();
   }

   @Test
   public  void  testFindAll(){
       List users = userDao.findAll();
//        for(User user : users){
//            System.out.println("---每个用户的信息----");
//            System.out.println(user);
//            System.out.println(user.getAccounts());
//        }
   }

   @Test
   public void testFindOne(){
       User user = userDao.findById(57);
       System.out.println(user);
   }


   @Test
   public  void testFindByName(){
       List users = userDao.findUserByName("%mybatis%");
       for(User user : users){
           System.out.println(user);
       }
   }


}

mybatis注解开发使用二级缓存

  • SecondLevelCatchTest.java
   package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.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.InputStream;

/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*/
public class SecondLevelCatchTest {

   private InputStream in;
   private SqlSessionFactory factory;


   @Before
   public  void init()throws Exception{
       in = Resources.getResourceAsStream("SqlMapConfig.xml");
       factory = new SqlSessionFactoryBuilder().build(in);

   }

   @After
   public  void destroy()throws  Exception{

       in.close();
   }

   @Test
   public void testFindOne(){
       SqlSession session = factory.openSession();
       IUserDao userDao = session.getMapper(IUserDao.class);
       User user = userDao.findById(57);
       System.out.println(user);

       session.close();//释放一级缓存

       SqlSession session1 = factory.openSession();//再次打开session
       IUserDao userDao1 = session1.getMapper(IUserDao.class);
       User user1 = userDao1.findById(57);
       System.out.println(user1);


       session1.close();

   }
}

  • IUserDao.java and SqlMapConfig.xml
 @CacheNamespace(blocking = true)
 public interface IUserDao {
    ***
 }



  
   
       
   

你可能感兴趣的:(Mybatis注解开发-2020.03.25)