Mybatis知识点2

一、MyBatis通过注解的方式实现增删改查

package com.ape.dao;

import com.ape.pojo.Emp;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface EmpDao {
//增添信息
    @Insert("insert into emp(ename,egender,esalary) values (#{ename},#{egender},#{esalary})")
    public int saveEmp(Emp emp);
//增添信息(回填id)
    @Insert("insert into emp(ename,egender,esalary) values (#{ename},#{egender},#{esalary})")
    @Options(useGeneratedKeys = true,keyProperty = "eid")
    public int saveEmpBackOne(Emp emp);
//修改信息
    @Update("update emp set ename=#{ename},egender=#{egender},esalary=#{esalary} where eid=#{eid}")
    public int updateEmp(Emp Emp);
//通过id删除信息
    @Delete("delete from emp where eid=#{eid}")
    public int deleteById(int delId);
//查询所有
    @Select("select * from emp")
    public List findAll();

//通过id查询
    @Select("select * from emp where eid=#{eid}")
    public Emp findById(int id);

//    @Param给属性起别名
    @Select("select * from emp where ename=#{a}")
    public Emp findByName(@Param("a") String name);


    @Select("select * from emp where ename=#{names} and egender =#{genders}")
    public List findByNameAndGender(@Param("names") String name,@Param("genders") String gender);

    @Select("select * from emp")
    @Results(id="maps",value={
            @Result(id = true,column = "eid",property = "eid"),
            @Result(id=false,column = "ename",property ="ename"),
            @Result(id=false,column = "egender",property = "egender"),
            @Result(id =false,column = "esalary",property = "esalary")
    })
    public List findResultOne();

    @ResultMap("maps")//代码复用
    @Select("select * from emp")
    public List findResultTwo();

//    @ResultMap("maps")//相对于xml中的ResultMap属性
//    @SelectProvider(type = EmpDao.class,method = "findSql")
//    public List findSql(Emp emp);




}

以上的知识点总结:

1.在 MyBatis 中,@Options(useGeneratedKeys = true, keyProperty = "eid")是一个用于获取数据库自动生成主键的注解,通常配合INSERT操作使用。它的核心作用是:让 MyBatis 在插入数据后,自动将数据库生成的主键值回写到 Java 对象中。

2.在 MyBatis 中,@Param注解用于为方法参数起别名,解决多参数传递时的命名问题。当 Mapper 接口的方法有多个参数时,MyBatis 默认无法直接识别参数名称,需要通过@Param显式指定参数名,以便在 SQL 中正确引用。

3.在 MyBatis 中,@Results注解用于自定义 SQL 查询结果与 Java 对象属性的映射关系。当数据库表的列名与 Java 实体类的属性名不一致时,或需要进行复杂映射(如嵌套查询、集合映射)时,就需要使用这个注解。

4.Mybatis知识点2_第1张图片

5.Mybatis知识点2_第2张图片

二、级联查询

MyBatis实现多表查询的方式:
一.联合查询(一条sql语句查询所有结果)
二.级联查询(分步查询,将一条sql语句拆解为多条sql语句实现功能,并且一条查询语句的结果要传递给另外一条语句作为条件)
/**
 * 实现级联查询
 *
 * 一对一的注解实现:
 * one=@One(select = "命名空间.方法")
 *
 * 一对多的注解实现:
 * many=@Many(select = "命名空间.方法")
 *
 *
 * */
    一对一的级联查询-->




一对多的级联查询
  在  元素中通常使用以下属性。
      ● property:指定映射到实体类的对象属性。
      ● column:指定表中对应的字段(即查询返回的列名)。
      ● javaType:指定映射到实体对象属性的类型。
      ● select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询``
  -->

一对一(xml的方式)

1.定义接口

public interface IAccountDao {

    //一对一(级联查询)
    public Account getAccount(Integer aid);

 
}

2.实体类

package com.ape.pojo;

import java.io.Serializable;

public class Account implements Serializable {

    private Integer aid;
    private Integer auserid;
    private Double amoney;

    //一对一关系映射
    private User user;

    @Override
    public String toString() {
        return "Account{" +
                "aid=" + aid +
                ", auserid=" + auserid +
                ", amoney=" + amoney +
                ", user=" + user +
                '}';
    }

    public Integer getAid() {
        return aid;
    }

    public void setAid(Integer aid) {
        this.aid = aid;
    }

    public Integer getAuserid() {
        return auserid;
    }

    public void setAuserid(Integer auserid) {
        this.auserid = auserid;
    }

    public Double getAmoney() {
        return amoney;
    }

    public void setAmoney(Double amoney) {
        this.amoney = amoney;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Account() {
    }

    public Account(Integer aid, Integer userid, Double amoney, User user) {
        this.aid = aid;
        this.auserid = auserid;
        this.amoney = amoney;
        this.user = user;
    }
}

3.xml文件






    
        
        
        








        

        
    

    

四、测试类

package com.ape.test;

import com.ape.dao.IAccountDao;
import com.ape.pojo.Account;
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;

public class AccountTest {
    InputStream is = null;
    SqlSessionFactoryBuilder ssfb = null;
    SqlSessionFactory factory = null;
    SqlSession session = null;


    @Before
    public void before()throws  Exception{
        //1.主配置文件路径
        String path = "mybatis_config.xml";
        //2.转换为流对象
        is = Resources.getResourceAsStream(path);
        //3.创建工厂构造器对象
        ssfb = new SqlSessionFactoryBuilder();
        //4.创建工厂(构造者模式)
        factory =  ssfb.build(is);
    }

    @After
    public void after()throws  Exception{
        //资源回收
        session.close();
        is.close();
    }

    @Test
    public void testFindAll(){
        session=factory.openSession();
        IAccountDao dao=session.getMapper(IAccountDao.class);
        Account account = dao.getAccount(1);
        System.out.println(account);
    }
}

一对多(注解)

1.接口

package com.apesource.dao;

import com.apesource.pojo.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 java.util.List;

public interface UserDao {

    /**
     *
     * 级联查询 一对一(user表来查询自己的userid)
     *
     */
    @Select("select * from user where userid = " +
            "#{userid}")
    public User findUserById(int userid);


    /**
     *
     * 一对多的  级联查询
     */
    @Select("select * from user")
    @Results(id = "map2",value = {
            @Result(id = true,property = "userid",column = "userid"),
            @Result(id = false,property = "username",column = "username"),
            @Result(id = false,property = "usersex",column = "usersex"),
            @Result(id = false,property = "useraddress",column = "useraddress"),
            @Result(id = false,property = "userbirthday",column = "userbirthday"),
            @Result(id = false,property = "accounts",column = "userid",
                    many = @Many(select = "com.apesource.dao.AccountDao.findAccountByUserId")
            )
    })
    public List findAllUser();

}

2.实体类

package com.apesource.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int userid;
    private String username;
    private String usersex;
    private String useraddress;
    private Date userbirthday;

    //一对多
    private List accounts;

}

3.测试

package com.apesource;

import com.apesource.dao.AccountDao;
import com.apesource.dao.UserDao;
import com.apesource.pojo.Account;
import com.apesource.pojo.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 test {
    InputStream is = null;
    SqlSessionFactoryBuilder ssfb = null;
    SqlSessionFactory factory = null;
    SqlSession session = null;


    @Before
    public void before()throws  Exception{
        //1.主配置文件路径
        String path = "mybatis_config.xml";
        //2.转换为流对象
        is = Resources.getResourceAsStream(path);
        //3.创建工厂构造器对象
        ssfb = new SqlSessionFactoryBuilder();
        //4.创建工厂(构造者模式)
        factory =  ssfb.build(is);
    }

    @After
    public void after()throws  Exception{
        //资源回收
        session.close();
        is.close();
    }



    //级联  一对多
    @Test
    public void test3() {
        //1.获取会话
        session =  factory.openSession(true);
        //2.获取映射器
        UserDao dao =  session.getMapper(UserDao.class);
        //3.调用方法
        List list =  dao.findAllUser();
        for(User user:list){
            System.out.println(user);
        }
    }

}

三、动态SQL






    


    


    



    



    

你可能感兴趣的:(Mybatis知识点2)