注解开发
@Select注解( @Update、@Delete、@Insert三个注解与Select对照学习)
- 在接口上实现注解
@Select("select id,username,pwd as password from user")
List<User> getUserList();
- 核心配置文件中绑定接口
<mappers>
<mapper class="Dao.UserMapper"/>
</mappers>
- 测试类
@Test
public void getUserList(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
关于@Param() 注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略
- 在SQL中引用的就是这里的 @Param() 中设定的属性名!
teacher getAllTeacher(@Param("tid") int id);
Lombok插件
构建实体类时的偷懒操作,使用Lombok插件,来帮助我们创建实体类的有参构造,无参构造,get、set方法等
相关注解:
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger
@Data
@Builder
@Singular
@Delegate
@Value
@Accessors
@Wither
@SneakyThrows
使用Lombok插件开发步骤:
- 在IDEA中安装Lombok插件
- 在Maven项目中导入依赖(Jar包)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
- 在实体类上方使用注解
多对一情况处理(使用 关联 - association解决)
多名同学上同一位老师的课程
- 实体类
//学生类
@Data
public class student {
private int id;
private String name;
private teacher teacher;
}
//老师类
@Data
public class teacher {
private int id;
private String name;
}
- studentMapper接口实现
public interface studentMapper {
List<student> getAllStudent();
List<student> getAllStudent2();
}
- studentMapper.xml实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Dao.studentMapper">
<!--按照结果查询-->
<select id="getAllStudent2" resultMap="student_teacher2">
select s.id sid,s.name sname,t.name tname from student s ,teacher t where s.tid=t.id
</select>
<resultMap id="student_teacher2" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
<!--子查询-->
<select id="getAllStudent" resultType="student" resultMap="student_teacher" >
select * from mybatis.student
</select>
<select id="getAllTeacher" resultType="teacher">
select * from mybatis.teacher
</select>
<resultMap id="student_teacher" type="student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<association property="teacher" javaType="teacher" column="tid" select="getAllTeacher"/>
</resultMap>
</mapper>
- 测试类实现
@Test
public void getAllstudent(){//通过子查询,来获得结果
SqlSession sqlSession = MyBatisUtils.getSqlSession();
studentMapper mapper = sqlSession.getMapper(studentMapper.class);
List<student> allStudent = mapper.getAllStudent();
for (student student : allStudent) {
System.out.println(student);
}
sqlSession.close();
}
@Test
public void getAllstudent2(){ //通过多表查询,来获得结果
SqlSession sqlSession = MyBatisUtils.getSqlSession();
studentMapper mapper = sqlSession.getMapper(studentMapper.class);
List<student> allStudent = mapper.getAllStudent2();
for (student student : allStudent) {
System.out.println(student);
}
sqlSession.close();
}
一对多处理(使用集合 - collection来解决问题)
一个老师拥有多个学生
- teacherMapper 接口实现
public interface teacherMapper {
teacher getAllTeacher(@Param("tid") int id);
teacher getAllTeacher2(@Param("tid") int id);
}
- teacherMapper.xml实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Dao.teacherMapper">
<!--多表查询获得结果-->
<select id="getAllTeacher" resultMap="student_teacher" >
select t.id tid ,t.name tname,s.name sname,s.id sid from mybatis.teacher t,mybatis.student s where t.id=s.tid and t.id=#{tid}
</select>
<resultMap id="student_teacher" 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="getAllTeacher2" resultMap="student_teacher2">
select t.id tid,t.name tname from mybatis.teacher t where t.id=#{tid}
</select>
<resultMap id="student_teacher2" type="teacher" >
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" javaType="ArrayList" ofType="student" select="getstudent" column="tid"/>
</resultMap>
<select id="getstudent" resultType="student">
select * from mybatis.student s where s.tid=#{tid}
</select>
</mapper>
- 测试类实现
@Test
public void mytest(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
teacherMapper mapper = sqlSession.getMapper(teacherMapper.class);
teacher allTeacher = mapper.getAllTeacher(1);
System.out.println(allTeacher);
sqlSession.close();
}
@Test
public void mytest2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
teacherMapper mapper = sqlSession.getMapper(teacherMapper.class);
teacher allTeacher = mapper.getAllTeacher2(1);
System.out.println(allTeacher);
sqlSession.close();
}
JavaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的 pojo类型,泛型中的约束类型!