Mybatis

发展史 最早叫iBatis(internet abatis) 2001年 Clinton Begin发起一个开源项目 iBatis1.0 2005年 iBatis2.0 2010年 iBatis3.0 iBatis在这之前都是Apache组织管理 2010.6 交给谷歌公司管理 Mybatis 2013.11 整个项目迁移至github 2019.10 MyBatis3.5.3 层面(作用) 是一个持久层框架(DAO与数据库交互) 半自动ORM框架 Object Ralational Mapping 表 <-> 半自动指需要写sql语句 基本应用 写好的代码交给用户 .jar 在项目中配置一个文件 dbconfig.properties driver url user password 获取jar包中的对象 SqlSession 执行数据库操作 insert update delete selectOne selectList 调用如上方法 提供sql 提供sql上的问号信息 如果是查询 提供返回对象类型 使用步骤: 1.导包 百度搜索 MyBatis官网 点链接进入github下载 MyBatis3.5.3 2.参读一下mybatis-3.5.3.pdf 手册 基本配置 JDBC 导包,加载驱动类 创建连接 创建状态参数(相当于一个流,可读/可写) 执行操作 增删改 int = excuteUpdate DML(写,更新) 查询 Result = excuteQuery DQL(读,数据库内容不变,要结果) 关闭所有对象 缺点 1.连接用完一次就销毁 2.DAO层中的好多JDBC流程都一样(冗余,只有sql差异) SqlSession类 帮我们执行所有一样的流程 insert update delete 只需要提供sql和sql上的问号信息 配置 1.导包 2.核心配置文件 configuration.xml(存储数据库关联信息) 3.给我们提供了SqlSession对象 去做事 4.传递一些信息 sql 问号 是查询还需要告诉结果类型 使用 导包 mybatis3.5.3.jar jdbc-mysql-driver.jar 放入lib 配置文件 configuration.xml 工程下 dtd规则 settings //全局设置 setting name= value= lazyLoadingEnabled //懒加载,默认false agreesiveLazyLoading //侵略性加载 environments environment transmanager //连接数据库种类 dataSource //连接参数 mappers mapper resource = “xxxmapper.xml” XXXmapper.xml namespace = “” 一般跟dao一样 resultMap id = xxxx type = id property = column = //主键列 result property = column = //非主键列 result result association property = “idcard” javaType = “domain.IDCard” select = "selectIDCcarForPerson" column = "cardID" //对象 select id = "selectIDCcarForPerson" select id = selectOne.. resultMap = xxxx sql传参数 ${} 纯字符串 #{} 字符串和参数/变量 联表查询 一对一 一个公共属性是对象 配置额外sql//执行两次,存在n+1问题 联合语句查询 resultMap id = xxxx type = id property = column = //主键列 result property = column = //非主键列 association property = “idcard” javaType = “domain.IDCard” id property = "cardID" column = "cardID" Result property = "address" column = "address" 因为一条语句全出来,也没什么懒加载一说 性能会高点 一对多 与1对1基本一致,多端对象的一端实例是List collection property = "xxxList" javaType = "list" oftype = "domain.xxx" select = "" column = "" left out join 多对多 两边都是集合,中间表没有体现在domain inner join 常用标签 标签有先后顺序问题,错了会报错 xml由配置文件引入(便于框架更新/切换/并行/适配) (配置文件的数据驱动,从和数据库中获取) *typeAliases typeAlias type = alias = 为xml配置文件中的value起别名 一般是全部字母小写 *settings 设置一些属性信息如懒加载等 plugins 插件 typeHandler 返回值控制器 environments default="" environment transactionManager type = "JDBC" JDBC 用JDBC管理提交 回滚功能 type也可以用managed 配置上 什么都不做 让容器帮忙做 dataSource type = "POOLDE" type UNPOOLED 每次都需要简单的创建连接,再关闭 需要设置几个链接数据库的属性 property driver url username password defaultTransactionIsoilationLevel 隔离级别 Serializable 避免所有读取问题,性能慢 Repeatable-Read 避免脏读,不可重复读 Read-Committed 避免脏读 Read-UnCommitted无法避免 POOLED 实现连接缓存,连接复用 poolMaximumActioveConnection Mybatis默认10 poolTimeToWait 默认20秒 JNDI 这个数据源的配置 是为了准备与外部应用一起使用 Java Naming and Directory Interface Java命名和目录接口 C3P0 性能比较差 早些年 DBCP Apache组织的开源 Druid 阿里开源项目 fast json dubbo 看监控sql的执行 XXXMapper.xml 根标记 子标记 insert id parameterType 类型 基本类型 map 对象 update delete select property name = "driver" value = "oracle.jdbc.OracleDriver" url "jdbc:oracle:thin:@localhost:1521:orcl" 动态SQL 根据参数、条件不同,让sql变化 原生 判断参数是否为空 拼串 框架 ps: linkedHashMap 有序集合 1.参数包装成map集合 (service中) 2.xml语句标签中 用 if switch trim for each等语法标签进行操作拼串 and deptno = #{deptno} order by sal ${orderFlag} asc //when.. // // asc // update cmp set job = 'xxx' where empno in #{empno} 基于Mapper的执行 模式1 1.dao是类 2.Dao层有方法 --> Mapper文件 3.调用sqlsession执行 模式2 基于Mapper执行 1.dao是接口 2.Sevice调用sqlsession做事 private StudentDao dao = MyUtil.getSqlSession(true). getMapper(StudentDao.class); /* 只要mapper namespace 与dao类名一致 标签的id与dao方法一致 什么都不用改 */ 模式3 DAO+注解 动态代理 静态代理 代理对象 动态代理 代理方法 底层 new一个代理对象,代理对象实现接口,根据方法名找到sql 根据sql标签确定需要调的方法 然后代替dao调用sqlsession 注解开发 为了弥补XML文件的不好方式 1.写在方法上面(sql+dao方法 绑定在一起 开发者写起来方便) 2.注解通常就一行(比XML简单 一对多 一对一 多对多也不是很简单) 注意 注解本身是我们调用不到的--底层需要通过反射来解析 如果想要使用注解方式执行--必须依托于Mapper代理 在configuration.xml中告知扫描注解 基于xml 基于注解 UPDate #{param1},#{param2} ....按顺序 update(@Param("sid")Integer sid,...) 对应关系 1.namespace -- 类名 2.id -- 方法名 3.
posted @ 2022-04-30 17:12  画饼躺平学习冲  阅读(45)  评论(0)    收藏  举报