java学习与应用(5.1)–Mybatis

  • 2020 年 2 月 25 日
  • 筆記

mybatis框架

mybatis框架,java持久层框架,ORM(Object Relational Mapping对象关系映射)思想实现结果集封装。 三层架构(表现层展示数据,业务层实现业务需求,持久层和数据库交互[JDBC技术规范、Spring的Template和Apache的DBUtils工具类,都不属于框架]) maven的pom.xml下的packaging为打包方式,其他依赖代码可以通过官网复制。 创建实体类和dao接口,在resources包下的SqlMapConfig.xml中进行mybatis的主配置文件,配置环境,事务类型,配置映射文件类型等。然后建立,IUserDao.xml(IUserMapper)中写入映射配置文件,定义结果值封装类型,语句等,建立的路径和main.java.xxx.xxx.IUserDao.java对应。 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名,映射配置文件的操作配置(select) ,id属性的取值必须是dao接口的方法名。接口dao的实现类使用mybatis。 流程为:读取配置文件Resources.getResourceAsStream,创建SqlSessionFactory工厂,使用工厂生产SqlSession对象,使用SqlSession创建Dao的代理对象,使用代理对象执行方法,最后释放资源。见图 使用注解代替xml映射配置文件,在接口方法上使用@Select("sql语句")。

配置文件

自定义Mybatis略去,有需要再阅。 SqlMapConfig.xml等主配置文件中,environments的default中的默认环境,environment下配置id环境名,然后配置事务transactionManager,配置连接池DataSource的type,用户名,密码等。 IUserDao.java接口文件,用于在IUserDao.xml等下进行配置:mapper标签定义好对应的namespace确定Dao接口,select查询操作定义接口方法名,sql语句,返回值。(该文件在resource目录下,而对应的接口在java目录下) IUserDao.xml文件中,insert标签定义保存操作。测试代码注解@Test,@Before在Test前运行,@After在Test运行后执行。调用执行语句后,保存需要提交(commit)事务。 xml文件中,update标签定义更新操作,定义id是方法名,parameterType参数类型,sql语句。对应的delete标签用于删除操作,返回值封装类型为Integer或INT即可。sql语句中传入对应的占位符参数格式如:#{} 返回值类型关键字为resultType,用于定义查找sql语句在xml配置文件中的标签。模糊查询姓名中带有王字的方法:使用传入参数的username为%王%,sql中使用like关键字。 insert保存标签中定义selectKey标签和属性如执行语句的时机,返回值类型等,之间写入如select last_insert_id()方法,用于获取最后保存的id。 parameterType输入类型可以是简单类型,JavaBean(pojo对象),pojo对象使用OGNL表达式(Object Graphic Navigation Language 对象图导航语言),使用 . 调用类的数据,#{},${}中为对象中的属性,然后打点调用属性中的数据。 resultType结果类型为简单或pojo对象。查询过程中的实体类属性和SQL查询变量名不同时,需要sql中使用as起别名,便于能够封装数据。或在xml中配置resultMap标签下设定类名和属性名,其下的id标签,做出主键对应,result做出其他对应关系,设置property类值,column的sql变量。配置需要在select中的resultMap属性下设置id使得配置使用。

代码说明

使用xml文件,省略了dao的实现类,但是dao的实现类在mybatis中也支持,根据factory获取SqlSession对象后,使用session中的方法,传入标记,进行sql查询。 其执行的底层仍然是PreParedStatement的execute(执行CRUD语句,返回boolean),executeUpdate(执行CUD语句,返回行数),executeQuery(返回结果集,执行SELECT语句无法执行删改)等方法。 代码调试使用debug找到使用接口的实现类名,idea右键查看diagram查看视图,然后使用右键查看接口找到实现代码。mybatis使用xml代理dao使得用户不需要自己写dao实现类。 SqlMapConfig.xml主配置文件中,可以使用properties标签定义连接数据库的信息,设置resource引入外部的数据库连接信息文件,或使用url(统一资源定位符)的file协议导入,URI(统一资源标识符)。 使用typeAliases标签中,写入typeAlias标签,可以配置类名和指定类名的别名。之中也可使用package中,定义包名,和指定别名。

mybatis的连接池与事务控制,在主配置xml中的,指定的type类型为POOLED方式,使用传统DataSource规范中的连接池,从池中获取连接,空闲池中没有连接则选择最老的连接,重新创建新连接。 UNPOOLED实现了DataSource接口,创建新的连接,不使用连接池的数据源,JNDI使用JNDI实现的数据源。 mybatis中的底层有对应的事务操作,可以实现自动提交(factory.openSession传入true值),但是不是必要设置或降低效率。

动态sql标签和JNDI等

基于xml配置的动态sql语句在xml配置文件中使用,这样可以使得参数传递更灵活:<if>的test 属性定义了判断的条件,内容写入需要执行的部分,使用时需要写入如where 1=1避免错误。注意大小写。 <where>标签套入if标签,可以去掉where 1=1词语,使得更清晰。<foreach>用于替代in关键字的范围查询,设置collection,open,close,item,separator。 多表查询过程中,传统定义子类方案,然后进行数据封装到子类中。一般使用如在IAccountDao.xml配置文件中,写入resultMap标签下的id,type,写入原始对应关系后,从表使用association,设置其下的id和result的对应关系,然后设置到sql语句下的resultMap即可取出数据。 配置对象中的集合映射,使用collection标签,其中写入id和result标签,进行多表查询的数据封装。 JNDI(Java Naming and Directory,Java命名和目录接口),模仿Windows中的注册表(其中有键值对,存储路径+名称)?。 maven的war工程,配置好文件夹后,在webapp文件夹下建立META-INF文件夹,其下建立context.xml配置文件,写入名称,对象类型,驱动,卡密等。然后再主配置文件的environments下的environment下的DataSource中写入属性type为JNDI,添加property,定义名称和值。 然后可以使得jsp经过tomcat服务器获取正确的sql数据?

延迟加载、缓存、注解开发方式等

Mybatis的延迟加载,真正使用数据的时候发起查询,按需加载(一对多,多对多查询)在映射配置文件的xml中的assocation标签中,添加select属性查询用于唯一标识,column值。 然后设置settings标签下setting标签的lazyLoadingEnabled属性开启,aggressiveLazyLoading属性关闭等,见手册。立即加载则调用时马上发起查询(多对一,一对一查询)。

缓存适用于经常查询但是不经常改变的数据,不适用于数据改变影响过大的数据。在一个session中使用相同的sql语句查询,则第二次使用一级缓存而不再进行查询,如果数据修改,则清空一级缓存,重新查询。 一级缓存是同一个SqlSession中对象的缓存、二级缓存是SqlSessionFactory对象的缓存,二级缓存需要在主配置xml文件中的setting下设置CacheEnable为true,写入映射配置xml文件下cache标签。 二级缓存存放为数据而不是对象,当再次查询则进行数据填充。 Mybatis的注解开发替代了映射xml文件,不能在xml下同时开发(报错)。针对CRUD有@Select,@Insert,@Update,@Delete,在对应的接口对象函数前添加。 @Results注解传入@Result注解下的值,用于sql数据进行对象封装的对应别名,@Results定义id后,多次使用可以使用@ResultMap注解传入该id使用。 @Results注解下的Result注解设置property,column,one的注解,fetchType的加载类型等,用于多表查询(对一)。many的注解类型和fetchType等(对多查询),一般是延迟加载。 缓存的配置,在接口实现类的接口类上写入@CacheNamespace注解,添加blocking为true即开启了二级缓存。