一对一
环境准备
@Results:封装映射关系的父注解
Result[] value():定义了Result数组
@Result:封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
one属性:一对一查询固定属性
@one:一对一查询的注解
select属性:指定调用某个接口中的方法
card
package itheima.bean; public class Card { private Integer id; //主键id private String number; //身份证号 private Person p; //所属人的对象 public Card() { } public Card(Integer id, String number, Person p) { this.id = id; this.number = number; this.p = p; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Person getP() { return p; } public void setP(Person p) { this.p = p; } @Override public String toString() { return "Card{" + "id=" + id + ", number=‘" + number + ‘\‘‘ + ", p=" + p + ‘}‘; } }
Person
package itheima.bean; public class Person { private Integer id; //主键id private String name; //人的姓名 private Integer age; //人的年龄 public Person() { } public Person(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
CardMapper
package itheima.one_to_one; import itheima.bean.Card; import itheima.bean.Person; import org.apache.ibatis.annotations.One; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; public interface CardMapper { //查询全部 @Select("select * from card") @Results({ @Result(column = "id",property = "id"), @Result(column = "number",property = "number"), @Result( property = "p", //被包含对象的变量名 javaType = Person.class,//被包含对象实际的数据类型 column = "pid", //根据查询出的card表中的pid字段查询person表 /* * one,@one 一对一固定写法 * select属性:指定调用哪个接口中的哪个方法 * */ one=@One(select = "itheima.one_to_one.PersonMapper.selectById") ) }) public abstract List<Card> selectAll(); }
PersonMapper
package itheima.one_to_one; import itheima.bean.Person; import org.apache.ibatis.annotations.Select; public interface PersonMapper { //根绝id查询 @Select("select * from student where id=#{id}") public abstract Person selectById(Integer id); }
Test01
package itheima.one_to_one; import itheima.bean.Card; 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.List; public class Test01 { @Test public void selectAll() throws Exception { //1.加在核心配置文件 InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); //2.获取SqlSession工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //3.通过工厂对象获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(true); //4.获取StudentMapper接口的实现类对象 CardMapper mapper = sqlSession.getMapper(CardMapper.class); //5.调用实现类对象中的方法,接受结果 List<Card> list = mapper.selectAll(); //6.处理结果 for (Card card : list) { System.out.println(card); } //7.释放资源 sqlSession.close(); is.close(); } }
jdbc.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://192.168.23.129:3306/db2 username=root password=root
log4j.properties
# Global logging configuration # ERROR WARN INFO DEBUG log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!--MyBatis的DTD约束--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration 核心根标签--> <configuration> <!--引入数据库连接的配置文件--> <properties resource="jdbc.properties"/> <!--配置LOG4J--> <settings> <setting name="logImpl" value="log4j"/> </settings> <!--起别名--> <typeAliases> <package name="itheima.bean"/> </typeAliases> <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--> <environments default="mysql"> <!--environment配置数据库环境 id属性唯一标识--> <environment id="mysql"> <!-- transactionManager事务管理。 type属性,采用JDBC默认的事务--> <transactionManager type="JDBC"></transactionManager> <!-- dataSource数据源信息 type属性 连接池--> <dataSource type="POOLED"> <!-- property获取数据库连接的配置信息 --> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!--配置映射关系--> <mappers> <package name="itheima"/> </mappers> </configuration>
一对多
环境准备
@Results:封装映射关系的父注解
Result[]value():定义了Result数组
@Result:封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
many属性:一对多查询固定属性
@Many:一对多查询的注解
select属性:指定调用某个接口中的方法
bean目录下
Student
package itheima.bean; import java.util.List; public class Student { private Integer id; //主键id private String name; //学生姓名 private Integer age; //学生年龄 public Student() { } public Student(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
Classes
package itheima.bean; import java.util.List; public class Classes { private Integer id; //主键id private String name; //班级名称 private List<Student> students; //班级中所有学生对象 public Classes() { } public Classes(Integer id, String name, List<Student> students) { this.id = id; this.name = name; this.students = students; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } @Override public String toString() { return "Classes{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", students=" + students + ‘}‘; } }
one_to_many包下
ClassesMapper
package itheima.one_to_many; import itheima.bean.Classes; 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 ClassesMapper { //查询全部 @Select("select * from classes") @Results({ @Result(column = "id",property = "id"), @Result(column = "name",property = "name"), @Result( property = "students",//被包含对象的变量名 javaType = List.class,//被包含对象的实际数据类型 column = "id", //根据查询出的classes表中的id字段来查询student表 /* * many,@many 一对多查询的固定写法 * select属性:指定调用哪个接口中的哪个查询方法 * */ many = @Many(select ="itheima.one_to_many.StudentMapper.selectByCid") ) }) public abstract List<Classes> selecrAll(); }
StudentMapper
package itheima.one_to_many; import itheima.bean.Student; import org.apache.ibatis.annotations.Select; import java.util.List; public interface StudentMapper { //根据cid查询student表 @Select("select * from student where cid=#{cid}") public abstract List<Student> selectByCid(Integer cid); }
Test01
package itheima.one_to_many; import itheima.bean.Card; import itheima.bean.Classes; import itheima.bean.Student; 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 org.w3c.dom.ls.LSOutput; import java.io.InputStream; import java.util.List; import java.util.SortedMap; public class Test01 { @Test public void selectAll() throws Exception { //1.加在核心配置文件 InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); //2.获取SqlSession工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //3.通过工厂对象获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(true); //4.获取StudentMapper接口的实现类对象 ClassesMapper mapper= sqlSession.getMapper(ClassesMapper.class); //5.调用实现类对象中的方法,接受结果 List<Classes> list = mapper.selecrAll(); //6.处理结果 for (Classes cls : list) { System.out.println(cls.getId()+","+cls.getName()); List<Student> students = cls.getStudents(); for (Student student : students) { System.out.println("\t"+student); } } //7.释放资源 sqlSession.close(); is.close(); } }
多对多
环境准备
@result:封装映射关系的父注解
Result[] value():定义了Result数组
@Result:封装映射关系的子注解
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
many属性:一对多查询固定属性
@Many:一对多查询的注解
select属性:指定调用某个接口中的方法
bean目录下 Course
package itheima.bean; public class Course { private Integer id; //主键id private String name; //课程名称 public Course() { } public Course(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Course{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ‘}‘; } }
Student
package itheima.bean; import java.util.List; public class Student { private Integer id; //主键id private String name; //学生姓名 private Integer age; //学生年龄 private List<Course> courses; //学生选择的课程集合 public Student() { } public Student(Integer id, String name, Integer age, List<Course> courses) { this.id = id; this.name = name; this.age = age; this.courses = courses; } public List<Course> getCourses() { return courses; } public void setCourses(List<Course> courses) { this.courses = courses; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", age=" + age + ", course=" + courses + ‘}‘; } }
many_to_many包下CourseMapper
package itheima.many_to_many; import itheima.bean.Course; import org.apache.ibatis.annotations.Select; import java.util.List; public interface CourseMapper { @Select("select c.id,c.name from stu_cr sc,course c where sc.cid=c.id and sc.sid=#{id}") public abstract List<Course> selectBySid(Integer id); }
StudentMapper
package itheima.many_to_many; import itheima.bean.Student; 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 StudentMapper { //查询全部 @Select("select distinct s.id,s.name,s.age from student s,stu_cr sc where sc.sid=s.id") @Results({ @Result(column = "id",property = "id"), @Result(column = "name",property = "name"), @Result(column = "age",property = "age"), @Result( property = "courses",//被包含对象的变量名 javaType = List.class,//被包含对象的实际数据类型 column = "id", //根据查询出student表的id作为关联条件去查询中间表和课程表 /* * many,@Many 一对多查询的固定写法 * select属性:指定调用哪个接口中的哪个查询方法 * * */ many = @Many(select = "itheima.many_to_many.CourseMapper.selectBySid") ) }) public abstract List<Student> selectAll(); }
Test01
package itheima.many_to_many; import itheima.bean.Classes; import itheima.bean.Course; import itheima.bean.Student; import itheima.one_to_many.ClassesMapper; 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.List; public class Test01 { @Test public void selectAll() throws Exception { //1.加在核心配置文件 InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); //2.获取SqlSession工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //3.通过工厂对象获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(true); //4.获取StudentMapper接口的实现类对象 StudentMapper mapper= sqlSession.getMapper(StudentMapper.class); //5.调用实现类对象中的方法,接受结果 List<Student> list = mapper.selectAll(); //6.处理结果 for (Student student : list) { System.out.println(student.getId()+","+student.getName()+","+student.getAge()); List<Course> courses = student.getCourses(); for (Course crs : courses) { System.out.println("\t"+crs); } } //7.释放资源 sqlSession.close(); is.close(); } }
数据库表
一对一
CREATE DATABASE db2; USE db2; CREATE TABLE person( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT ); INSERT INTO person VALUES (NULL,‘张三‘,23); INSERT INTO person VALUES (NULL,‘李四‘,24); INSERT INTO person VALUES (NULL,‘王五‘,25); CREATE TABLE card( id INT PRIMARY KEY AUTO_INCREMENT, number VARCHAR(30), pid INT, CONSTRAINT cp_fk FOREIGN KEY (pid) REFERENCES person(id) ); INSERT INTO card VALUES (NULL,‘12345‘,1); INSERT INTO card VALUES (NULL,‘23456‘,2); INSERT INTO card VALUES (NULL,‘34567‘,3); select c.id cid,number,pid NAME age from card c,person p where c.pid=p.id
一对多
CREATE TABLE classes( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO classes VALUES (NULL,‘黑马一班‘); INSERT INTO classes VALUES (NULL,‘黑马二班‘); CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30), age INT, cid INT, CONSTRAINT cs_fk FOREIGN KEY (cid) REFERENCES classes(id) ); INSERT INTO student VALUES (NULL,‘张三‘,23,1); INSERT INTO student VALUES (NULL,‘李四‘,24,1); INSERT INTO student VALUES (NULL,‘王五‘,25,2); INSERT INTO student VALUES (NULL,‘赵六‘,26,2); select c.id cid,c.name cname,s.id sid,s.name sname,s.age sage from classes c,student s where c.id=s.cid
多对多
CREATE TABLE course( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO course VALUES (NULL,‘语文‘); INSERT INTO course VALUES (NULL,‘数学‘); CREATE TABLE stu_cr( id INT PRIMARY KEY AUTO_INCREMENT, sid INT, cid INT, CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id), CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id) ); INSERT INTO stu_cr VALUES (NULL,1,1); INSERT INTO stu_cr VALUES (NULL,1,2); INSERT INTO stu_cr VALUES (NULL,2,1); INSERT INTO stu_cr VALUES (NULL,2,2); select sc.sid,s.name sname,s.age sage,sc.cid,c.name cname from student s,course c,stu_cr sc where sc.sid=s.id and sc.cid=c.id
注解多表操作小结
@Result:封装映射关系的父注解
Result[]value():定义了Result数组
@Result:封装映射关系的子注解
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据属性
one属性:一对一查询固定属性
many属性:一对多查询固定属性,多对多
@One:一对一查询的注解
select属性:指定调用某个接口中的方法
@Many:一对多,多对多的注解
select属性:指定调用某个接口中的方法
原文:https://www.cnblogs.com/faded8679/p/14809060.html