Mybatis学习打卡
Mybatis学习笔记—第二天
Mybatis笔记 第二天
一.复习
1. Mybatis框架 :
基于java的框架 , 做数据持久化 , 替换jdbc技术完成dao
2. 环境搭建 :
- jar引入 2) 引入配置文件–src 3) 初始化配置mybatis-config.xml
3. 使用mybatis框架
- 准备 : table entity dao接口
- 定义映射文件为接口提供实现 mapper.xml
<mapper namespace=”实现接口的全类名”>
|-- <select id=”方法名” parameterType=”参数类型” resultType=”结果类型”>
关于parameterType : 方法没有参数 或者 参数个数多于1个 ,省略该属性
关于resultType: 单个对象写对象的全类名 , 返回值为集合则只需要指定集合
里元素的类型
关于sql命令: 取值#{ 注解为参数定义的名字 or 对象的属性名 or 下标 }
|-- <update id=”” parameterType=”实体类类型” >
|-- <delete id=”” parameterType=”” >
|-- <insert id=”” parameterType=”实体类型”>
|-- <selectKey resultType=”” keyProperty=”” order=”BEFORE”>
查询一个int值为参数对象的id属性赋值
|-- insert命令
- 注册映射文件 – 配置mybatis-config.xml
<mappers>
|-- <mapper resource=”映射文件路径 --- 从src开始写”/>
- 核心类
① SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 工具
② Reader reader = Resources.getResourceAsReader(“mybatis-config.xml”);
③ builder.build(reader) —> SqlSessionFactory对象
④ SqlSession session = factory.openSession();
⑤ session.getMapper( 接口的类对象) --> 接口的对象
4.工具类
二.映射文件的特殊写法 — 主要查询
1. 多参查询 – 省略parameterType 重点
注意:方法的形参名不能长时间保留,在编译过程中丢失,不能在映射文件中使用
解决:
1) 通过参数的下标来指定获取哪一个参数的值
2) 通过注解为参数定义可以长久保留的名字( 至少出现在字节码文件里 )
2. 关于特殊符号的处理 — < >
1) 使用特殊的文字来代替符号 < -- < > -- >
2) 使用脚本标签来定义 --- 强烈建议
注意: 大多数脚本语言都用该标签解决代码中的特殊符号
3. 模糊查询 like
1) 可以在映射文件里的sql命令上使用 || 拼接通配符
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200108211005220.png)
-
可以在dao方法被调用时, 在实参位置拼接
4. 属性名和列名不一致 ( 尽量避免 )
-
mybatis封装查询结果时(实体对象) , 会使用”查询结果里的字段名” 去为 实体的”
同名属性” 赋值 , 如果没有同名属性则该值赋值失败 -
当实体类属性名与结果字段名不一致时 , 解决: 可以在查询过程中为字段定义”别
名” , 要求别名要与实体类的属性名一致
-
5. 关于insert和update过程中的null的处理
当插入过程中出现null值时 , 需要使用jdbcType来指定null所代表的类型
三.配置文件的小技巧 — mybatis-config.xml
1. 关于实体类全类名的简化问题
- mybatis允许在配置文件里为实体类entity统一定义”简称”或者”别名” , 可以在映射
文件中使用简称
2)使用标签
3) 注意: 接口名不能简化
4) mybatis开发步骤:
① 准备 ②为实体类定义别名 ③映射文件 ④注册映射文件
2. 关于数据库连接数据的定义
将数据库的连接信息单独定义在一个配置文件里, 在mybatis配置文件中引入并使用
3. 总结补充 — 各种取值
- EL里的取值 ---- ${ xxxScope.name }
- mybatis映射文件中获取参数的值 — #{ xxx } —PreparedStatement
- mybatis映射文件中还可以使用 ${xxxx} — Statement
- mybatis的配置文件中获取”其他配置文件信息” — ${ xxx }
- struts2的dmi技术中 {1} – 获取第一个通配符所在位置的值
- struts2配置文件中可以通过 ${action的实例变量名} – 获取action的实例变量的值
- <s:url value=”%{ognl}” >
四.关联关系数据的处理 [重点]
- 两个相对独立的数据之间的联系 — 关联关系
- 分类
- 一对一 : 学生student ~ 电脑computer
- 一对多( 多对一 ) : 普遍关系[重点] , 学生student ~ 小组team
- 多对多 : studnet ~ course , product ~ order
五.多对一关系 student --> team
-
在db里将数据描述清楚( 存放在哪一张表里 , 体现表里记录间的关系 )
-
在java程序里通过实体类将数据描述清楚( 数据怎么存 , 体现关系 )
-
定义dao接口 — 两个dao接口 – 多对一( studnet里有关系属性 , team里没有 )
1)TeamDao( 基础5个方法 ) – 与原来的单表操作一致
2)StudentDao( 基础5个方法) – 拥有关系属性的实体类对应的dao
① 增删改 – 与原来单表操作一致
② 查询特殊 – 需要查询完整的"学生对象"(学生基本信息,以及所在team的信息)
所有数据来自于两张表( 需要表连接查询 – 左外连接 )
Select s.id sid , s.name sname , s.age , t.id tid , t.name tname , t.count
From student s left join team t on s.tid = t.id where s.id = #{id}![在这里插入图片描述](https://img-blog.csdnimg.cn/20200108210527812.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgyOTQwNw==,size_16,color_FFFFFF,t_70)
六.一对多 team --> student
- 在db里描述清楚
- 在java的实体类之间描述关系
- 定义dao接口 — 两个dao
- 没有关系属性的实体类对应的dao ( StudentDao ) — 单表操作
- 有关系属性的实体类对应的dao ( TeamDao )
① 增删改 — 单表操作
② 查询 – 查询完整的team对象( id name count 和 list )
七.Struts2和mybatis整合
- 搭建环境 — web project
- 引入jar包 — struts的jar包 mybatis的jar包
- 引入配置文件 — struts.xml mybatis-config.xml — src
- 初始配置 — struts配置核心过滤器(web.xml)
mybatis配置启动环境(mybatis-config.xml) - 设置项目编码
- 定义sql文件 ( 建表 )
- 定义实体类 ( 描述关系 )
- 可选 : 定义实体类的别名 Alias
- 定义dao接口
- 写映射文件
- 注册映射文件
- 定义service层程序 (与原来的写法基本一致)
Public .... Xxxx( ..... ){
Try{
Dao dao = (Dao)MybatisUtil.getMapper(Dao.class);
Xxxxxxxx
MybatisUtil.commit();
}catch(Exception e){
MybatisUtil.rollback();
Throw new RuntimeException(e.getMessage());
}
}
- Action —> 收参 , 调用service层方法 , 返回String跳转
- Jsp展示数据 —> struts标签
<option value=”did”> dname </option>