Mybatis学习_06mybatis基于注解开发环境搭建单表多表操作二级缓存

本文详细介绍了在MyBatis框架中使用注解进行环境搭建、单表及多表查询操作的过程,包括实体类定义、DAO接口设计及测试类实现,同时探讨了一级与二级缓存的配置与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis中的注解开发

环境搭建
  • maven导包
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.itheima</groupId>
        <artifactId>day04_eesy_04annoOne2Many</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.5</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
            </dependency>
        </dependencies>
    
    </project>
    
  • 总配置文件
    <?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>
        <!-- 引入外部配置文件-->
        <properties resource="jdbcConfig.properties"></properties>
        <!--配置开启二级缓存-->
        <settings>
            <setting name="cacheEnabled" value="true"/>
        </settings>
    
        <!--配置实体类别名-->
        <typeAliases>
            <package name="com.itheima.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.itheima.dao"></package>
        </mappers>
    </configuration>
    
单表CRUD操作(代理DAO)+多表查询操作
  • 实体类(账户类+用户类)
    public class Account implements Serializable {
    
        private Integer id;
        private Integer uid;
        private Double money;
    
        //多对一(mybatis中称之为一对一)的映射:一个账户只能属于一个用户
        private User user;
    }
    public class User implements Serializable{
    
        private Integer userId;
        private String userName;
        private String userAddress;
        private String userSex;
        private Date userBirthday;
    
        //一对多关系映射:一个用户对应多个账户
        private List<Account> accounts;
    }
    + 接口类
    ```java
    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<Account> findAll();
    
        /**
        * 根据用户id查询账户信息
        * @param userId
        * @return
        */
        @Select("select * from account where uid = #{userId}")
        List<Account> findAccountByUid(Integer userId);
    }
    
    @CacheNamespace(blocking = true)
    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);
    
    
    }
    
  • 测试类
    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<User> 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<User> users = userDao.findUserByName("%mybatis%");
            for(User user : users){
                System.out.println(user);
            }
        }
    
    }
    public class AccountTest {
        private InputStream in;
        private SqlSessionFactory factory;
        private SqlSession session;
        private IAccountDao accountDao;
    
        @Before
        public  void init()throws Exception{
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            factory = new SqlSessionFactoryBuilder().build(in);
            session = factory.openSession();
            accountDao = session.getMapper(IAccountDao.class);
        }
    
        @After
        public  void destroy()throws  Exception{
            session.commit();
            session.close();
            in.close();
        }
    
        @Test
        public  void  testFindAll(){
            List<Account> accounts = accountDao.findAll();
            for(Account account : accounts){
                System.out.println("----每个账户的信息-----");
                System.out.println(account);
                System.out.println(account.getUser());
            }
        }
    
    }
    
缓存的配置
  • 一级缓存不用开,自动开启
  • 二级缓存先在总配置文件开启<settings><setting name="cacheEnabled" value="true"/></settings>,再在dao类里类名上面加注解@CacheNamespace(blocking = true)
  • 二级缓存测试类
    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();
    
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值