1. Mybatis框架
- Mybatis框架,是ORM(Object Relation Mapping,对象关系映射)的一种实现框架,都是对jdbc的封装
1.1 Mybatis开发步骤
- 既然是框架,对数据库的增删改查肯定是不会写在程序里面的,所以我们以后的程序中,不会写UserDaoImpl这种实现类,而是创建实体与映射关系文件,也就是mybatis的Mapper.xml文件,通过mybatis它给我们创建一个实现类,以后的SQL语句就写在Mapper.xml文件中,
1.1.1 Mapper.xml文件
1.1.2 Mybatis配置文件——mybatis-config.xml
- 最后创建一个mybatis配置文件:mybatis-config.xml文件
- 以后再用到UserDaoImpl的时候,通过mybatis的api创建一个实现类对象,下面是基础,以后会结合spring使用
2. Mybatis配置文件详解
- 就是配置一下数据库
- 先写一个jdbc.properties
- 再看配置文件
- 可以看到,我除了environments标签配置数据库还有其他标签,下面这篇文章中列了所有的标签,并侧重说明
- Mybatis配置文件
3. Mybatis的CRUD操作【重点】
代码在Mapper.xml文件
3.1.查
UserDao层的方法如下,看注释 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="com.qf.dao.UserDao">
<select id="queryUserByIdAndUsername" resultType="User">
select *from t_user where id = #{id} and username = #{username}
</select>
<select id="queryUserByUsername" resultType="User">
select * from t_user where username = #{username}
</select>
<select id="queryUserByUnameAndPwd" resultType="User">
select *from t_user where username = #{username} and password = #{password}
</select>
</mapper>
3.2 删改
UserDao 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="com.qf.dao.UserDao">
<delete id="deleteById" parameterType="int">
delete from t_user where id = #{id}
</delete>
<update id="updateById" parameterType="User">
update t_user set username = #{username},password = #{password}
where id = #{id}
</update>
</mapper>
3.3 增insert
UserDao
void insertById(User user);
mapper代码
<insert id="insertById" parameterType="User">
insert into t_user(username,password,gender,regist_time)
values (#{username},#{password},#{gender},#{regist_time})
</insert>
3.4 主键回填
调用方法时参数User user不给id,但把自动增长的id返回给user
<insert id="insertById" parameterType="User">
<selectKey order="AFTER" resultType="int" keyProperty="id">
select last_insert_id()
</selectKey>
insert into t_user(username,password,gender,regist_time)
values (#{username},#{password},#{gender},#{regist_time})
</insert>
主键id是字符串类型,字符串就不能自动增长了,那怎么自动填写? UUID生成字符串,由于UUID有“-”,我们replace替换掉
<insert id="insertById" parameterType="User">
<selectKey order="BEFORE" resultType="String" keyProperty="id">
select replace(UUID(),"-","")
</selectKey>
insert into t_user(id,username,password,gender,regist_time)
values (#{id},#{username},#{password},#{gender},#{regist_time})
</insert>
- 以上代码对比上一个selectKey标签的属性 order的值变为了before,要做执行插入前就要执行,resultType=“String”是和id的类型对应,keyProperty是对应parameterType的User的id
- 由于不能自动增长,sql语句中要插入id
4. ORM映射【重点】
- 对于上面的sql查询语句,如果数据库表里的名字和当前实体类的属性不同名
4.1 resultMap标签-查询结果的封装规则
该标签,简单来说,就是数据库表里的名字和实体类名字不一样的映射
5.Mybatis多表关联查询
resultMap的association标签
- 上面的association标签,是映射了一个Passport类,我的Passenger类中有一个Passport属性,如下
- 里面的Passport属性的映射就是用association标签来写的
- 如果是一个List<Passport>属性就用collection标签
<resultMap id="first" type="Passenger">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
<association property="passport" javaType="Passport">
<id column="id" property="id"></id>
<result column="nationality" property="nationality"></result>
<result column="expire" property="expire"></result>
</association>
<collection property="passport" ofType="Passport">
<id column="id" property="id"></id>
<result column="nationality" property="nationality"></result>
<result column="expire" property="expire"></result>
</collection>
</resultMap>
<select id="queryPassengerByid" resultMap="first">
select e.id,e.name,e.sex,e.birthday,p.id,p.nationality,p.expire
from t_passengers e join t_passports p
on e.id = p.passenger_id
where e.id = #{id}
</select>
-
上面一对一查询用不到<collection>标签(resultMap是对查询结构封装,这里查询结果就一行数据,所以用到的是association) -
那如果是一对多的关系,比如员工Employee和Department部门的对应 -
sql语句和resultMap映射应该怎么写? -
resultMap和上面大致一样,只不过这里查询的是多条语句,List集合,用<collection>标签,sql语句
- 多对多的关系,学生Student和课程Subject
- 想要查询,要新建第三张表t_stu_sub
- 且这个表的主键是联合主键,意思是student_id和subject_id不能有两行一样的
6. 动态sql标签
6.1 sql标签-if标签
如果id!=null就查询id=?的,如果username!=null就查询username=?的
6.2 where标签
查询id=?或者username=? 查询id=?且username= ?的
6.3 set标签
6.4 trim标签
替换 where标签 替换set标签
6.4 foreach标签
6.4.1 批量删除
用于枚举删除, delete from t_user where id in (1,2,4,5),注意这里方法的参数是一个List集合,集合里面是你要删除的id值 这里举例的是删除
6.4.2 批量插入
用于枚举插入List<User> insert into t_user (null,x,x,x,x),(null,x,x,x,x),(null,x,x,x,x)注意这里方法的参数是一个List集合,集合里面是User类型
7. 注解开发
用于UserDao的方法上 就不用mapper.xml文件映射了,还是mapper更灵活一点,所以注解我们了解一下就可以了
8. 嵌套查询
|