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 实体类的属性名不一致时,或需要进行复杂映射(如嵌套查询、集合映射)时,就需要使用这个注解。
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