Mybatis笔记 (6)

增删改,没有任何特别需要改动的,正常定义<insert> <update> <delete> 即可

3. 多对多 3.1 建表 drop table IF EXISTS t_student; drop table IF EXISTS t_course; drop table IF EXISTS t_student_course; create table t_student( id int primary key AUTO_INCREMENT, name VARCHAR(50), age SMALLINT )DEFAULT CHARSET = utf8 ENGINE =innodb; create table t_course( id int primary key AUTO_INCREMENT, title VARCHAR(50) )DEFAULT CHARSET = utf8 ENGINE =innodb; create table t_student_course( student_id int, course_id int, FOREIGN KEY (student_id) REFERENCES t_student(id), FOREIGN KEY (course_id) REFERENCES t_course(id), PRIMARY KEY (student_id,course_id) )DEFAULT CHARSET = utf8 ENGINE =innodb; insert into t_student (name,age) values("zhangsan",18); insert into t_student (name,age) values("lisi",19); insert into t_course (title) values("java基础"); insert into t_course (title) values("mybatis"); insert into t_student_course values(1,1); insert into t_student_course values(1,2); insert into t_student_course values(2,1); insert into t_student_course values(2,2); 3.2 建类 public class Student { private Integer id; private String name; private Integer age; //关系属性 private List<Course> courses; //set/get } public class Course { private Integer id; private String title; //关系属性 private List<Student> students; //set/get } public class StudentCourse { private Integer studentId; private Integer courseId; //set/get } 3.3 查询 //StudentDAO public List<Student> queryStudents(); //StudentDAO.xml 映射文件 <!-- 定义映射规则 和一对多中使用一样--> <resultMap type="Student"> <id column="sid" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <!-- 此处使用collection和一对多中一样 --> <collection property="courses" ofType="Course"> <id column="cid" property="id"/> <result column="title" property="title"/> </collection> </resultMap> <!-- 查询,并根据映射规则完成数据封装 --> <select resultMap="student_course"> select t_student.id as sid, name, age, t_course.id as cid, title from t_student join t_student_course ON t_student.id = t_student_course.student_id JOIN t_course ON t_student_course.course_id = t_course.id; </select> 3.4 测试 StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class); //查询所有学生及其所有课程 List<Student> students = studentDAO.queryStudents(); //获取每个学生的所有课程 for(Student stu:students){ System.out.println(stu); for(Course cour:stu.getCourses()){ System.out.println(cour); } } 3.5 增加测试 //StudentDAO.xml <mapper namespace="com.zhj.dao.StudentDAO"> <!-- 增加Student到 t_student表 ( ops:后续操作需要新增学生的id )--> <insert parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into t_student(name,age) values(#{name},#{age}) </insert> </mapper> //StudentCourseDAO.xml <mapper namespace="com.zhj.dao.StudentCourseDAO"> <!-- 为学生添加课程 或 为课程添加学生 --> <insert parameterType="StudentCourse"> insert into t_student_course(student_id,course_id) values(#{studentId},#{courseId}) </insert> </mapper> //添加学生 赵六,并为其关联课程 1 // 获得 学生DAO 和 学生课程DAO StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class); StudentCourseDAO scDAO = sqlSession.getMapper(StudentCourseDAO.class); // 新建学生,并添加 Student student = new Student(null, "赵六", 22); studentDAO.insertStudent(student); // 新建学生赵六和课程1的关系,并添加 (为赵六添加课程 1) StudentCourse sc = new StudentCourse(student.getId(),1); scDAO.insertStudentCourse(sc); // 提交 sqlSession.commit(); 4. 关系的方向(了解)

单向关系:A B 双方,A中有B,或B中有A

双向关系:A B双方,A中有B,且B中有A

//互相持有彼此,即为双向关系 class User{ ... private List<Order> orders; } class Order{ ... private User user; } //Order不持有User,或User不持有Order,即为单向关系 class User{ ... private List<Order> orders; } class Order{ ... } 六、# 和 $ 1. 各自特点 //如果用$,则必须用 @Param注解,否则${name}会认为是要从参数中取名为name的属性 public List<User> test3(@Param("name") String a); <!-- 注意${} 就是在做字符拼接,所以此处用了【‘${name}’】而不是【${name}】 类比jdbc的sql语句的拼接: String; String sql = "select ... from tt2 where";//此处是要加单引号的 注意:sql拼接时,有sql注入的风险 --> <select parameterType="string" resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from tt2 where name = '${name}' </select> <!-- 注意#{} 就是在做占位符,所以此处用了【#{name}】而不是【’#{name}‘】 类比jdbc的sql语句的拼接: String; String sql = "select ... from tt2 where name=?“;//此处是不加单引号的 ... prepareStatement.executeQuery(sql,name);//占位符赋值 --> <select parameterType="string" resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from tt2 where name = #{name} </select> 2. 使用$场景 <select parameterType="string" resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from tt2 order by id ${name} </select> <select parameterType="string" resultType="com.zhj.domain.User"> select id,name,gender,create_time as createTime from ${tn} where name = #{name} </select> <!-- 用在列名上亦可 --> userDAO.test3("desc"); userDAO.test3("asc"); userDAO.test4("t_user"); userDAO.test4("t_admin"); 八、动态sql

在映射文件中,定义了要执行的sql语句,mybatis支持在sql语句中填充一些逻辑,是的sql语句可以呈现不同的语义,

即动态sql

1. IF

在sql中 注入 if ,可以让sql更加灵活,让一个查询语句,可以应对更多查询情景。

重点:== != > < >= <= and or

: 比较字符串需要加引号,比较数字、布尔、null不用加引号

常用:对参数是否为空的判断,动态决定sql语句的组成

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyywd.html