mybatis中selectOne的用法

mybatis中selectOne的用法,第1张

“select One”,释义:选择一个。

用法如下:

Click to select one or more users from the list.  

单击此处可从以下列表中选择一个或多个用户

You can select one or many conditions.    

可以选择一个或多个条件。

Select one folder to perform this operation.    

执行此 *** 作之前,请选择一个文件夹。

From the displayed text, select one of the configuration attributes that you created, and then click OK.    

从这个显示的文本中,选择您创建的配置属性中的一个,然后点击OK。

Select one or more than one requirements and click OK.    

选择一个或者多个需求并点击OK。

想象一下你在淘宝,在购买东西后会有个订单支付的页面,下单后用户和订单就关联起来了,同时订单有一个唯一的编号叫订单号。用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

即 order对user是一对一的,反过来,user对order是一对多的

select * ,o.id oid from orders o,user u where o.uid=u.id

这个查询结果看起来很怪,有很多个id,不着急,后面我们在进行配置文件的配置的时候可以将id忽略。

User和以前一样

测试

或者通过

<association>标签配置user

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

select *,o.id oid from user u,orders o where u.id = o.id

打印结果

再来假设一个场景,小明是一个学生,他同时是班干部和学生会的干部,而学生会干部可以有多个学生,这样学生和学生会干部表就构成了多对多的关系

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

要实现这种多对多的关系,我们不仅需要role角色表,也需要一个中间表,用户和角色表之间的桥梁——用户id和角色id对应的表。

select u.*,r.*,r.id rid,u.id uid from user u left join user_role ur on u.id=ur.uid inner join role r on ur.rid=r.id

select * from user u,user_role ur,role r where u.id = ur.uid and ur.rid =r.id

User类添加

UserMapper接口添加

配置sqlMapperConfig.xml,给Role增加别名

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。

我们先围绕一些基本的CRUD来学习,再学习复杂映射多表 *** 作。

修改MyBatisTest.java,将公共 *** 作抽取出来

删除了之后,我们没有了配置文件了呀,那怎么做呢。

我们之前在sqlMapperConfig.xml里面配置了

删除了之后我们就得加载映射关系,指定接口所在的包

没有问题!说明可以运行。

实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>来实现,使用注解开发后,我们可以使用

@Results注解,@Result注解,@One注解,@Many注解

组合完成复杂关系的配置

前面我们用配置文件的方式实现了order和user的一对多查询,同样的我们也可以使用注解实现。

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

对应的sql语句:

测试

两个都可以正常运行。

我们上面的查询方式是一次查两张表,但是我们也可以通过查order表获取uid,再通过uid去查user表,这种方法怎么实现呢?

不知道你还记不记得,前面我们使用了<association>进行order和user表的一对一查询的封装,前面图中提到了@One属性,就是它的一种替代

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

可能这种方式用的比较多

对应的sql语句:

给OrderMapper.java增加一个查询方法

修改UserMapper.java

但是这种方法,其实是查到了所有的user,其中有些有orderList,原因在于这其实是一种按顺序的查询方式,先查了user表再查了order表

select *,o.id oid from user u,orders o where u.id = o.id 是不一样的

再来回顾一下多对多的查询

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

对应的sql语句:

这样子,就有个很怪的问题,注解查询每次都返回了全部的user,我不需要这么多的user啊,我只想要和role关联的那几个user,这会是一个好的方法吗。

demo:

第一个地方登陆:

1.得到请求的SessionId 和 登陆的 用户名

2.把SessionId 存到application里,用户名存到当前session里

ActionContext ac = ActionContext.getContext()

Map<String, Object>applicationMap=ac.getApplication()

Map<String, Object>sesisonMap = ac.getSession()

 //请求的sessionId

String currentSeesionId= getRequest().getSession().getId()

applicationMap.put(loanUserE.getUname(), currentSeesionId)

sesisonMap.put(CommonVar.SSO_LOGIN_NAME_KEY,loanUserE.getUname())

第二个地方登陆:

1.获取浏览器的 SessionId 和取得 登陆的用户名

2.在当前的session 里取得 用户名对应的关键字 ,用关键字在application里获取SessionId ,

作比较,不相等就跳到登陆。

 拦截器:

/** 初始化参数获得 */

ActionContext actionContext = arg0.getInvocationContext()

/** HttpServletRequest参数 */

HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST)

/** HttpServletResponse参数 */

HttpServletResponse response = (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE)

/** Session参数 */

Map<String, Object>sessionMap = actionContext.getSession()

Map<String, Object>appcationMap = actionContext.getApplication()

String loginName = null

// 上下文对象中的sessionId

String sessionId = null

if (!sessionMap.isEmpty()) {

loginName = (String) sessionMap.get(CommonVar.SSO_LOGIN_NAME_KEY)

}

if (null != loginName) {

sessionId = (String) appcationMap.get(loginName)

}

// 当前会话的sessionId

String currentSessionId = request.getSession().getId()

if (!currentSessionId.equals(sessionId)) {

return "loanUserLogin"

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11915581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存