-
Mybatis框架,是ORM(Object Relation Mapping,对象关系映射)的一种实现框架,都是对jdbc的封装
-
MyBatis可以通过XML或者注解的方式,来配置映射类型、接口和实体
-
MyBatis框架的优点如下:
- 比JDBC少50%以上的代码;
- MyBatis是最简单的持久化框架,简单易学;
- MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL用XML编写,与程序代码分离,降低耦合度,便于统一管理和优化,且可重用;
- 提供XML标签,支持动态SQL语句编写;
- 提供映射标签,支持对象与数据库的ORM字段关系映射。
- MyBatis框架的缺点
- SQL语句的编写工作量较大,对开发人员编写SQL语句的功底有一定要求;
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
- MyBatis框架适用场合
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,对性能的要求很高,或者需求变化较多的项目,如互联网项目,那么MyBatis将是不错的选择
- 既然是框架,对数据库的增删改查肯定是不会写在程序里面的,所以我们以后Dao层的SQL语句,不会写在UserDaoImpll,而是创建实体与映射关系文件,也就是mybatis的Mapper.xml文件,通过mybatis为我们查询并按照映射返回一个封装好了的查询的值,以后的SQL语句就写在Mapper.xml文件中,
1.1.2 Mybatis配置文件——mybatis-config.xml
- 最后创建一个mybatis配置文件:mybatis-config.xml文件
- 以后再用到UserDaoImpl的时候,通过mybatis的api创建一个实现类对象,下面是基础,以后会结合spring使用
2. Mybatis配置文件详解
- 就是配置一下数据库
- 先写一个jdbc.properties
- 再看配置文件
- 可以看到,我除了environments标签配置数据库还有其他标签,下面这篇文章中列了所有的标签,并侧重说明
- Mybatis配置文件
代码在Mapper.xml文件
3.1.查
UserDao层的方法如下,看注释
mapper代码
3.2 删改select *from t_user where id = #{id} and username = #{username}
UserDao
mapper代码
3.3 增insertdelete from t_user where id = #{id} update t_user set username = #{username},password = #{password} where id = #{id}
UserDao
void insertById(User user);
mapper代码
3.4 主键回填insert into t_user(username,password,gender,regist_time) values (#{username},#{password},#{gender},#{regist_time})
调用方法时参数User user不给id,但把自动增长的id返回给user
select last_insert_id()
insert into t_user(username,password,gender,regist_time)
values (#{username},#{password},#{gender},#{regist_time})
主键id是字符串类型,字符串就不能自动增长了,那怎么自动填写?
UUID生成字符串,由于UUID有“-”,我们replace替换掉
select replace(UUID(),"-","") insert into t_user(id,username,password,gender,regist_time) values (#{id},#{username},#{password},#{gender},#{regist_time})
- 以上代码对比上一个selectKey标签的属性 order的值变为了before,要做执行插入前就要执行,resultType=“String”是和id的类型对应,keyProperty是对应parameterType的User的id
- 由于不能自动增长,sql语句中要插入id
- 对于上面的sql查询语句,如果数据库表里的名字和当前实体类的属性不同名
该标签,简单来说,就是数据库表里的名字和实体类名字不一样的映射
- 上面是关联查询,代码有点多,再来个简单例题:如下
resultMap的association标签
- 上面的association标签,是映射了一个Passport类,我的Passenger类中有一个Passport属性,如下
- 里面的Passport属性的映射就是用association标签来写的
- 如果是一个List
属性就用collection标签
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}
-
上面一对一查询用不到
标签(resultMap是对查询结构封装,这里查询结果就一行数据,所以用到的是association) -
那如果是一对多的关系,比如员工Employee和Department部门的对应
-
sql语句和resultMap映射应该怎么写?
-
resultMap和上面大致一样,只不过这里查询的是多条语句,List集合,用
标签,sql语句
- 多对多的关系,学生Student和课程Subject
- 想要查询,要新建第三张表t_stu_sub
- 且这个表的主键是联合主键,意思是student_id和subject_id不能有两行一样的
如果id!=null就查询id=?的,如果username!=null就查询username=?的
查询id=?或者username=?
查询id=?且username= ?的
替换 where标签
替换set标签
用于枚举删除,
delete from t_user where id in (1,2,4,5),注意这里方法的参数是一个List集合,集合里面是你要删除的id值
这里举例的是删除
用于枚举插入List
insert into t_user (null,x,x,x,x),(null,x,x,x,x),(null,x,x,x,x)注意这里方法的参数是一个List集合,集合里面是User类型
用于UserDao的方法上
就不用mapper.xml文件映射了,还是mapper更灵活一点,所以注解我们了解一下就可以了



