mybatis常用技术以及基本概念的了解
1:一对一:A表的一条字段对应B表的一条字段(反过来也是)
2:一对多:A表的一条字段对应B表的多条字段(反过来是多对一)
3.多对多:A表的一条字段对应B表的多条字段,B表的一条字段也对应A表的多条字段
mybatis原理:
1)三大核心API
SqlSessionFactoryBuilder:该对象会根据mybatis的主配置文件SqlMapConfig.xml生成SqlSessionFactory对象
sqlSessionFactory:每一个mybatis程序的核心,它的作用是读取配置文件,生成对应的sql执行对象,并创建sqlSession对象
SqlSession:该对象包含了所有执行sql操作的方法,用于执行已映射的sql语句
2)对结果集的处理
mybatis会返回map类型的结果,即mybatis会将数据存进一个map对象里,字段名作为key,值作为value
3)映射器
Mapper映射器是开发者用于绑定映射语句(sql)的接口,接口中的方法名对应于映射语句的id属性(两者必须保持一致),映射文件的命名空间必须指定为对应接口的完整路径名
配置文件
对应的接口
测试方法
控制台输出
mybatis如何配置这里就不多说了,下面贴出来的是数据库表的信息和实体类
demo_user
demo_dept
demo_district
demo_vehicle(该表用来演示鉴别器)
实体类,对应的get,set方法省略
对应demo_user,这里dept_id故意写成dept_ids
对应于demo_dept
对应于demo_district
对应于demo_vehicle,以下三个实体类用来演示鉴别器
数据库在进行插入数据操作时,对于主键id(假设主键是id)可以借助insert标签的keyProperty="id" 和 useGeneratedKeys="true"两个属性,这样就可以在sql里面不写id了,同时对应的实体类对象的id会自动赋值
说的通俗一点就是,你现在要执行一个录入操作,传入一个实体对象参数,即你传入的实体对象参数不需要为id手动赋值(调用set方法),并且当录入操作执行后,你调用实体对象的getId()发现此时id有值了,这就是所谓的自动返回主键值
但需要注意的是,这里只适用于主键可以设置成自动增长的数据库,比如mysql,而不支持自动增长的数据库比如oracle,则不能这样使用 看例子:
映射文件
测试代码
控制台输出
mybatis实现关联查询主要有两种方式
(一)嵌套查询:又叫分段查询,执行多条sql,比较繁琐
由实体类我们得知,用户类里面关联了一个部门对象,部门对象里关联了一个区域对象以及一个用来存储本部门所有员工信息的集合对象,现在我们希望通过mybatis实现这种结果的映射,即为关联对象赋值,那么该如何解决呢?
映射文件
映射器
测试方法
控制台输出
测试方法
控制台输出
(二)嵌套结果:只执行一条sql,比较简洁
配置文件
映射器
测试方法
控制台输出
测试方法
控制台输出
总结:关联时注意标签<association>的使用,存在集合时注意标签<collection>的使用
我们在进行查询操作时,希望根据返回值类型,返回对应的实体类,那么我们就可以借助鉴别器来实现
主要依据标签<discriminator>实现
映射文件
映射器
测试方法
控制台输出
1)什么是动态sql?
sql语句的主体结构在编译阶段还没有确定只有等到运行时才确定的sql语句就称之为动态sql,而在编译阶段就已经确定主体结构的sql语句称之为静态sql.举个例子说明一下:
静态sql:
String sql = select * from demo_user where id=1(静态sql)
String sql = select * from demo_user where id=? and name=?(静态sql,虽然没有传参数,但这条语句的主体结构已经确定,参数只是在运行的时候传入)
动态sql:
回想一下我们平常经常要做的查询操作,是不是经常有这样的情况,就是当没有传入查询条件的时候,我们希望查所有,而传入了查询条件时,我们则希望返回按查询条件的到的结果,现在我们用sql来表示一下的这两种情况
没有传入查询条件时:select * from demo_user
传入一个查询条件时:select * from demo_user where id=?
传入多个查询条件时:select * from demo_user where id=? name=?
也就是说在编译阶段,系统并无法确定这条sql到底是什么样的,只有在运行的时候根据用户传参情况才能确定,那么我们称这样的sql为动态sql,而系统在编译阶段无法确定sql是什么样的叫坐sql语句的主题结构不确定
2)支持mybatis动态sql的核心标签
if:根据条件查询时,用来判断参数,添加适当的条件
where:配合if标签使用,可以动态添加相关条件
set:用于更新一条数据时使用,也要配合if
choose:相当于java里面的case,满足一个条件即可
trim:格式化标记,可以完成set或者是where标记的功能
sql片段:sql+include,当需要复用的sql片段可以直接写在<sql>标签内,在语句上引用sql片段用<include>标签
foreach:用的不多,个人感觉意义不大,不想写demo,有兴趣自己去百度
映射文件
映射器接口
测试代码省略
以上基本上就是mybatis在实际开发中最常用到的技术了,如有不正确的地方,欢迎指正批评