MyBatis框架 - 注解形式

目录

  • 一、用于写sql语句的注解
  • 二、结果映射注解
  • 三、实操案例
    • [1. 增删改查用注解操作](#1. 增删改查用注解操作)
    • [2. 多对一用注解操作 - 立即加载](#2. 多对一用注解操作 - 立即加载)
    • [3. 多对一用注解操作 - 延迟加载](#3. 多对一用注解操作 - 延迟加载)
    • [4. 一对多用注释操作 - 延迟加载](#4. 一对多用注释操作 - 延迟加载)

MyBatis除了可以在目录:resource -> mapper下创建配置文件,在配置文件写sql语句之外,还可以 直接在接口类中使用注解

一、用于写sql语句的注解

替代 XML 映射文件中的 <select><insert><update><delete>标签

  • @Select():用于写查询sql语句
  • @Insert():用于写添加sql语句
  • @Update():用于写修改sql语句
  • @Delete():用于写删除sql语句

二、结果映射注解

  • @Results():定义结果映射
  • @ResultMap():引用结果映射

三、实操案例

1. 增删改查用注解操作

  1. SqlMapConfig.xml配置文件和jadb.properties属性配置

    xml 复制代码
    <configuration>
        <!--读取外部文件-->
        <properties resource="jdbc.properties"/>
    
        <!--开启延迟加载-->
        <settings>
            <!--开启延迟加载-->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--将积极加载改为消极加载及按需加载-->
            <setting name="aggressiveLazyLoading" value="false"/>
            <!--开启二级缓存-->
            <setting name="cacheEnabled" value="true"/>
        </settings>
    
        <!--配置类型别名-->
        <typeAliases>
            <package name="com.tx.entity"/>
        </typeAliases>
        <!--配置环境们-->
        <environments default="mysql">
            <!--配置环境-->
            <environment id="mysql">
                <!--配置事务的类型,使用本地事务策略-->
                <transactionManager type="JDBC"></transactionManager>
                <!--配置是否使用连接池 POOLED表示使用链接池,UNPOOLED表示不使用连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--加载映射文件-->
        <mappers>
            <package name="com.tx.mapper"/>
        </mappers>
    </configuration>
    bash 复制代码
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///mybatis_db
    jdbc.username=root
    jdbc.password=root
  2. 编写UserMapper接口方法和注解

    java 复制代码
    package com.tx.mapper;
    
    import com.tx.entity.User;
    import org.apache.ibatis.annotations.*;
    
    import java.util.List;
    
    // 在mybatis中使用注解
    // 注解代替USerMapper.xml文件
    public interface UserMapper {
        // 查询所有方法
        @Select(value = "select * from user")
        @Results(id = "userMap", value={
                @Result(id = true, column = "id", property = "id"),
                @Result(column = "username", property = "username"),
                @Result(column = "birthday", property = "birthday"),
                @Result(column = "sex", property = "sex"),
                @Result(column = "address", property = "address"),
        })
        public List<User> findAll();
    
        // 通过id查找
        @Select(value = "select * from user where id = #{uid}")
        @ResultMap(value = "userMap")
        public User findById(Integer uid);
    
        // 添加
        @Insert(value="insert into user (username,birthday,sex,address) " +
                "values (#{username},#{birthday},#{sex},#{address})")
        public void insert(User user);
    
        // 修改
        @Update("update user set username = #{username},birthday=#{birthday},sex=#{sex},address=#{address} where id = #{id}")
        public void update(User user);
    
        // 删除
        @Delete("delete from user where id = #{id}")
        public void delete(Integer userId);
    
        // 查询数量
        @Select("select count(*) from user")
        public Integer findByCount();
    
        // 模糊查询
        @Select("select * from user where username like #{username}")
        public List<User> findByUsername(String username);
    }
  3. 编程测试代码

    java 复制代码
    package com.tx.test;
    
    import com.tx.entity.User;
    import com.tx.mapper.UserMapper;
    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.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    public class Test01 {
        private InputStream in;
        private SqlSessionFactory factory;
        private SqlSession session;
        private UserMapper mapper;
    
        @Before
        public void init() throws IOException {
            // 加载主配置文件
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 创建工厂对象
            factory = new SqlSessionFactoryBuilder().build(in);
            // 创建会话对象
            session = factory.openSession();
            mapper = session.getMapper(UserMapper.class);
        }
    
        @After
        public void destory() throws IOException {
            session.close();
            in.close();
        }
    
        @Test
        public void TestFindAll(){
            List<User> list = mapper.findAll();
            for (User user:list){
                System.out.println(user);
            }
        }
        @Test
        public void testFindById() {
            User user = mapper.findById(41);
            System.out.println(user);
        }
        
        @Test
        public void testInsert() throws Exception {
            // 创建User对象
            User user = new User();
            user.setUsername("美美2");
            user.setBirthday(new Date());
            user.setSex("女");
            user.setAddress("监狱");
    
            // 保存
            mapper.insert(user);
            session.commit();
        }
        
        @Test
        public void testUpdate() throws Exception {
            // 先通过id查询
            User user = mapper.findById(41);
            // 设置新的数据内容
            user.setUsername("熊大");
            user.setAddress("深林深处");
    
            // 修改
            mapper.update(user);
            session.commit();
        }
        
        @Test
        public void testDelete() throws Exception {
            mapper.delete(42);
            session.commit();
        }
    
        // 查询的是聚合函数
        @Test
        public void testFindByCount() throws Exception {
            Integer count = mapper.findByCount();
            System.out.println("总数量:"+count);
        }
    
        // 模糊查询
        @Test
        public void testFindByUsername() throws Exception {
            // 第一种测试的方式
            List<User> list = mapper.findByUsername("%王%");
            for (User user : list) {
                System.out.println(user);
            }
        }
    }

2. 多对一用注解操作 - 立即加载

  1. 编写AccountMapper接口方法和注解

    • 注意:使用user中的属性时,是property="user.username"这样调用。
    java 复制代码
    package com.tx.mapper;
    
    import com.tx.entity.Account;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface AccountMapper {
        // 多对一查询
        @Select("SELECT a.ID AS aid,a.UID,a.MONEY,u.* FROM account a,USER u WHERE a.UID = u.id")
        @Results(value= {
                @Result(id=true,column="aid",property="id"),
                @Result(column="uid",property="uid"),
                @Result(column="money",property="money"),
                @Result(column="id",property="user.id"),
                @Result(column="username",property="user.username"),
                @Result(column="birthday",property="user.birthday"),
                @Result(column="sex",property="user.sex"),
                @Result(column="address",property="user.address")
        })
        public List<Account> findAll();
    }
  2. 编程测试代码

    java 复制代码
    package com.tx.test;
    
    import com.tx.entity.Account;
    import com.tx.mapper.AccountMapper;
    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.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class Test02 {
        private InputStream in;
        private SqlSessionFactory factory;
        private SqlSession session;
    
        @Before
        public void init() throws IOException {
            // 1. 加载主配置文件,目的是构建SqlSessionFactory对象
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2. 创建SqlSessionFactory(Sql会话工厂)对象
            factory = new SqlSessionFactoryBuilder().build(in);
            // 3. 获取session对象,使用SqlSessionFactory工厂对象创建SqlSession对象
            session = factory.openSession();
        }
    
        @After
        public void destory() throws IOException {
            // 5. 释放资源
            session.close();
            in.close();
        }
    
        // 4.1 多对一查询 - 立即加载
        @Test
        public void testFindAll(){
            // 4.1.1 通过session创建Mapper接口的代理对象
            AccountMapper mapper = session.getMapper(AccountMapper.class);
            // 4.1.2 执行方法
            List<Account> list = mapper.findAll();
            for (Account account:list){
                System.out.println(account);
            }
        }

3. 多对一用注解操作 - 延迟加载

  1. 编写AccountMapper1接口方法和注解

    • 注意:在注释中,延迟如何写:@Result(property = "user",javaType = User.class,column = "uid", one=@One(select = "com.tx.mapper.UserMapper.findById", fetchType = FetchType.LAZY))
    • 多对一 使用的是one=@One()
    java 复制代码
    package com.tx.mapper;
    
    import com.tx.entity.Account;
    import com.tx.entity.User;
    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;
    
    public interface AccountMapper1 {
        // 多对一查询
        @Select("select * from account")
        @Results(value= {
                @Result(id=true,column="aid",property="id"),
                @Result(column="uid",property="uid"),
                @Result(column="money",property="money"),
    
                @Result(property = "user",javaType = User.class,column = "uid",
                one=@One(select = "com.tx.mapper.UserMapper1.findById",
                        fetchType = FetchType.LAZY))
        })
        public List<Account> findAll();
    }
  2. 编写UserMapper接口方法和注解

    java 复制代码
    package com.tx.mapper;
    
    import com.tx.entity.User;
    import org.apache.ibatis.annotations.Select;
    
    public interface UserMapper1 {
        @Select(value="select * from user where id = #{uid}")
        public User findById(Integer uid);
    }
  3. 编程测试代码

    java 复制代码
    // 4.2 多对一查询 - 延迟加载
    @Test
    public void testFindAll1(){
        // 4.2.1 通过session创建Mapper接口的代理对象
        AccountMapper1 mapper = session.getMapper(AccountMapper1.class);
        // 4.2.2 执行方法
        List<Account> list = mapper.findAll();
        for (Account account:list){
            System.out.println(account.getMoney());
            System.out.println(account.getUser());
        }
    }

4. 一对多用注释操作 - 延迟加载

  1. 编写UserMapper2接口方法和注释

    • 注意:在注释中,延迟如何写:@Result(property = "accounts",column = "id", many = @Many(select = "com.tx.mapper.AccountMapper2.findByUId", fetchType = FetchType.LAZY))
    • 一对多 使用的是many = @Many()
    java 复制代码
    package com.tx.mapper;
    
    import com.tx.entity.User;
    import org.apache.ibatis.annotations.Many;
    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;
    
    public interface UserMapper2 {
        // 一对多 - 延迟加载
        @Select(value="select * from user")
        @Results(id="userMap",value= {
                @Result(id=true,column="id",property="id"),
                @Result(column="username",property="username"),
                @Result(column="birthday",property="birthday"),
                @Result(column="sex",property="sex"),
                @Result(column="address",property="address"),
    
                @Result(property = "accounts",column = "id",
                        many = @Many(select = "com.tx.mapper.AccountMapper2.findByUId",
                                fetchType = FetchType.LAZY))
        })
        public List<User> findAll();
    }
  2. 编程AccountMapper2接口方法和注释

    java 复制代码
    package com.tx.mapper;
    
    import com.tx.entity.Account;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface AccountMapper2 {
        // 一对多 - 延迟加载
        @Select("select * from account where uid = #{uid}")
        public List<Account> findByUId(Integer uid);
    }
  3. 编写测试代码

    java 复制代码
    // 4.3 一对多查询 - 延迟加载
    @Test
    public void testFindAll3() {
        UserMapper2 mapper = session.getMapper(UserMapper2.class);
        // 调用方法
        List<User> list = mapper.findAll();
        for (User user : list) {
            System.out.println(user.getUsername());
            System.out.println(user.getAccounts());
        }
    }
相关推荐
core5121 小时前
【Java AI 新纪元】Spring AI 深度解析:让 Java 开发者无缝接入大模型
java·人工智能·spring·ai
Y***89081 小时前
Spring Boot的项目结构
java·spring boot·后端
爬山算法1 小时前
Redis(154)Redis的数据一致性如何保证?
数据库·redis·bootstrap
e***0961 小时前
postgresql链接详解
数据库·postgresql
踢球的打工仔1 小时前
mysql数据表的基本操作
数据库·mysql
烤麻辣烫1 小时前
黑马程序员苍穹外卖(新手)DAY8
java·开发语言·学习·spring·intellij-idea
就叫飞六吧1 小时前
Java 中编译一个 java 源文件产生多个 .class 文件原因
java·开发语言
爱跑步的程序员~1 小时前
Elasticsearch倒排索引
java·大数据·elasticsearch·搜索引擎·全文检索
s***4531 小时前
Springboot-配置文件中敏感信息的加密:三种加密保护方法比较
java·spring boot·后端