MyBatis基于注解开发
2020-11-14 本文已影响0人
_FireFly_
Student
public class Student {
private Integer sid;
private String sname;
private String ssex;
private Integer sage;
public Student() {
}
public Student(Integer sid, String sname, String ssex, Integer sage) {
this.sid = sid;
this.sname = sname;
this.ssex = ssex;
this.sage = sage;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", ssex='" + ssex + '\'' +
", sage=" + sage +
'}';
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public Integer getSage() {
return sage;
}
public void setSage(Integer sage) {
this.sage = sage;
}
}
Person
public class Person {
private Integer pid;
private String pname;
private IDCard idCard;//外键 对象 对象的id
//根据人的pid 查询人的信息+对应的身份证信息
public Person() {
}
public Person(Integer pid, String pname, IDCard idCard) {
this.pid = pid;
this.pname = pname;
this.idCard = idCard;
}
@Override
public String toString() {
return "Person{" +
"pid=" + pid +
", pname='" + pname + '\'' +
", idCard=" + idCard +
'}';
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public IDCard getIdCard() {
return idCard;
}
public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}
}
IDCard
package domain;
public class IDCard {
private String cardid;
private String address;
private Person person;//为了业务需求 放了一个关联属性
//一个身份证的cardid 查询身份证信息+跟他关联的人信息
public IDCard(){}
public IDCard(String cardid, String address, Person person) {
this.cardid = cardid;
this.address = address;
this.person = person;
}
@Override
public String toString() {
return "IDCard{" +
"cardid='" + cardid + '\'' +
", address='" + address + '\'' +
", person=" + person +
'}';
}
public String getCardid() {
return cardid;
}
public void setCardid(String cardid) {
this.cardid = cardid;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
StudentDao
package dao;
import domain.Student;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface StudentDao {
//设计一个删除单条记录的方法
@Delete("delete from student where sid = #{sid}")
void delete(Integer sid);
//方法的底层有一个代理 帮我们执行这个方法该做的事情
//分析方法 方法名字delete 方法参数sid
//分析mapper.xml 类名字dao.StudentDao---namespace
// 方法名字delete----------id
// mapper的<delete>-------SQL语句
// 语句上面有参数#{key}-----利用方法传递的sid参数进行匹配
// 代理对象会根据标签<delete> 调用原来sqlSession对象中的delete方法
//类方法名和sql之间的对应关系 找到sql 知道sql上面的信息 执行哪个方法
//如果将原有的xml文件删掉 改成注解的形式
//1.类 方法名和sql对应关系就简单了
//2.注解中的信息肯定需要写sql
//3.执行底层的哪个对应方法-----注解名字类似以前的标签名 为了找寻底层方法用的
// Insert Delete Update Select
@Insert("insert into student value (#{sid},#{sname},#{ssex},#{sage})")
//public void insert(Student student);//一个domain对象 一个基本值(int Integer String)
//public void insert(Map map);
public void insert(@Param("sid")Integer sid,@Param("sname")String sname,@Param("ssex")String ssex,@Param("sage")Integer sage);
//如果dao方法的参数不是包装成一个对象
// 1.sql中将原来的#{key}---#{param1} #{param2}
// 2.方法的每一个参数前面 添加@Param("key") 注解的key与SQL#{key} 对应
@Update("update student set sname=#{sname},ssex=#{ssex},sage=#{sage} where sid=#{sid}")
public void update(Student student);
//==================================================================================
//dao的方法 负责读取数据库中一行记录
@Select("select * from student where sid = #{sid}")
public Student selectOne(Integer sid);
//接口底层有一个代理类 ProxyStudentDao(对象)
//ProxyStudentDao代理对象帮我的Dao接口执行一个方法 selectOne
// 1.解析方法 类名字 方法名字 方法参数 返回值
// 2.解析mapper.xml文件 namespace 标签中的id SQL上的#{key} 标签中的resultType
// 类名字----找寻namespace
// 方法名字--找寻某一个标签中的id属性
// 进而找到标签中的一条SQL语句
// 方法的参数---与找到的SQL进行key匹配 组合成一条完整的SQL语句(可以执行的)
// 加载驱动
// 获取连接
// 获取状态参数啦
// 拼接SQL
// 执行查询操作ResultSet = executeQuery();
// 将结果集的信息取出来 存入一个新的容器内(容器的类型通过解析xml标签中的resultType属性来的)
// 资源全部关闭
// 将新的容器连同里面的数据返回
// 需要的信息 1.类名字 2.方法名字 3.定位注解在哪里 4.注解里获取一条SQL 5.SQL上面的信息(方法参数)
// 7.执行查询后的返回类型(当前方法的返回值类型) 8.底层执行的方法sqlSession.selectOne();(注解名字)
//查询多条记录
@Select("select * from student")
public List<Student> selectAll();
//表格之间的关系
// 一对一
// 一对多
// 多对多
//联合查询
// 先查一遍 再查一遍(立即加载 延迟加载)
// 联合的方式(等值连接 内连接 外连接)
}
PersonDao
package dao;
import domain.IDCard;
import domain.Person;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;
import java.util.List;
public interface PersonDao {
//设计一个方法 根据人的id 查询人的信息+连同对应的身份证信息
@Select("select * from person where pid = #{pid}")
@Results(
id="selectOne",
value={
@Result(property="pid",column="pid",id=true),
@Result(property="pname",column="pname"),
@Result(property="idCard",javaType=IDCard.class,column="cardid",one=@One(select="selectOneIDCard",fetchType=FetchType.LAZY))
}
)
public Person selectOne(Integer pid);//方法返回值对应的是xml resultMap标签中的type属性
//辅助方法
@Select("select * from idcard where cardid = #{cardid}")
public IDCard selectOneIDCard(String cardid);
//利用原来的xml形式
// 文件中有好多
// 1.namespace----类名
// 2.id-----------方法名
// 3.<select>-----@Select
// 4.标签中一条SQL--注解内有一条SQL
// 5.标签中resultMap-----@Results(自定义规则)
// id id
// result result
// association 对象
// 辅助查询 辅助查询--(一个方法 方法上的注解 SQL)
// 6.两个对象 第二个对象延迟机制 settings设置-----注解里设置
@Select("select * from person")
@ResultMap("selectOne")
public List<Person> selectAll();
}
PersonService
public class PersonService {
private PersonDao dao = MyUtil.getMapper(PersonDao.class,true);
//设计一个业务方法 根据人的id 查询人的信息+连同对应的身份证信息
public Person selectOne(Integer pid){
return dao.selectOne(pid);
}
public List<Person> selectAll(){
return dao.selectAll();
}
}
StudentService
public class StudentService {
//dao层对象作为属性
private StudentDao dao = MyUtil.getMapper(StudentDao.class,true);
//设计一个业务方法 删除学生
public void delete(Integer sid){
dao.delete(sid);
}
//设计一个业务方法 注册学生
// public void regist(Student student){
// dao.insert(student);
// }
// public void regist(Map map){
// dao.insert(map);
// }
public void regist(Integer sid,String sname,String ssex,Integer sage){
dao.insert(sid,sname,ssex,sage);
}
//设计一个业务方法 查询学生详情(单条)
public Student selectOne(Integer sid){
return dao.selectOne(sid);
}
//设计一个业务方法 查询多条学生信息
public List<Student> selectAll(){
return dao.selectAll();
}