渚漪Day28——SSM【Mybatis05】

8、使用注解

底层主要应用反射UserMapper.class

8.1、注解分析

@Select("select * from mybatis.user")
List<User> getUsers();
@Test
//查询全部
public void test1(){
    try(SqlSession session = MybatisUtils.getSqlSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> users = mapper.getUsers();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

等价于

interface+xml

List<User> getUsers();
<select id="getUsers" resultType="com.ijuy.pojo.User">
    select * from mybatis.user;
</select>

8.2、注解完成增删改查

  • CRUD

  • @Param()的使用

    • 基本类型的参数或者String类型需要加上
    • 引用类型不需要加
    • 如果只有一个基本类型的话可以忽略,但是建议加上
    • 在SQL中引用的就是@parm中设定的属性名
  • 自动事务提交

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }
    

9、Lombok

  1. idea是真的加载不出来这个插件(可能被抛弃了?)

  2. lombok简化了java操作,但是有缺点,改变人们的编程思维。

    综上不用

10、多对一处理

多对一复杂环境的搭建

建立师生SQL语句

CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); 

CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

测试环境搭建

按照查询嵌套处理

<select id="getStudent" resultMap="TeacherStudent">
    select* from mybatis.student
</select>

<resultMap id="TeacherStudent" type="student">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!--复杂的属性,单独处理
        对象:association
        集合:collection-->
    <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>

<select id="getTeacher" resultType="teacher">
    select * from mybatis.teacher where id=#{id}
</select>

按照结果嵌套查询

<select id="getStudent2" resultMap="TeacherStudent2">
        select s.id sId,s.name sName,t.id tId,t.name tName
        from mybatis.student as s,mybatis.teacher as t
#         where s.tid=t.id
    </select>

    <resultMap id="TeacherStudent2" type="student">
        <result property="id" column="sId"/>
        <result property="name" column="sName"/>
        <association property="teacher" javaType="teacher">
            <result property="id" column="tId"/>
            <result property="name" column="tName"/>
        </association>
    </resultMap>

结论:狂神查出的结果

teacher id = 0 是应为查询当中没有在association 标签中查询对象中的id属性

11、一对多处理

原理和多对一类似

代码

<select id="getTeacher1" resultMap="TeacherStudent1">
    select s.id sId,s.name sName,t.name tName,t.id tId
    from mybatis.teacher as t,mybatis.student as s
    where s.tid = #{tid}
</select>
<resultMap id="TeacherStudent1" type="teacher">
    <result property="id" column="tId"/>
    <result property="name" column="tName"/>
    <collection property="students" ofType="student">
        <result property="id" column="sId"/>
        <result property="name" column="sName"/>
        <result property="tid" column="tId"/>
    </collection>
</resultMap>






<select id="getTeacher2" resultMap="TeacherStudent2">
    select id,name from mybatis.teacher where id = #{tid}
</select>
<select id="getStudentByTeacherId" resultType="student">
    select s.id,s.name,s.tid from mybatis.student as s where tid = #{tid}
</select>
<resultMap id="TeacherStudent2" type="teacher">
    <result column="id" property="id"/>
    <collection property="students" javaType="ArrayList" ofType="student" select="getStudentByTeacherId" column="id"/>
</resultMap>

遇到的问题

此处加了“#” 报错

删除第九行却不报错

可能是两个#在转义的过程中形成了 ‘/注释’ where s.tid = ‘/注释’ {tid}这样的语句。导致去掉注释内容,还剩 {tid}。

错误无法得到验证,人为去掉注释内容,idea自动检测语法格式错误。

猜你喜欢

转载自www.cnblogs.com/ijuysama/p/12907574.html