版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaWeb开发从入门到实践JavaWebDevelopmentFromIntroductiontoPracticeMyBatis框架Chap13提纲MyBatis框架本章介绍MyBatis的基本操作与XML映射配置文件的使用,讲解了分页查询实现和跨域访问数据的处理方法,帮助开发者高效地进行数据访问与管理。13.1MyBatis基本操作13.2XML映射配置文件13.3分页查询13.4跨域访问数据13.5本章小结13.1MyBatis基本操作13.1.1MyBatis概念13.1.2MyBatis基础操作13.1.1MyBatis概念MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,它内部封装了JDBC,使开发者只需要关注SQL本身,而不需要花费精力去处理诸如注册驱动、创建Connection对象等JDBC的繁琐过程。MyBatis的主要特点如下。(1)SQL映射:MyBatis直接使用SQL,可以将接口与SQL语句绑定,运行时动态地生成SQL语句。(2)简化JDBC使用:减少编写重复的JDBC代码,使代码更加简洁。(3)无侵入性:MyBatis完全依赖于接口,不会影响原始的代码结构。(4)灵活性:MyBatis的SQL直接写在XML或注解中,可以随时修改SQL语句,不影响原始Java代码。(5)动态SQL:支持动态SQL,可以根据不同的条件生成不同的SQL语句。(6)与Spring集成:MyBatis可以与Spring框架无缝集成,简化了配置过程。13.1.2MyBatis基础操作案例:MyBatis基础操作1、创建一个SpringBoot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok和web)。2、perties中引入数据库连接信息,启动MyBatis的日志功能,并指定输出到控制台。spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatisspring.datasource.username=root
spring.datasource.password=123456
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl3、创建数据库表emp和对应的实体类Emp13.1.2MyBatis基础操作createtableemp(
idintunsignedprimarykeyauto_incrementcomment'ID',
usernamevarchar(20)notnulluniquecomment'用户名',
passwordvarchar(32)default'123456'comment'密码',
namevarchar(10)notnullcomment'姓名',
gendertinyintunsignednotnullcomment'性别,说明:1男,0女',
imagevarchar(300)comment'图像',
jobtinyintunsignedcomment'职位:1专任教师,2辅导员,3其它,
entrydatedatecomment'入职时间',
dept_idintunsignedcomment'部门ID',
create_timedatetimenotnullcomment'创建时间',
update_timedatetimenotnullcomment'修改时间')comment'员工表';13.1.2MyBatis基础操作@Data@AllArgsConstructor@NoArgsConstructorpublicclassEmp{ privateIntegerid; privateStringusername; privateStringpassword; privateStringname; privateShortgender; privateStringimage; privateshortjob; privateLocalDateentrydate; privateIntegerdeptId; privateLocalDateTimecreateTime; privateLocalDateTimeupdateTime;}13.1.2MyBatis基础操作4、准备Mapper接口EmpMapperMyBatis支持参数占位符,MyBatis对于字符参数和非字符参数提供了两种不同的参数占位符,字符类型的参数使用${},而非字符类型的参数使用#{}。(1)#{}
执行SQL时,会将#{}替换为?,生成预编译SQL,会自动设置参数值,适用于参数传递。(2)${}
拼接SQL。namelikeconcat('%',#{name},'%')13.1.2MyBatis基础操作增加、删除操作@Mapper
publicinterfaceEmpMapper{
@Options(keyProperty="id",useGeneratedKeys=true)
@Insert("INSERTINTOemp(username,password,name,gender,image,job,entrydate,dept_id,create_time,update_time)VALUES(#{username},#{password},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
publicvoidinsert(Empemp);
@Delete("deletefromempwhereid=#{id}")
publicvoiddelete(Integerid);
13.1.2MyBatis基础操作修改、查询操作@Update("updateempsetusername=#{username},password=#{password},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},create_time=#{createTime},update_time=#{updateTime}"+"whereid=#{id}")
publicvoidupdate(Empemp);
@Select("select*fromempwhereid=#{id}")
publicEmpgetById(Integerid);
@Select("select*fromempwherenamelikeconcat('%',#{name},'%')andgender=#{gender}andentrydatebetween#{begin}and#{end}")
publicList<Emp>list(Stringname,Shortgender,LocalDatebegin,LocalDateend);
}13.1.2MyBatis基础操作5、数据封装实体类属性名和数据库字段名一致,MyBatis会自动封装,如果实体类属性名和数据库字段名不一致,不能自动封装,这种情况进行封装有以下三种方式。(1)起别名。在SQL语句中,对不一样的列名起别名,保持别名和实体类属性名一致。@Select("selectid,username,password,name,gender,image,job,entrydate,dept_iddeptId,create_timecreateTime,update_timeupdateTimefromempwhereid=#{id}")
publicEmpgetById(Integerid);(2)手动设置结果映射。通过@Results及@Result手动设置结果映射。@Select("select*fromempwhereid=#{id}")@Results({@Result(column="dept_id",property="deptId"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})publicEmpgetById(Integerid);13.1.2MyBatis基础操作(3)开启驼峰命名。如果字段名与属性名符合驼峰命名规则,MyBatis会自动通过驼峰命名规则映射,在perties中进行设置mybatis.configuration.map-underscore-to-camel-case=true13.2XML映射配置文件13.2.1XML映射文件13.2.2MyBatis动态SQL13.2.1XML映射文件使用XML映射文件需要遵守以下规范。(1)XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下。(2)XML映射文件的namespace属性与Mapper接口全限定名一致。(3)XML映射文件中SQL语句的id与Mapper接口中的方法名一致,并保持返回类型一致。13.1.2MyBatis基础操作案例:使用XML映射配置文件操作数据库图
13-1
工程目录结构13.1.2MyBatis基础操作(1)创建文件EmpMapper.java@Mapper
publicinterfaceEmpMapper{
publicvoidinsert(Empemp);
publicvoiddelete(Integerid);
publicvoidupdate(Empemp);
publicEmpgetById(Integerid);
publicList<Emp>list(Stringname,Shortgender,LocalDatebegin,LocalDateend);
}(2)创建EmpMapper.xml文件<mappernamespace="com.swxy.mapper.EmpMapper">
<insertid="insert"keyProperty="id"useGeneratedKeys="true">
INSERTINTOemp(username,password,name,gender,image,job,entrydate,dept_id,
create_time,update_time)VALUES(#{username},#{password},#{name},#{gender}, #{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})
</insert>13.1.2MyBatis基础操作
<deleteid="delete">deletefromempwhereid=#{id}</delete>
<updateid="update">updateempsetusername=#{username},password=#{password},name=#{name},
gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},create_time=#{createTime},update_time=#{updateTime}
whereid=#{id}
</update>
<selectid="getById"resultType="com.swxy.pojo.Emp">select*fromempwhereid=#{id}
</select>
<selectid="list"resultType="com.swxy.pojo.Emp">
select*fromempwherenamelikeconcat('%',#{name},'%')andgender=#{gender}andentrydatebetween#{begin}and#{end}
</select>
</mapper>13.1.2MyBatis基础操作(3)编写测试类@Slf4j@SpringBootTestclassSpringbootMybatisCrudApplicationTests{ @Autowired privateEmpMapperempMapper; @Test voidtestInsert(){ Empemp=newEmp(0,"oky","123456","蒋亚平",(short)1,"1.png",(short)4,LocalDate.of(2021,3,5),2,LocalDateTime.now(),LocalDateTime.now()); ("增加员工"); empMapper.insert(emp); } @Test voidtestDelet(){ ("删除编号为{}的员工",18); empMapper.delete(18); }
13.1.2MyBatis基础操作 @Test voidtestUpdate(){ Empemp=newEmp(19,"chalyabc","123456789","Charles",(short)1,"1.png",(short)4,LocalDate.of(2021,3,5),2,LocalDateTime.now(),LocalDateTime.now()); ("修改员工"); empMapper.update(emp); } @Test voidtestGetById(){ Empemp=empMapper.getById(1); System.out.println(emp); } @Test voidtestList(){ List<Emp>empList=empMapper.list("蒋",(short)1,LocalDate.of(1990,5,6),LocalDate.of(2024,5,9)); System.out.println(empList); }}13.2.2MyBatis动态SQL随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。常用的动态SQL:if、where和set元素
<updateid="update">
updateemp
<set>
<iftest="username!=null">username=#{username},</if>
<iftest="password!=null">password=#{password},</if></set><where> <iftest="name!=null">
name=#{name}
</if><where></update>13.2.2MyBatis动态SQLforeachforeach标签可以用来遍历数组、列表和Map等集合参数,实现批量操作或一些简单SQL操作,foreach元素属性及作用如下。Collection:集合名称item:集合遍历出来的元素或者项separator:每一次遍历使用的分隔符open:遍历开始前拼接的片段close:遍历结束后拼接的片段案例:根据员工编号批量删除员工数据<deleteid="deleteByIds">
deletefromempwhereidin
<foreachcollection="ids"item="id"separator=","open="("close=")">
#{id}
</foreach>
</delete>13.2.2MyBatis动态SQLsql和include元素sql元素用来定义可重用的SQL片段。include元素通过属性refid指定包含的sql片段。案例:根据员工编号查询员工信息<sqlid="commonSelect"> selectid,username,password,name,gender,image,job,entrydate,dept_id,create_time,update_timefromemp</sql><selectid="getById"resultType="com.swxy.pojo.Emp"><includerefid="commonSelect"/>whereid=#{id}</select>13.3分页查询13.3.1传统方法13.3.2分页插件PageHelper13.3.1传统方法客户端通过传递页码、每页显示记录条数,数据库通过分页函数进行分页,例如,MySQL使用limit函数,数据层需要编写获取总记录数和分页查询二个方法。(1)创建实体类PageBean@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassPageBean{
privateLongtotal;
privateListrows;
}(2)编写数据层EmpMapper文件@MapperpublicinterfaceEmpMapper{ @Select("selectcount(*)fromemp") publicLongcount(); @Select("select*fromemplimit#{start},#{pageSize}") publicList<Emp>page(Integerstart,IntegerpageSize);}13.3.1传统方法(3)编写业务层实现类@ServicepublicclassEmpServiceImplimplementsEmpService{ @Autowired privateEmpMapperempMapper; @Override publicPageBeanpage(Integerpage,IntegerpageSize){ Longcount=empMapper.count(); Integerstart=(1)*pageSize; List<Emp>empList=empMapper.page(start,pageSize); PageBeanpageBean=newPageBean(count,empList); returnpageBean; }}13.3.1传统方法(4)编写控制层@RestControllerpublicclassEmpController{ @Autowired privateEmpServiceempService; @GetMapping("/emps") publicResultpage(@RequestParam(defaultValue="1")Integerpage,@RequestParam(defaultValue="2")IntegerpageSize){ PageBeanpageBean=empService.page(page,pageSize); returnResult.success(pageBean); }}13.3.1传统方法(5)使用Postman进行测试图
13-2
分页测试13.3.2分页插件PageHelper使用分页插件PageHelper进行分页,需要添加分页插件的依赖,数据层只需查询所有记录,PageHelper插件会根据所有记录进行分页,使用起来比传统方法更简单。使用分页插件PageHelper实现分页的具体步骤:(1)添加PageHelper分页插件的依赖<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>(2)编写数据层@Mapper
publicinterfaceEmpMapper{
@Select("select*fromemp")
publicList<Emp>list();
//员工信息查询}13.3.2分页插件PageHelper(3)编写业务层实现类@ServicepublicclassEmpServiceImplimplementsEmpService{ @Autowired privateEmpMapperempMapper; @Override
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版成都事业单位劳动合同范本(含劳动合同签订及备案要求)3篇
- 2024年药理学研究员岗位协议3篇
- 2025版开发商与二手房买家房屋置换及装修服务合同3篇
- 建筑物给排水安全合同
- 野营基地建设合同进度跟踪
- 公共设施维护招标实施细则
- 2024年铁路客运特许经营合同3篇
- 物流信贷证明业务
- 保定市河道水利工程规划
- 婚礼场地租赁合同违约
- 2025蛇年元旦晚会
- 《高低压配电室施工工艺标准》
- 2024年太阳能光伏组件高空清洗作业人员安全保障合同3篇
- 大学学业规划讲座
- 【MOOC】中国近现代史纲要-武汉理工大学 中国大学慕课MOOC答案
- 综合管廊知识
- 新教科版小学1-6年级科学需做实验目录
- 2024过敏性休克抢救指南(2024)课件干货分享
- 【发动机曲轴数控加工工艺过程卡片的设计7800字(论文)】
- 2024年贵州贵阳市贵安新区产业发展控股集团有限公司招聘笔试参考题库含答案解析
- 汕头市中小学教学研究中心招聘专职教研员考试试题及答案
评论
0/150
提交评论