在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以及MyBatis的分页问题。

  首先先看看项目的架构,方便后边叙述。

   这个项目中是一个Sping+MyBatis的完整demo(这边将页面没有展示。)这次的主题主要是后台数据处理逻辑。接下来为大家逐一介绍各个文件,

  org.config   Spring配置包括数据库的链接信息

  org.controller  逻辑控制,也就是MVC中的C

  org.dao      接口基类

  org.entity      实体以及MyBatis语句

  org.util       工具类

  在数据库中存在两张表,分别为Customer_info,order_info。用这两张表格最后实现多表格的关联查询。

  第一步骤:建立与数据库表格字段相一致的实体类:

  customerInfo.java

package org.entity;
//实现该接口--序列化,将对象写入文件
import java.io.Serializable;
import java.util.List; public class CustomerInfo implements Serializable {
private Integer customer_id;//客户信息的id
private String customer_name;//客户姓名
private String identity_no;//身份证号码
private String job_add;//工作单位
private String tel;//座机号码
private String cellphone;//移动电话
private String adds;//联系地址
private Integer post;//邮编
private String mail;//电子邮箱
//关联查询属性orderInfo
private List<OrderInfo> orderInfos; public List<OrderInfo> getOrderInfos() {
return orderInfos;
}
public void setOrderInfos(List<OrderInfo> orderInfos) {
this.orderInfos = orderInfos;
} public Integer getCustomer_id() {
return customer_id;
}
public void setCustomer_id(Integer customer_id) {
this.customer_id = customer_id;
}
public String getCustomer_name() {
return customer_name;
}
public void setCustomer_name(String customer_name) {
this.customer_name = customer_name;
}
public String getIdentity_no() {
return identity_no;
}
public void setIdentity_no(String identity_no) {
this.identity_no = identity_no;
}
public String getJob_add() {
return job_add;
}
public void setJob_add(String job_add) {
this.job_add = job_add;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getCellphone() {
return cellphone;
}
public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
public String getAdds() {
return adds;
}
public void setAdds(String adds) {
this.adds = adds;
}
public Integer getPost() {
return post;
}
public void setPost(Integer post) {
this.post = post;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
} }

  OrderInfo.java

 package org.entity;

 import java.io.Serializable;
import java.sql.Date; //订单退货单
public class OrderInfo implements Serializable{
private Integer order_id;//订单(退货单)信息的id
private String order_type;//订单类型
private String order_status;//订单状态
private Integer product_id;//商品id
private Integer product_account;//商品数量
private Double pay_money;//总额
private Integer customer_id;//客户id
private Date start_date;//开始日期
private Date deadline;//要求完成日期
private String return_reason;//退货原因
public Integer getOrder_id() {
return order_id;
}
public void setOrder_id(Integer order_id) {
this.order_id = order_id;
} public String getOrder_type() {
return order_type;
}
public void setOrder_type(String order_type) {
this.order_type = order_type;
}
public String getOrder_status() {
return order_status;
}
public void setOrder_status(String order_status) {
this.order_status = order_status;
}
public Integer getProduct_id() {
return product_id;
}
public void setProduct_id(Integer product_id) {
this.product_id = product_id;
}
public Integer getProduct_account() {
return product_account;
}
public void setProduct_account(Integer product_account) {
this.product_account = product_account;
}
public Double getPay_money() {
return pay_money;
}
public void setPay_money(Double pay_money) {
this.pay_money = pay_money;
}
public Integer getCustomer_id() {
return customer_id;
}
public void setCustomer_id(Integer customer_id) {
this.customer_id = customer_id;
}
public Date getStart_date() {
return start_date;
}
public void setStart_date(Date start_date) {
this.start_date = start_date;
}
public Date getDeadline() {
return deadline;
}
public void setDeadline(Date deadline) {
this.deadline = deadline;
}
public String getReturn_reason() {
return return_reason;
}
public void setReturn_reason(String return_reason) {
this.return_reason = return_reason;
} }

  Page.java

 package org.entity;

 public class Page {
//显示第几页数据,默认第一页
private Integer page=1;
//一页显示几条,默认5条
private Integer pageSize = 3;
//最大页数
private Integer totalPage=1; public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
//利用page和pageSize计算begin起点
public Integer getBegin(){
return (page-1)*pageSize;
}
//利用page和pageSize计算end结束点
public Integer getEnd(){
return page*pageSize+1;
} public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}

  在接下来的这两个文件中,里边详细些了如何进行增删改查,以及多表之间的查询操作等。其中sql语句中的每一个id对应着dao方法中的方法名称。dao文件的内容如下;

  customer.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="org.dao.CustomerInfoMapperDao"> <select id="findAll"
resultType="org.entity.CustomerInfo">
select * from customer_info
</select>
<delete id="deleteCustomer" parameterType="int">
delete from customer_info where customer_id=#{id}
</delete> <insert id="saveCustomer" parameterType="org.entity.CustomerInfo">
insert into Customer_info(customer_id,customer_name,identity_no,
job_add,tel,cellphone,Adds,post,mail)
values(customer_seq.nextval,#{customer_name,jdbcType=VARCHAR},#{identity_no,jdbcType=VARCHAR},
#{job_add,jdbcType=VARCHAR},#{tel,jdbcType=VARCHAR},#{cellphone,jdbcType=VARCHAR},
#{adds,jdbcType=VARCHAR},#{post,jdbcType=NUMERIC},#{mail,jdbcType=VARCHAR})
</insert> <select id="findByCustomerName"
parameterType="java.lang.String"
resultType="org.entity.CustomerInfo">
select * from customer_info where customer_name=#{customer_name}
</select>
<select id="findByCustomerId" parameterType="int" resultType="org.entity.CustomerInfo">
select * from customer_info where customer_id=#{customer_id,jdbcType=NUMERIC}
</select> <update id="updateCustomerInfo" parameterType="org.entity.CustomerInfo">
update customer_info set customer_name=#{customer_name,jdbcType=VARCHAR},
identity_no=#{identity_no,jdbcType=VARCHAR},
job_add=#{job_add,jdbcType=VARCHAR},tel=#{tel,jdbcType=VARCHAR},
cellphone=#{cellphone,jdbcType=VARCHAR},adds=#{adds,jdbcType=VARCHAR},
post=#{post,jdbcType=NUMERIC},mail=#{mail,jdbcType=VARCHAR}
where customer_id=#{customer_id,jdbcType=NUMERIC}
</update>
<select id="findPage" parameterType="org.entity.Page" resultType="org.entity.CustomerInfo" >
select *
FROM (select c1.*,rownum rn
FROM (select * FROM customer_info order by customer_id)c1)
where rn&gt;#{begin} and rn&lt;#{end} </select> <select id="findRows" resultType="int" >
select count(*) from customer_info
</select> <select id="somethingNotIn" resultType="返回所对应的实体">
SELECT * FROM user WHERE username NOT IN ('zhang','wang')
</select> <select id="findByCuId" parameterType="java.lang.Integer" resultMap="cuAndOrderResult">
select o.customer_id,o.order_id,o.order_type,o.order_status,o.product_id,o.product_account,o.start_date,
c.customer_name,c.cellphone,c.adds
from order_info o left join customer_info c on(o.customer_id=c.customer_id)
where o.customer_id=#{customer_id}
</select>
<resultMap id="cuAndOrderResult" type="org.entity.CustomerInfo" >
<id property="customer_id" column="customer_id"/>
<result property="customer_name" column="customer_name"/>
<result property="cellphone" column="cellphone"/>
<result property="adds" column="adds"/>
<collection ofType="org.entity.OrderInfo"
property="orderInfos" column="customer_id" javaType="java.util.List">
<id property="order_id" column="order_id"/>
<result property="order_type" column="order_type"/>
<result property="order_status" column="order_status"/>
<result property="product_id" column="product_id"/>
<result property="product_account" column="product_account"/>
<result property="start_date" column="start_date"/>
</collection>
</resultMap> <!--
<select id="findByCuId"
parameterType="java.lang.Integer"
resultMap="cuAndOrderResult">
select o.customer_id,o.order_id,o.order_type,o.order_status,o.product_id,o.product_account,
c.customer_name,c.cellphone,c.adds
from order_info o join customer_info c on(o.customer_id=c.customer_id)
where o.customer_id=#{customer_id}
select * from customer_info where customer_id=#{customer_id} </select>
<select id="selectOrderInfo"
parameterType="int"
resultType="org.entity.OrderInfo">
select * from order_info where customer_id=#{customer_id}
</select>
<resultMap id="cuAndOrderResult" type="org.entity.CustomerInfo">
<id column="customer_id" property="customer_id" />
<collection ofType="org.entity.OrderInfo"
property="orderInfos" javaType="java.util.ArrayList"
column="customer_id" select="selectOrderInfo">
</collection>
</resultMap> --> </mapper>

  OrderInfo.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="org.dao.OrderInfoMapperDao"> <select id="findAll"
resultType="org.entity.OrderInfo">
select * from Order_Info
</select> <select id="findPage" parameterType="org.entity.Page" resultType="org.entity.OrderInfo" >
select *
FROM (select c1.*,rownum rn
FROM (select * FROM Order_Info order by order_id)c1)
where rn&gt;#{begin} and rn&lt;#{end} </select> <select id="findRows" resultType="int" >
select count(*) from Order_Info
</select> </mapper>

  CustomerInfoMapperDao.java

 package org.dao;

 import java.util.List;

 import org.entity.CustomerInfo;
import org.entity.Page;
import org.util.MyBatisDao; //xml文件中的方法,然后在Controller中调用该方法
@MyBatisDao
public interface CustomerInfoMapperDao {
public List<CustomerInfo> findAll();
public void deleteCustomer(int id);
public void saveCustomer(CustomerInfo customer);
public CustomerInfo findByCustomerName(String customer_name);
public CustomerInfo findByCustomerId(int id);
public List<CustomerInfo> findByCuId(int id);//根据cuid查询客户的订单信息
public void updateCustomerInfo(CustomerInfo customer);
//分页操作
public List<CustomerInfo> findPage(Page page);
public int findRows(); }

  接下来主要来说一下,MyBatis中的多表关联问题。多表关联主要对应customer.xml中的这段代码;

在controller中的代码如下:

从图中可以看到,在这边使用了一个增强的for循环来进行处理,这样就实现了多表之间的关联查询,接下来将数据显示到前台页面即可。

主要代码:

 List<CustomerInfo> list = dao.findByCuId(id);
String ls = "";
List<OrderInfo> cu = null;
for(CustomerInfo cus:list){
cu=cus.getOrderInfos();
}
model.addAttribute("customers", list);
model2.addAttribute("order",cu);

  

Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询的更多相关文章

  1. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  2. Springboot中mybatis控制台打印sql语句

    Springboot中mybatis控制台打印sql语句 https://www.jianshu.com/p/3cfe5f6e9174 https://www.jianshu.com/go-wild? ...

  3. mybatis中的map.xml文件中sql语句需要分号吗?

    mybatis中的map.xml文件中sql语句需要分号吗? :你是说sql介绍的分号吗?不需要的

  4. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  5. 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)

    手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版) SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式, ...

  6. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  7. mybatis框架中XxxxMaper.xml的文件

    我们知道在mybatis框架中,config.xml中会关联到许多的XxxxMapper的xml文件,这些文件又对应着一个个的接口,来观察下这些xml文件 从以下这个文件为例子: <?xml v ...

  8. mybatis框架中的输入映射

    mybatis.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 输入类型: 1.传递简单类型 可以参考我之前的对于数据库增删改查的博文. ...

  9. mybatis 的动态sql语句是基于OGNL表达式的。

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

随机推荐

  1. 架构验证过程发现非数据类型错误 validation found non-data type errors

    问题: infopath报一下错误 validation found non-data type errors 架构验证过程发现非数据类型错误 原因: 重复表字段在后台代码里要一一对应,否则报错. 错 ...

  2. iOS中的交换空间(swap space)

    看来是没有交换空间,原因是闪存和SSD硬盘相比,速度很慢,也有电源管理的原因. the NAND flash is not designed to be used as swap. It is dam ...

  3. 【Swift 2.1】为 UIView 添加点击事件和点击效果

    前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园: ...

  4. android-async-http AsyncHttpClient介绍

    前一阵子刚搬了家,加上公司要发新版本,所以一直比较忙,文章也好几周没更新了.难得这个周末有空,正好周内偶然间闲逛 发现这个很不错的第三方开源类库,针对Android开发中发送http请求的. 在And ...

  5. php 与 java 生成时间戳的区别

    最近服务器有java却换到php环境,生成的时间戳转换成时间格式的出现异常,查询资料得知: PHP 的 time() 函数返回的结果是 Unix 时间戳,值的单位是秒:如:1463564861 Jav ...

  6. 比Ansible更吊的自动化运维工具,自动化统一安装部署_自动化部署udeploy 1.0

    新增功能: 2015-03-11 除pass(备份与更新)与start(启动服务)外,实现一切自动化. 注:pass与start设为业务类,由于各类业务不同,所以无法实现自动化.同类业务除外,如更新的 ...

  7. 在数组中找出x+y+z=0的组合

    就是找x+y=-z的组合 转化为找出值为-z满足x+y=-z的组合 解法一: 为了查找,首先想到排序,为了后面的二分,nlogn, 然后x+y的组合得n^2的复杂度,加上查找是否为-z,复杂度为nlo ...

  8. 解决问题:The context cannot be used while the model is being created

    使用Entity Framework (v6.1.3)突然遇到这个问题了,之前一直好好的,怎么破? 此处省略了多次在“好”与“坏"的项目中试验的过程(苦啊),直接给出答案.答案是:没有按Db ...

  9. WinForm登陆:窗体间的数据传递

    1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...

  10. 设计模式C#实现(十五)——命令模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对 ...