Mybatis中的注解开发

本文介绍了如何在MyBatis中使用注解进行单表操作,如CRUD,并演示了多对一关联的案例,通过实例展示了如何配置SqlMapConfig.xml和编写测试类。

**注意 使用了注解项目中就不能存在xml的配置
其中 注解开发的配置 在SqlMapConfig.xml中

						    <!--指定带有注解的dao接口-->
<mappers>
    <package name="com.itheima.dao"></package>
</mappers>

**

1.单表中的注解查询

新建实体类
dao层 IUserDao

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;

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);

    /**
     * 更新操作
     */
    @Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
    void updateUser(User user);

    /**
     * 删除操作
     */
    @Delete("delete from user where id=#{id}")
    void deleteUser(Integer userId);

    /**
     * 根据用户ID查询信息
     */
    @Select("select * from user where id=#{id}")
    User findById(Integer userid);

    /**
     * 根据用户名称模糊查询
     */
    @Select("select *from user where username like #{username}")
    List<User> findUserByName(String username);

    /**
     * 查询总用户数量
     */
    @Select("select count(*) from user")
    int findTotalUser();
}

测试注解方法

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.Test;

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

public class MybatisTest01 {
    /***
     * 测试查询
     */
    @Test
    public void testSelect() throws Exception{
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }



    /**
     * 测试保存对象
     */
    @Test
    public void testSave() throws Exception{
        User user = new User();
        user.setUsername("mybatis save01");
        user.setAddress("3306");
        user.setSex("男");
        user.setBirthday(new Date());

        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法 保存
        userDao.saveUser(user);
        session.commit();
        //6.释放资源
        session.close();
        in.close();

    }

    /***
     * 测试更新操作
     * @throws Exception
     */
    @Test
    public void testUpdate() throws Exception{
        User user = new User();
        user.setId(50);
        user.setUsername("mybatis update01");
        user.setAddress("3307");
        user.setSex("女");
        user.setBirthday(new Date());

        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        userDao.updateUser(user);
        session.commit();
        //6.释放资源
        session.close();
        in.close();

    }

    /**
     * 测试删除操作
     */
    @Test
    public void testDelete() throws Exception{
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        userDao.deleteUser(52);
        session.commit();
        //6.释放资源
        session.close();
        in.close();
    }

    /**
     * 测试根据ID查找
     */
    @Test
    public void testFindOne() throws Exception{
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        User user = userDao.findById(46);
        session.commit();
        System.out.println(user);
        //6.释放资源
        session.close();
        in.close();
    }
    /***
     * 根据名称模糊查询
     */
    @Test
    public void testfindUserByName() throws Exception{
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findUserByName("%王%");
        for(User user:users){
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
    /**
     * 查询用户总数量
     */
    @Test
    public void testfindTotalUser() throws Exception{
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
       int total = userDao.findTotalUser();
        System.out.println(total);
        //6.释放资源
        session.close();
        in.close();
    }
}

2.多表查询

2.1多对一
User实体类

public class User  implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //一对多关系映射   主表实体应该包含从表实体的集合引用
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

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

    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 Date getBirthday() {
        return birthday;
    }

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

    public String getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

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

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

Account实体类

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;

    /**
     * 要表现出一对多的关系:从表实体应该包含一个主表的对象引用
     * 并且提供set和get的方法
     */
    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 +
                ", user=" + user +
                '}';
    }
}

配置SqlMapConfig.xml 配置相关内容 并指定带有注解的dao接口

<mappers>
    <package name="com.itheima.dao"></package>
</mappers>

IAccountDao

public interface IAccountDao {
    /**
     * 查询所有的账户,并且获取每个账户所属的用户信息
     */
    @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)),
            //多对一  其中是@One ,一对多则是@Many
    })
    List<Account> findAll();
   	List<Account> findAll();
    @Select("select * from account where uid=#{id}")
    List<Account> findAccountById(Integer id);

}

IUserDao

public interface IUserDao {

        /**
         * 查询所有
         * @return
         */
        @Select("select * from user")
        @Results(id="userMap",value = {
                @Result(id=true,column = "id",property = "id"),
                @Result(column = "username",property = "username"),
                @Result(column = "address",property = "address"),
                @Result(property = "sex",column = "sex"),
                @Result(column = "birthday",property = "birthday"),
                @Result(column = "id",property = "accounts",
                        many = @Many(select = "com.itheima.dao.IAccountDao.findAccountById",
                                fetchType = FetchType.LAZY))
        })
        List<User> findAll();

        /**
         * 根据用户ID查询信息
         */
        @Select("select * from user where id=#{id}")
        User findById(Integer userid);

测试类
AccountTest

public class AccountTest {
    @Test
    public void testSelect() throws Exception{
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IAccountDao userDao = session.getMapper(IAccountDao.class);
        //5.使用代理对象执行方法
        List<Account> accounts = userDao.findAll();
        for (Account account : accounts) {
            System.out.println("-----每个账户信息-----");
            System.out.println(account);
            System.out.println(account.getUser());
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

运行结果
在这里插入图片描述
测试类
UserTest

public class UserTest {
    @Test
    public void testSelect() throws Exception{
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产的SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession对象创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println("-----每个用户信息-----");
            System.out.println(user);
            System.out.println(user.getAccounts());
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

运行结果
在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值