Mybatis框架的一点个人心得

Mybatis框架的一点个人心得

2023年6月23日发(作者:)

Mybatis框架的⼀点个⼈⼼得MyBatismybatis 框架是现在⽐较流⾏的⼀个持久层框架,以下是我⾃⼰写的⼀些总结,主要讲的时它的使⽤⽅式,详细资料请访问他们的。概述mybatis 是⼀个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本⾝,⽽不需要花费精⼒去处理加载驱动、创建连接、创建

statement 等繁杂的过程。mybatis 通过 xml 或注解的⽅式将要执⾏的各种

statement 配置起来,并通过 java 对象和

statement 中sql 的动态参数进⾏映射⽣成最终执⾏的 sql 语句,最后由 mybatis 框架执⾏ sql 并将结果映射为 java 对象并返回。采⽤ ORM 思想解决了实体和数据库映射的问题,对 jdbc 进⾏了封装,屏蔽了 jdbc api 底层访问细节,使我们不⽤与 jdbc api 打交道,就可以完成对数据库的持久化操作。ORM: Object Relational Mappging 对象关系映射 简单的说:就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。开发⽅式它的使⽤⽅法分为两种⼀种是 xml 配置⽂件,另⼀种是直接使⽤注解。这两种⽅式各有优势,其中 xml 配置⽂件的优势在于思路清晰,维护⽅便,在需要修改项⽬时,不需要重新编译,只需要修改配置⽂件即可;⽽注解开发,因为不需要去配置⽂件,所以它的开发速度更快,也是因为这点,近⼏年来也更流⾏使⽤注解开发。主配置⽂件的编写,通常命名为⾸先是主配置⽂件编写,以及需要注意的地⽅。在配置完之后,就可以选择两种不同开发⽅式了。 在使⽤

properties 标签配置时,我们可以配置⽂件来指定属性配置。这样,下⾯的数据库信息就可以引⽤配置⽂件,⽅便以后修改。在使⽤

typeAliases 标签,我们可以也可以采⽤⾃定义别名的⽅式来开发,别名不区分⼤⼩写。mappers 标签有两种⼦标签mapper标签⾥⾯有两个常⽤属性(注意:资源路径之间⽤/分隔,包路径⽤.分隔。)mapper 标签⾥的的

resource 属性使⽤相对于类路径的资源,使⽤ xml 开发时才使⽤。mapper 标签⾥的的

class 属性使⽤

mapper 接⼝类路径,使⽤注解开发时才使⽤。(注意:此种⽅法要求

mapper 接⼝名称和

mapper 映射⽂件名称相同,且放在同⼀个⽬录中。)package 标签⾥的

name 属性指定包下的所有

mapper 接⼝,两种开发⽅式均可使⽤,也更为常⽤,它可以⽤来替代

mapper标签。(注意:此种⽅法要求

mapper 接⼝名称和

mapper 映射⽂件名称相同,且放在同⼀个⽬录中。)xml开发⽅式只是写了映射配置⽂件的编写以及其中需要注意的地⽅。映射配置⽂件的编写基本使⽤⽅法 在使⽤

mapper 标签时,其中的

namespace 属性必须是 dao 类的全限定类名,因为 mabatis 框架是根据

namespace 属性和statemen 标签中的

id 属性来对数据库进⾏操作的,也就是根据l 反射来确定的。数据库中表的列名与我们实体类中的成员变量名不⼀致时,我们可以通过取别名的⽅式来对结果封装,或者是⽤

resultMap 标签来指定列名及其对应的变量名,当我们在对查询结果封装需要⽤到它时,就可以直接使⽤

resultMap 属性来引⽤它,如果不需要时,就可以直接使⽤

resultType 属性来直接指定所要封装的类。对数据库的四种增删改查操作分别对应

insert

delete

update

select四种标签根据条件查询时 查询的条件使⽤#{xxx}来作为占位符使⽤,当只有⼀个条件时,花括号⾥的内容可以随便写,当有多个条件时,花括号⾥的内容就必须与实体类中的变量名相同。使⽤模糊查询时的占位符有两种形式#{name}或'%${value}%',前者花括号内可以随便写,⽽后者必须写

value ,但是前者的 % 符号只能在 java 语句中去拼接,⽽后者就可以在配置⽂件中写好。动态sql语句where 标签是⽤来代替 sql 语句中的

where 或者

and 关键字的,它会根据实际情况判断。if 标签是⽤来判断是否需要⽤到这个条件时的。foreach 标签就是进⾏范围查询时使⽤,其中的

collection 属性对应实体类中的变量名,open 和

close 属性就是单纯的拼接,item 属性是指定每⼀个遍历的变量名,separator 属性是指定分隔符。标签体中的内容与就是每⼀次遍历的占位符,花括号⾥的内容与

item属性保持⼀致。多表查询在 mybatis 中只有⼀对⼀和⼀对多,它将多对多当成了多个⼀对多,⽽多对⼀就是多个⼀对⼀。⼀对⼀ 使⽤

association 标签来指定关联的对应表的单条数据,其中的

property 属性对应实体类中的变量名,column 属性对应关联的外键名称,javaType 指定要封装的实体类。在标签体中,必须先写从表的主键列。⼀对多 使⽤

collection 标签来指定关联的对应表的多条数据,其中其中的

property 属性对应实体类中的变量名,ofType 指定每⼀条数据所要封装的实体类。在标签体中,必须先写从表的主键列。延迟加载和⽴即加载延迟加载就是在需要⽤到数据时才进⾏加载,不需要⽤到数据时就不加载数据。延迟加载也称懒加载。在⼀对多时通常采⽤延迟加载,⽽在⼀对⼀时通常采⽤⽴即加载,因为这样能提⾼数据库性能。⾸先要在主配置⽂件中开启延迟加载 然后在映射⽂件中进⾏配置 上⾯分别是⼀对⼀和⼀对多的延迟加载配置,其实就是在

association 标签或者是

collection 标签中添加

select 属性来指定关联的表需要⽤到哪个⽅法来查询,即对应的类的dao接⼝的全限定名.⽅法名,以及

column 属性来指定关联的外键名称。可以省去我们在多表查询时编写复杂的 sql 语句。注解开发⽅式在使⽤注解开发时,不要有映射配置⽂件的存在,否则程序会以为你要使⽤ xml 配置⽂件开发。基本使⽤⽅法public interface IUserDao { @Select("select * from user") @Results(id="userMap",value={ @Result(id=true,column = "id",property = "userId"), @Result(column = "username",property = "userName"), @Result(column = "address",property = "userAddress"), @Result(column = "sex",property = "userSex"), @Result(column = "birthday",property = "userBirthday") }) List findAll(); @Select("select * from user where id=#{id} ") @ResultMap("userMap") User findById(Integer userId);}只需要在⽅法上添加注解,并且在注解中表明 sql 语句即可。对数据库的四种增删改查操作D分别对应

@Insert

@delete

@Update@Select四种注解。数据库中表的列名于我们实体类中的成员变量名不⼀致时,我们可以通过取别名的⽅式来对结果封装,或者是⽤

@Results 标签来指定列名及其对应的变量名。当其它的⽅法在对查询结果封装需要⽤到它时,就可以直接使⽤

@ResultMap 注解来引⽤它。根据条件查询时@Select("select * from user where id=#{id} ")@ResultMap("userMap")User findById(Integer userId);@Select("select * from user where username like #{username} ")@ResultMap("userMap")List findUserByName(String username);查询的条件使⽤#{xxx}来作为占位符使⽤,当只有⼀个条件时,花括号⾥的内容可以随便写,当有多个条件时,花括号⾥的内容就必须与实体类中的变量名相同。使⽤模糊查询时的占位符只有⼀种形式

#{name} ,花括号内可以随便写。动态 sql 语句查询使⽤注解进⾏动态 sql 语句查询时,需要⽤到上述 xml 开发⽅式⾥的动态 sql 语句查询的标签,并且将其置于标签中,将其当作脚本执⾏,使⽤起来极其不便,不推荐使⽤。多表查询@Select("select * from account")@Results(id="accountMap",value = { @Result(id=true,column = "id",property = "id"), @Result(column = "uid",property = "uid"), @Result(column = "money",property = "money"), @Result(property = "user",column = "uid", one=@Oneselect(select="Id", fetchType= ))})List findAll();在⼀对⼀查询时,使⽤

@Result注解来指定关联的对应表的单条数据,其中的

property 属性对应实体类中的变量名,column 属性对应关联的外键名称,然后在注解中使⽤@One 注解添加

select 属性来指定关联的表需要⽤到哪个⽅法来查询,即对应的类的dao接⼝的全限定名.⽅法名,以及

fetchType 属性来指定加载⽅式。 @Select("select * from user") @Results(id="userMap",value={ @Result(id=true,column = "id",property = "userId"), @Result(column = "username",property = "userName"), @Result(column = "address",property = "userAddress"), @Result(column = "sex",property = "userSex"), @Result(column = "birthday",property = "userBirthday"), @Result(property = "accounts",column = "id", many = @Many(select = "countByUid", fetchType = )) }) List findAll();在⼀对多查询时,使⽤

@Result注解来指定关联的对应表的单条数据,其中的

property 属性对应实体类中的变量名,column 属性对应关联的外键名称,然后在注解中使⽤@Many 注解添加

select 属性来指定关联的表需要⽤到哪个⽅法来查询,即对应的类的dao接⼝的全限定名.⽅法名,以及

fetchType 属性来指定加载⽅式。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687517401a16347.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信