“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"
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)