MyBatis部分基础知识
MyBatis:
MyBatis 简介: MyBatis实际上是IBatis3.0版本以后的持久化层框架【也就是和数据库打交道的框架】,IBatis2.0之前统称为IBatis、IBatis3.0之后 统称为:MyBatis MyBatis框架和原生JDBC、JDBCTemplate相比的优势: 1.MyBatis是一个框架,包含缓存、逆向工程等 2.包含动态sql 3.java代码【处理业务逻辑】和sql语句【数据交互】分离开来 java---->编译 sql---->编译 4.直接将数据库中表之间的关系映射为java类对象之间的关系 5.MyBatis是一个半自动化的ORM【Object Relationship Mapping】的框架 MyBatis工作原理: 1.配置MyBatis的环境变量:mybatisConfig.xml(全局配置文件),配置了mybatis的运行环境信息mapper.xml文件即sql映射文件 2.创建接口类及对应的映射文件 3.创建SqlSessionFactory 4.根据SqlSessionFactory创建会话SqlSession 5.通过mapper.xml映射文件,对应接口中相应的方法,并将参数映射到sql中 6.通过mapper.xml将sql执行的结果返回 #{}和${}的区别: #{}:相当于sql语句中的占位符,不会出现sql注入的问题,相当于javaweb中的preparestatement预编译 ${}:会把参数直接拼入sql语句中,会出现sql注入的问题,相当于javaweb中的statement, 但对于不支持预编译的获取表名、排序字段、模糊查询的使用这个 创建Mapper接口,修改Mapper.xml文件 1.如何绑定: 以前的sql配置文件的namespace可以随便写,现在不能随便写,需要指定为接口的全限类名,然后此时接口和sql配置文件做了绑定, 然后还要将select标签的id和方法名进行绑定 2.总结: 1.接口式编程: 原生:dao ------> DaoImpl MyBatis:xxMapper ------> xxMapper.xml 2.SqlSession代表和数据库的一次会话,用完必须关闭 3.SqlSession和Connection一样,都是非线程安全的,每次使用都是去获取新的连接对象,不要将这对象定义在类变量中使用 4.mapper借口没有实现类,但是MyBatis这个接口生成一个代理对象 5.两个重要的配置文件: MyBatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息 sql映射文件:保存了每一个sql语句的映射信息 MyBatis全局配置文件: MyBatis的配置文件包含了影响MyBatis行为甚深的设置(setting)和属性(properties)信息。文档的顶层结构如下: configuration配置 properties属性:可以加载properties配置文件的信息 可以使用properties来引入外部properties配置文件的内容 resources:引入类路径下的资源 url:引入网路路径或者磁盘路径下的资源文件 setting设置:可以设置MyBatis的全局属性 包含很多重要的设置项: setting:用来设置每一个设置 name:设置项名 value:设置项取值 如:驼峰式命名 .mapUnderscopeToCameICase:自动完成数据表标准列名和持久化类标准属性名之间的映射 typeAliases:类型命名 作用: A type alias is simply a shorter name for a Java type typeAliases:别名处理器,可以为我们的java类型起别名,别名不区分大小写 typeAlias:为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写 alias:执行新的别名 package:为某个包下的所有类批量起别名 name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名[类名小写]) 不建议使用别名,建议使用全类名,看sql语句是怎么被封装为java对象是较为简单 typeHandlers:类型处理器 负责如何将数据库的类型和java对象类型之间转换的工具类 如:将数据库中的varchar类型和java类对象的String数据类型转换 plugins插件 environments环境变量 用于配置MyBatis的开发环境,MyBatis可以配置多种环境,default指定使用某种环境。可以达到快速切换环境 environment:配置一个具体的环境信息,必须有两个标签,id代表环境的唯一表示 transactionManager事务管理器 type:事物管理器的类型,type="[JDBC|MANAGED]",这两个都是别名 在Configuration类中的可以查看具体类!但是Spring对事务的控制才是最终的管理方案! JDBC:这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务 MANAGED:这个配置几乎没做什么,他从来不提交和回滚一个连接,而是让容器来管理事务的整个生命周期 综上:如果要配置事务管理器,就配置为JDBC。表示使用本地的JDBC事务。 当然也可以自定义事务管理器:只需要和人家一样实现TransationFactory接口 type:指定为全类名 dataSource数据源 type:type="[UNPOOLED|POOLED|JNDI]" unpooled:无数据库连接池 pooled:有数据库连接池 JNDI: 自定义数据源:实现DataSourceFactory接口,type也是全类名 引申:如何自定义第三方数据源,参考Configuration中的POOLED类实现 需要自定义一个类继承UnpooledDataSourceFactory类,然后在构造器中初始化该对应的dataSource属性 databaseIdProvider数据库厂商标识 MyBatis is able to execute different statements depending on your database vendor MyBatis可以根据不同的数据库厂商执行不同的语句 这样在执行不同数据库的时候、就会执行不同数据库的语句了!优点:在service层值需要调用一个 mybatis的方法,而不需要关注底层选择使用的数据库 mappers映射器 Mappers:将sql映射注册到全局配置文件中 mapper:注册一个sql映射 注册配置文件: resources:引用类路径下的sql映射文件 mybatis/mapper/EmployeeMapper.xml url:引用网路路径或者磁盘路径下的sql映射文件 url="file://var/mappers/AuthorMapper.xml" 注册接口: class:引用(注册)接口 1.有sql映射文件,映射文件名必须和接口同名,并且与接口放在同一个目录下 2.没有sql映射文件,所有的sql都是利用注解写在接口上 推荐: 比较重要的,复杂的Dao接口我们来写sql映射文件 不重要,简单的Dao接口为了开发快速可以使用注解 最后是全局配置文件中标签实际上是有顺序的! MyBatis的接口方法参数 参数类型为一个参数 参数类型为两个参数或者多个参数 参数类型为Map 参数类型为POJO 参数类型为Collection和List,不能为set MyBatis查看发送的sql语句: 1.需要导入log4j的jar包或者maven依赖 2.需要在类路径下加入log4j.xml文件 MyBatis各种返回值类型: 返回值类型为:Integer/Long/Boolean 返回值类型为POJO 返回值类型为List列表 返回值类型为Map 一条记录 多条记录 返回为一个ResultMap:自定义结果集映射规则 MyBatis的关联关系: 一对一,多对一,一对多,多对多 对一关联关系[三种解决方案]: 1.resultMap的result标签连缀的方式 2.使用association标签,一步到位 3.使用association标签,分步查询 对于第三种存在懒加载机制[按需加载,也叫懒加载]: 对多关联关系[两种解决方案]: 2.使用association标签,一步到位 2.使用association标签,分步查询 动态sql: if:字符判断 choose(when otherwise):分支选择 trim(where,set):字符串截取,其中where标签封装查询条件,set标签封装修改条件 foreach MyBatis缓存机制: 缓存是为了加快查询效率 一级缓存:sqlSession级别的缓存,默认是开启的,无法关闭 myBatis一级缓存:sqlSession级别的缓存,自动开启 一级缓存的四种情况: 1.sqlSession对象不同 2.sqlSession对象相同,但是查询条件不同 3.sqlSession对象、查询条件相同,但是在两次查询之间,对数据表进行了增删改查操作 4.sqlSession对象、查询条件相同,但是在两次查询之间,手动清空 二级缓存:Mapper接口级别[namesoace],默认是关闭的,需要手动开启 1.在MaBatis的全局配置文件中开启二级缓存 2.在对应的sql用社文件中加入<cache>标签 3.必须是在一级缓存关闭的情况下,二级缓存才能使用 4.放入到二级缓存中的对象所在的类必须是实现了序列化接口