SSM学习之路——Mybatis第四天_使用注解

一、使用注解CRUD

(1)创建接口类

在这里插入图片描述
注解使用方法如下
Mybatis提供了Select,Insert,Update,Delete四个主要注解

package com.itheima.dao;

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

import java.util.List;

public interface IUserDao {
    @Select("select * from user")
    List<User> findAll();

    @Select("select * from user where id = #{id}")
    User findById(Integer id);

    @Insert("insert into user(username,birthday,address,sex) values (#{username},#{birthday},#{address},#{sex})")
    @SelectKey(keyProperty = "id",keyColumn = "id",resultType = Integer.class,before = false,statement = "select last_insert_id()")
    int insertUser(User user);

    @Update("update user set username=#{username},address=#{address},birthday=#{birthday},sex=#{sex} where id=#{id}")
    int updateUser(User user);

    @Delete("delete  from user where id = #{id}")
    int deleteUser(Integer id);

    @Select("select count(*) from user")
    int countTotal();

    @Select("select * from user where username like #{username}")
    List<User> findByName(String username);

}

(2)创建实体类

生成对应的get&set&toString
在这里插入图片描述

(3)编写测试类

在这里插入图片描述

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;

public class annotationsTest {
    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();
        in.close();
    }

    @Test
    public void testFindAll(){
        List<User> users = userDao.findAll();
        for (User u:users){
            System.out.println(u);
        }
    }
    @Test
    public void testFindById(){
        User user = userDao.findById(76);
        System.out.println(user);
    }
    @Test
    public void testInsertUser(){
        User user = new User();
        user.setUsername("Annotation insert ");
        user.setAddress("金华市(注解插入)");
        user.setSex("女");
        user.setBirthday(new Date());

        //res为查询出来的行结果
        int res = userDao.insertUser(user);
        System.out.println("插入条数为:"+ res);
        System.out.println("新插入的id为:"+ user.getId());
        System.out.println(userDao.findById(user.getId()));
    }
    @Test
    public void testUpdateUser(){
        User user = userDao.findById(74);
        user.setUsername("update 老新新");
        int res = userDao.updateUser(user);

        System.out.println("更新条数为:"+ res);
        System.out.println("更新后的数据为"+ userDao.findById(74));
    }

    @Test
    public void testDeleteUser(){
        int res =userDao.deleteUser(77);
        System.out.println("删除条数为:"+ res);
        System.out.println("删除老mybatis 02");
    }
    @Test
    public void testCountTotal(){
        int res = userDao.countTotal();
        System.out.println("总数为 : " + res);
    }
    @Test
    public void testFindByName(){
        List<User> users = userDao.findByName("%老新%");
        for (User u:users){
            System.out.println(u);
        }
    }
}

testFindAll测试如下:
在这里插入图片描述

testFindByName测试结果如下:
在这里插入图片描述
testFindById测试结果如下:
在这里插入图片描述
testInsertUser测试结果如下:
在这里插入图片描述

testUpdateUser测试结果如下:
在这里插入图片描述
testDeleteUser测试结果如下:
在这里插入图片描述

testCountTotal测试结果如下:
在这里插入图片描述

二、复杂关系映射

@Results 注解 代替的是标签<resultMap> 该注解中可以使用单个@Result 注解,也可以使用@Result 集合
即:@Results({@Result(),@Result()})或@Results(@Result())

@Resutl 注解 代替了 <id>标签和<result>标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))

@One 注解(一对一) 代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。。
使用格式:@Result(column="",property="",one=@One(select=""))

@Many 注解(多对一) 代替了<Collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType (一般为 ArrayList)但是注解中可以不定义;
使用格式: @Result(property="",column="",many=@Many(select=""))

1、一对一关系映射

(1)新建Account实体类

并生成与数据库列名对应的字段,以及user对象,以及对应的set&get&tostrng

在这里插入图片描述

(2)新建IAccountDao接口

在这里插入图片描述

import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface IAccountDao {
    /**
     * 查询所有账户,采用延迟加载的方式查询账户的所属用户
     * * @return   */
    @Select("select * from account")
    @Results(id="accountMap",
            value= {
            //id = true为表示id为主键
            @Result(id=true,column="id",property="id"),
            @Result(column="uid",property="uid"),
            @Result(column="money",property="money"),
            @Result(column="uid",property="user",
            //select表示指定多表查询的映射sqlmapper,fatchType表示取得的方式,这里使用懒加载
            one=@One(select="com.itheima.dao.IUserDao.findById",
            fetchType= FetchType.LAZY))})
    List<Account> findAll();
}

(3)编写测试类

测试延迟加载
在这里插入图片描述
只查询了一个account表
在这里插入图片描述
补全后,查询成功,查出了该账户对应的用户信息,并且是懒加载的形式
在这里插入图片描述

2、一对多关系映射

(1)编写IAccountDao文件

加入这一段,表示查对应uid的所有账户,返回一个集合
在这里插入图片描述

(2)编写IUserDao文件

在这里插入图片描述

(3)修改实体类

修改user实体类

添加接收的一个Account集合,并生成get&set,并重新生成toString
在这里插入图片描述

修改Account实体类

由于在上面一对一的时候我们在Account类中添加了User对象,现在去掉,并重新生成toString
在这里插入图片描述

(4)编写测试类

在这里插入图片描述

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;

public class annotationOne2Many {
    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();
        in.close();
    }
    @Test
    public void testOne2Many(){
        List<User> users = userDao.findAll();
        for (User user:users){
            if (user.getAccounts().size() > 0){
                System.out.println("-----one data------");
                System.out.println(user);
                System.out.println(user.getAccounts());
            }
        }
    }
}

运行结果:
结果正确,并使用了延迟加载
在这里插入图片描述

可以发现,使用注解确实比使用XML简便很多!因为少了编写复杂的xml文件,但是为什么xml文件这么多东西,一个简单的注解就可以解决呢?

拿IUserDao.xml和使用注解的IUserDao接口来说,对应的颜色为对应的属性,注解里面的字符串 对应xml的sql语句

1、xml的全限定类名namespace由注解所在接口的包名+类名找到
2、xml中绿色线条的唯一标志id,对应注解所在接口的方法名
3、返回值类型resultType对应 注解所在接口的那个方法的返回值

在这里插入图片描述
在这里插入图片描述

二、使用二级缓存

注解使用二级缓存并没有什么其他的,测试类和其他都和上一篇SSM学习之路——Mybatis第四天_一级缓存和二级缓存
没什么区别,只是使用了注解而不是使用XML,开启注解只需要加上第一个红框框的@CacheNamespace(bloking = true)即可
在这里插入图片描述

注解到此结束,我的Mybatis学习也告一段落

用了超级久学Myabatis,每次都是零碎的学一点,并且时间大多花在编写调试之后 写的学习笔记blog,以往我学习东西,都是学了之后很久不用,后来就直接忘记了,又要重新查找资料,这次想好好的学习并且记录下属于自己的笔记,虽然编写记录blog确实非常费时间,都能够让我再看多一些内容,但是考虑到长远的回顾,觉得还是有必要花这一些时间,并且在学习之后可以巩固,因为在编写blog的过程中,有时候忘记了一个知识点,可以及时的再看一遍视频加深印象,看的视频是bilibili的黑马程序员的Mybatis教程,老师讲的很好,受益匪浅。加快学习SSM框架,完成进度1/3。

发布了23 篇原创文章 · 获赞 0 · 访问量 602

猜你喜欢

转载自blog.csdn.net/SixthMagnitude/article/details/104080175