96SEO 2026-02-20 08:35 0
框架相当于是一个脚手架内部已经写好了很多代码我们只要其基础上进行开发就可以提高我们的开发效率

!--mybatis依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.4/version/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency③编写核心配置
3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
iddevelopmenttransactionManager
valuecom.mysql.jdbc.Driver/property
valuejdbc:mysql://localhost:3306/test/property
valueroot//dataSource/environment/environmentsmappersmapper
resourcecom/sangeng/dao/UserDao.xml//mappers
}资源目录下com/sangeng/dao/UserDao.xml
3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.sangeng.dao.UserDaoselect
resultTypecom.sangeng.pojo.Userselect
获取SqlSession,通过SqlSession获取UserDao调用对应的方法
Resources.getResourceAsStream(resource);SqlSessionFactory
SqlSessionFactoryBuilder().build(inputStream);//获取Sqlsession对象SqlSession
sqlSessionFactory.openSession();//获取UserDao实现类对象UserDao
sqlSession.getMapper(UserDao.class);//调用方法测试ListUser
userDao.findAll();System.out.println(userList);//释放资源sqlSession.close();}3.9
我们可以使用#{}直接来取值写任意名字都可以获取到参数。
但是一般用方法的参数名来取。
resultTypecom.sangeng.pojo.User
resultTypecom.sangeng.pojo.Userselect
resultTypecom.sangeng.pojo.Userselect
HashMap();map.put(id,2);map.put(username,PDD);map.put(age,25);map.put(address,上海);userDao.findByMap(map);4.2
Mybatis会把多个参数放入一个Map集合中默认的key是argx和paramx这种格式。
param2PDD}我们虽然可以使用对应的默认key来获取值但是这种方式可读性不好。
我们一般在方法参数前使用Param来设置参数名。
resultTypecom.sangeng.pojo.Userselect
建议如果只有一个参数的时候不用做什么特殊处理。
如果是有多个参数的情况下一定要加上Param来设置参数名。
SqlSessionFactory是一个SqlSession的工厂类。
主要用来获取SqlSession对象。
、
//获取SqlSession对象传入的参数代表创建的SqlSession是否自动提交
values(null,#{username},#{age},#{address})/insert注意要记得提交事务。
resultTypecom.sangeng.pojo.Userselect
findAll();②映射文件UserDao.xml增加响应的标签
resultTypecom.sangeng.pojo.Userselect
可以使用properties读取properties配置文件。
使用其中的resource属性来设置配置文件的路径。
在resources目录下有jdbc.properties文件内容如下
jdbc.urljdbc:mysql://localhost:3306/mybatis_db
jdbc.drivercom.mysql.jdbc.Driver
jdbc.passwordroot在mybatis-config.xml中
3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!--设置配置文件所在的路径--properties
resourcejdbc.properties/propertiesenvironments
iddevelopmenttransactionManager
typePOOLED!--获取配置文件中配置的对应的值来设置连接相关参数--property
value${jdbc.password}//dataSource/environment/environments
valuetrue//settings具体的设置参考setting设置
可以用来设置给全类名设置别名简化书写。
一般设置一个包下的类全部具有默认别名。
默认别名是类目首字母小写。
例如com.sangeng.pojo.User别名为user
namecom.sangeng.dao/package/typeAliases7.4
defaultdevelopment!--设置该环境的唯一标识--environment
iddevelopmenttransactionManager
typePOOLED!--获取配置文件中配置的对应的值来设置连接相关参数--property
value${jdbc.password}//dataSource/environment/environments7.5
resourceorg/mybatis/builder/AuthorMapper.xml/mapper
resourceorg/mybatis/builder/BlogMapper.xml/mapper
resourceorg/mybatis/builder/PostMapper.xml/
urlfile:///var/mappers/AuthorMapper.xml/mapper
urlfile:///var/mappers/BlogMapper.xml/mapper
urlfile:///var/mappers/PostMapper.xml/
classorg.mybatis.builder.AuthorMapper/mapper
classorg.mybatis.builder.BlogMapper/mapper
classorg.mybatis.builder.PostMapper/
定义dao接口所在的包。
要求xml文件存放的路径和dao接口的包名要对应
在resources目录下创建log4j.properties文件内容如下
log4j.appender.stdoutorg.apache.log4j.ConsoleAppender
log4j.appender.stdout.TargetSystem.out
log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern%d{ABSOLUTE}
log4j.appender.fileorg.apache.log4j.FileAppender
log4j.appender.file.Filec:/mylog.log
log4j.appender.file.layoutorg.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern%d{ABSOLUTE}
dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency9.获取参数时
如果使用${}他是直接把参数值拿来进行拼接这样会有SQL注入的危险
使用注解来映射简单语句会使代码显得更加简洁但对于稍微复杂一点的语句Java
namecom.sangeng.dao/package/mappers②在接口对应方法上使用注解来配置需要执行的sql
values(null,#{username},#{age},#{address}))void
Resources.getResourceAsStream(resource);SqlSessionFactory
SqlSessionFactoryBuilder().build(inputStream);//获取Sqlsession对象SqlSession
sqlSessionFactory.openSession();//获取UserDao实现类对象UserDao
sqlSession.getMapper(UserDao.class);//调用方法测试ListUser
userDao.findAll();System.out.println(userList);//释放资源sqlSession.close();}2.动态SQL
在实际开发中的SQL语句没有之前的这么简单很多时候需要根据传入的参数情况动态的生成SQL语句。
Mybatis提供了动态SQL相关的标签让我们使用。
可以使用if标签进行条件判断条件成立才会把if标签中的内容拼接进sql语句中。
resultTypecom.sangeng.pojo.Userselect
#{username}/if/select如果参数username为null则执行的sql为select
如果参数username不为null则执行的sql为select
注意在test属性中表示参数的时候不需要写#{}写了会出问题。
可以使用该标签动态的添加前缀或后缀也可以使用该标签动态的消除前缀。
用来设置需要被清除的前缀,多个值可以用|分隔注意|前后不要有空格。
例如
resultTypecom.sangeng.pojo.Userselect
用来设置需要被清除的后缀,多个值可以用|分隔注意|前后不要有空格。
例如
resultTypecom.sangeng.pojo.Userselect
resultTypecom.sangeng.pojo.Userselect
#{username}/if/trim/select调用方法时如果传入的id和username为null则执行的SQL为select
调用方法时如果传入的id为nullusername不为null则执行的SQL为select
/trim可以使用where标签动态的拼接where并且去除前缀的and或者or。
resultTypecom.sangeng.pojo.Userselect
#{username}/if/where/select如果id和username都为null则执行的sql为**select
如果id为nullusername不为null则执行的sql为**select
/trim可以使用set标签动态的拼接set并且去除后缀的逗号。
#{id}/update如果调用方法时传入的User对象的id为2username不为null其他属性都为null则最终执行的sql为UPDATE
可以使用foreach标签遍历集合或者数组类型的参数获取其中的元素拿来动态的拼接SQL语句。
ids);如果期望动态的根据实际传入的数组的长度拼接SQL语句。
例如传入长度为4个数组最终执行的SQL为
resultTypecom.sangeng.pojo.Userselect
separator,#{id}/foreach/where/selectcollection表示要遍历的参数。
注意如果方法参数是数组类型默认的参数名是array如果方法参数是list集合默认的参数名是list。
建议遇到数组或者集合类型的参数统一使用Param注解进行命名。
当我们不想使用所有的条件而只是想从多个条件中选择一个使用时。
可以使用choose系列标签。
类似于java中的switch。
如果id为null,username不为null就通过username查询。
resultTypecom.sangeng.pojo.Userselect
3/otherwise/choose/where/selectchoose类似于java中的switch
一个choose标签中最多只会有一个when中的判断成立。
从上到下去进行判断。
如果成立了就把标签体的内容拼接到sql中并且不会进行其它when的判断和拼接。
如果所有的when都不成立则拼接otherwise中的语句。
我们在xml映射文件中编写SQL语句的时候可能会遇到重复的SQL片段。
这种SQL片段我们可以使用sql标签来进行抽取。
然后在需要使用的时候使用include标签进行使用。
id,username,age,address/sqlselect
resultTypecom.sangeng.pojo.Userselect
orders(id,createtime,price,remark,user_id)
16:55:43,2000,无,2),(2,2021-02-23
16:55:57,3000,无,3),(3,2021-02-23
(1,总经理,一人之下),(2,CFO,NULL);/*Table
(2,pdd,26,NULL),(3,UZI,19,上海11),(4,RF,19,NULL);/*Table
我们可以使用resultMap标签自定义结果集和实体类属性的映射规则。
propertycreatetime/resultresult
propertyuserId/result/resultMap!--使用我们自定义的映射规则--select
id,createtime,price,remark,user_id
我们定义resultMap时默认情况下自动映射是开启状态的。
也就是如果结果集的列名和我们的属性名相同是会自动映射的我们只需要写特殊情况的映射关系即可。
下面这种写法和上面的写法会有相同的效果因为其他属性的属性名和结果集的列名都是相同的会自动映射。
propertyuserId/result/resultMap!--使用我们自定义的映射规则--select
id,createtime,price,remark,user_id
ORDERS/select如有需要可以选择关闭自动映射可以把resultMap的autoMapping属性设置为false。
propertycreatetime/resultresult
propertyuserId/result/resultMap1.3
的extends属性来指定一个resultMap从而复用重复的映射关系配置。
!--定义个父映射供其他resultMap继承--resultMap
propertycreatetime/resultresult
propertyremark/result/resultMap!--继承baseOrderMap然后只需要写自己特有的映射关系即可--resultMap
propertyuserId/result/resultMap2.
我们可以直接写一个多表关联的SQL进行查询。
也可以分步进行多次的查询来拿到我们需要的结果。
Mybatis就提供了对应的配置可以让我们去更方便的进行相应的查询和对应的结果集处理。
两个实体之间是一对一的关系。
(例如我们需要查询订单要求还需要下单用户的数据。
这里的订单相对于用户是一对一。
)
//根据订单id查询订单要求把下单用户的信息也查询出来Order
id);因为期望Order中还能包含下单用户的数据所以可以再Order中增加一个属性
o.id,o.createtime,o.price,o.remark,o.user_id,u.id
①resultMap定义主要是对user对象的属性设置映射规则
propertycreatetime/resultresult
propertyremark/result/resultMapresultMap
propertyuserId/result/resultMap!--Order和User关联的映射--resultMap
columnaddress/result/resultMap②使用定义好的resultMap
!--根据订单id查询订单要求把下单用户的信息也查询出来--select
resultMaporderUserMapSELECTo.id,o.createtime,o.price,o.remark,o.user_id,u.id
uid,u.username,u.age,u.addressFROMorders
propertycreatetime/resultresult
propertyremark/result/resultMapresultMap
propertyuserId/result/resultMap!--Order和User关联的映射使用association--resultMap
javaTypecom.sangeng.pojo.Userid
columnaddress/result/association/resultMap②使用resultMap
!--根据订单id查询订单要求把下单用户的信息也查询出来--select
resultMaporderUserMapUseAssociationSELECTo.id,o.createtime,o.price,o.remark,o.user_id,u.id
uid,u.username,u.age,u.addressFROMorders
两个实体之间是一对多的关系。
(例如我们需要查询用户要求还需要该用户所具有的角色信息。
这里的用户相对于角色是一对多的。
)
//根据id查询用户并且要求把该用户所具有的角色信息也查询出来User
id);因为期望User中还能包含该用户所具有的角色信息所以可以在User中增加一个属性
u.id,u.username,u.age,u.address,r.id
columnaddress/result/resultMapresultMap
columndesc/result/collection/resultMap
u.id,u.username,u.age,u.address,r.id
如果有需要多表查询的需求我们也可以选择用多次查询的方式来查询出我们想要的数据。
Mybatis也提供了对应的配置。
例如我们需要查询用户要求还需要查询出该用户所具有的角色信息。
我们可以选择先查询User表查询用户信息。
然后在去查询关联的角色信息。
//根据用户名查询用户并且要求把该用户所具有的角色信息也查询出来User
resultTypecom.sangeng.pojo.Userselect
#{username}/select2.根据user_id查询Role
resultTypecom.sangeng.pojo.Roleselect
我们期望的效果是调用findByUsername方法查询出来的结果中就包含角色的信息。
所以我们可以设置findByUsername方法的RestltMap指定分步查询
columnaddress/result/resultMap!--select属性指定用哪个查询来查询当前属性的数据
写法包名.接口名.方法名column属性设置当前结果集中哪列的数据作为select属性指定的查询方法需要参数--resultMap
propertyrolesofTypecom.sangeng.pojo.Roleselectcom.sangeng.dao.RoleDao.findRoleByUserIdcolumnid/collection/resultMap指定findByUsername使用我们刚刚创建的resultMap
resultMapuserRoleMapBySelectselect
我们可以设置按需加载这样在我们代码中需要用到关联数据的时候才会去查询关联数据。
propertyrolesofTypecom.sangeng.pojo.Roleselectcom.sangeng.dao.RoleDao.findRoleByUserIdcolumnid
fetchTypelazy/collection/resultMap全局配置
valuetrue//settings3.分页查询-PageHelper
我们可以使用PageHelper非常方便的帮我们实现分页查询的需求。
不需要自己在SQL中拼接SQL相关参数并且能非常方便的获取的总页数总条数等分页相关数据。
resultTypecom.sangeng.pojo.Userselect
dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion4.0.0/version
interceptorcom.github.pagehelper.PageHelper!--
session.getMapper(UserDao.class);//设置分页查询参数PageHelper.startPage(1,1);ListUser
userDao.findAll();System.out.println(users.get(0));如果需要获取总页数总条数等分页相关数据只需要创建一个PageInfo对象把刚刚查询出的返回值做为构造方法参数传入。
然后使用pageInfo对象获取即可
PageInfoUser(users);System.out.println(总条数pageInfo.getTotal());System.out.println(总页数pageInfo.getPages());System.out.println(当前页pageInfo.getPageNum());System.out.println(每页显示长度pageInfo.getPageSize());3.2
我们在进行一对多的多表查询时如果使用了PageHelper进行分页。
会出现关联数据不全的情况。
我们可以使用分步查询的方式解决该问题
Mybatis的缓存其实就是把之前查到的数据存入内存map,下次如果还是查相同的东西就可以直接从缓存中取从而提高效率。
Mybatis有一级缓存和二级缓存之分一级缓存默认开启是sqlsession级别的缓存。
二级缓存相当于mapper级别的缓存。
2.调用相同方法参数也相同但是使用的是另外一个SqlSession
3.如果查询完后对同一个表进行了增删改的操作都会清空这sqlSession上的缓存
4.如果手动调用SqlSession的clearCache方法清除缓存了后面也使用不了缓存
注意只在sqlsession调用了close或者commit后的数据才会进入二级缓存。
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.sangeng.dao.RoleDaocache/cache
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback