简单的CRUD配置
前置准备:
- 由于mapper.xml会使用到pojo中的实体类,需要在核心配置文件中进行别名配置,使得不需要在mapper中指定实体类完整包路径。可以直接指定,也可以使用扫描包的形式
<!--可以给实体类取别名-->
<!--<typeAliases>-->
<!-- <typeAlias type="top.nz.pojo.User" alias="User"/>-->
<!--</typeAliases>-->
<!--扫描包,别名建议使用小写,大写也能跑。可以通过注解给类取别名@Alias("user")-->
<typeAliases>
<package name="top.nz.pojo"/>
</typeAliases>
- 在核心配置文件中注册mapper,可以使用class绑定(同名同包,可以使用注解和配置两种),resource直接绑定文件。
<mappers>
<mapper class="top.nz.dao.UserMapper" />
<mapper resource="top/nz/dao/UserMapper.xml"/>
</mappers>
mapper.xml中的namespace和dao层对应
<mapper namespace="top.nz.dao.UserMapper">
CRUD
这里基本的配置中需要注意:
- Dao
- 之后配置的时候参数为基本类型或者String的时候记得在参数前面加上@Param(“别名”),在mapper.xml中默认以别名来取参数。
- 当实体类中属性比较多的时候,但是我们实际使用的时候并不需要把所有参数都取到,可以使用map传参,虽然不是推荐的方式,但是实际操作的时候会更加便捷。
实体类
// 实体类
public class User implements Serializable {
private int id;
private String name;
private String pwd;
}
Dao层接口
public interface UserMapper {
// 查询全部用户
List<User> getUserList();
// 根据ID查询用户
User getUserById(@Param("id") int id);
// 插入一个用户
int addUser(User user);
// 万能的map
// int addUser2(Map<String,Object> map);
// 修改用户
int updateUser(User user);
// 修改用户
int deleteUser(int id);
List<User> getUserLike(String value);
}
Dao层对应的mapper配置
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.nz.dao.UserMapper">
<!--查询所有用户-->
<select id="getUserList" resultType="top.nz.pojo.User">
select * from mybatis.user;
</select>
<!--根据ID查询用户-->
<select id="getUserById" parameterType="int" resultType="user" >
select * from mybatis.user where id = #{id};
</select>
<!--对象中的属性可以直接取出-->
<insert id="addUser" parameterType="user" >
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
<!-- <insert id="addUser2" parameterType="map" >
insert into mybatis.user (id,name,pwd) values (#{userid},#{userName},#{passWord});
</insert>-->
<!--修改用户-->
<update id="updateUser" parameterType="user" >
update mybatis.user set name=#{name},pwd = #{pwd} where id = #{id};
</update>
<!--修改用户-->
<update id="deleteUser" parameterType="int" >
delete from mybatis.user where id = #{id};
</update>
<!--模糊查询-->
<select id="getUserLike" resultType="user">
select * from mybatis.user where name like #{value}
</select>
</mapper>
分页实现的两种方式
实体类还是User
limit
Dao
// 分页
List<User> getUserByLimit(Map<String,Object> map);
mapper.xml
<!--分页实现查询-->
<select id="getUserByLimit" parameterType="map" resultMap="UserMapper">
select * from mybatis.user limit #{startIndex},#{pageSize};
</select>
测试
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userList = mapper.getUserByLimit(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
RowBounds
Dao
// 分页2
List<User> getUserByRowBounds();
mapper.xml
<!--分页实现查询-->
<select id="getUserByRowBounds" resultMap="UserMapper">
select * from mybatis.user;
</select>
测试
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 使用RowBounds实现
RowBounds rowBounds = new RowBounds(1,2);
// 通过Java代码实现分页
List<User> userList = sqlSession.selectList("top.nz.dao.UserMapper.getUserByRowBounds",null,rowBounds);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
使用注解开发
Mybatis中的注解开发的适用性太低了,所以基本还是以配置文件为主,这里就罗列Dao层的编写。
public interface UserMapper {
@Select("select * from user")
List<User> getUsers();
// 通过id查询
// 方法存在多个参数,所有的参数前面都需要加@Param注解
// #{id}取的参数为@Param中声明的。
@Select("select * from user where id = #{id} and name = #{name}")
User getUserById(@Param("id") int id,@Param("name") String name);
@Insert("insert into user (id,name,pwd)values(#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id") int id);
}
一对一
描述:一个学生有一个地址信息,学生表中的具体地址信息在地址表中,以外键约束。
实体类设计
public class Student {
private int id;
private String identid;
private String name;
private Adress ad;
public class Adress {
private int id;
private String location;
mapper.xml
<!-- 以学生id查询学生全部信息 -->
<select id="getStudent" parameterType="int" resultMap="getStudentMap">
select * from student s,adress ad where s.id=ad.id and s.id=#{id}
</select>
<!-- 查询语句查询结果映射 -->
<resultMap type="Student" id="getStudentMap">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="identid" column="identid" />
<association property="ad" javaType="NjjAdress">
<id property="id" column="id" />
<result property="location" column="location" />
</association>
</resultMap>
一对多(collection)
案例1
描述:一种类型的课程下有多门课程,课程类型和课程形成一对多
实体类设计
课程类型
public class SubjectType {
private int id;
private String name;
private List<Subject> sub;
}
课程
public class Subject {
private int id;
private String subjectName;
private SubjectType st;
}
mapper配置
<!-- 加载数据(方式1) -->
<select id="getSubjectType" parameterType="int" resultMap="getSubjectTypeMap">
select
sjt.id tid,
sjt.name tname,
s.*
from subjecttype sjt,subject s
where sjt.id=s.typeId
and sjt.id=#{id}
</select>
<resultMap type="SubjectType" id="getSubjectTypeMap">
<id property="id" column="tid" />
<result property="name" column="tname" />
<collection property="sub" ofType="Subject">
<id property="id" column="id" />
<result property="subjectName" column="subjectName" />
</collection>
</resultMap>
案例二
描述:以一趟具体的课程而言,一个老师管理多名学生
实体类设计
学生
public class Student {
private int id;
private String name;
// 学生需要关联一个老师
private int tid;
}
老师
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
Dao
// 获取指定老师下的所有学生(结果映射)
Teacher getTeacher(@Param("tid") int id);
mapper.xml
<!--得到指定老师下的所有的学生-->
<!--select t.id tid,t.name tname,s.id sid,s.name sname
from teacher t,student s
where s.tid = t.id and t.id = #{id};-->
<select id="getTeacher" parameterType="_int" resultMap="TeacherStudents">
select t.id tid,t.name tname,s.id sid,s.name sname
from teacher t,student s
where s.tid = t.id and t.id = #{tid};
</select>
<resultMap id="TeacherStudents" type="Teacher">
<result column="tid" property="id" />
<result column="tname" property="name" />
<!--复杂类型我们需要单独处理,对象:association 集合:collection
javaType:指定属性的类型
集合的泛型信息:我们使用ofType
-->
<collection property="students" ofType="Student">
<result column="sid" property="id" />
<result column="sname" property="name" />
<result column="tid" property="tid" />
</collection>
</resultMap>
Teacher(id=1, name=倪老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])
多对一(association)
描述:以一趟具体的课程而言,多个学生对一个老师。
实体类设计
学生
public class Student {
private int id;
private String name;
// 学生需要关联一个老师
private Teacher teacher;
}
老师
public class Teacher {
private int id;
private String name;
}
Dao
public List<Student> getStudents();
mapper.xml
<!--===========================================-->
<!--
思路二、按照结果嵌套处理
首先查出所有的结果
将结果映射给Teacher
-->
<select id="getStudents" resultMap="StudentTeacher">
select s.id id,s.name,t.id tid,t.name tname
from student s,teacher t
where s.tid = t.id;
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id" />
<result property="name" column="name" />
<association property="teacher" javaType="Teacher" >
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
Student(id=1, name=小明, teacher=Teacher(id=1, name=倪老师))
Student(id=2, name=小红, teacher=Teacher(id=1, name=倪老师))
Student(id=3, name=小张, teacher=Teacher(id=1, name=倪老师))
Student(id=4, name=小李, teacher=Teacher(id=1, name=倪老师))
Student(id=5, name=小王, teacher=Teacher(id=1, name=倪老师))