mybatis学习测试和基础配置

核心配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--引入外部文件jdbc.properties-->
    <properties resource="jdbc.properties"></properties>
    <!--setting表示行为参数-->
    <settings>
        <!--开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--关闭二级缓存-->
    <setting name="cacheEnabled" value="false"/>

        <!-- 开启延迟加载 要先导入cglib的jar包,再改造高级查询关系-->
      <!--  <setting name="lazyLoadingEnabled" value="true"/>-->
        <!-- 开启按需加载 -->
      <!--  <setting name="aggressiveLazyLoading" value="false"/>-->
    </settings>
    <!--类型别名:type-pojo类的全路径,alias-别名名称(可随便写,推荐和类名一致-->
    <typeAliases>
        <!--方式一:但是如果类多的话比较麻烦,type:包装类的全路径,alias:别名,建议方式二-->
        <!--<typeAlias type="cn.itcast.pojo.User" alias="User"></typeAlias>-->
        <!--方式二:配置扫描-->
        <package name="cn.itcast.pojo"></package>
    </typeAliases>
    <!-- 环境:后缀s说明可以配置多个,default:指定生效的环境 -->
    <environments default="development">
        <environment id="development">
            <!--事务-->
            <transactionManager type="JDBC"/>
            <!-- 数据源:type-池类型的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <!--resource表示classpath路径下-->
        <mapper resource="UserMapper.xml"/>
        <mapper resource="UserDaoMapper.xml"/>
        <mapper resource="commonSQL.xml"></mapper>
        <mapper resource="OrderMapper.xml"></mapper>

    </mappers>
</configuration>
接口UserMapper

package cn.itcast.mapper;

import cn.itcast.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {
    /*
     * 动态SQL,使用foreach标签
     * 根据多个id查询用户信息
     * */
    public List<User> queryUserInIds(@Param("ids") Long[] ids);
    /*
     * 动态SQL,使用set标签
     * 修改用户信息,如果参数user中的某个属性为null,则不修改。
     * */
    public  void updateUserUseSet(User user);

    /**
     * 动态SQL,使用choose标签
     */
    public List<User> queryByusernameOrAge(@Param("userName") String userName, @Param("age") Integer age);
            /*
             * 动态SQL,使用choose标签
             * */
    public List<User> queryByUsernmmeListAndAge(@Param("userName") String userName, @Param("age") Integer age);

    /*
     * 动态SQL,使用if标签
     * */
    public List<User> queryuserByUsernameLike(@Param("userName") String userName);

    /**
     * 多个参数的传递,#{}和${}使用
     */
    public User login(@Param("userName") String userName, @Param("password") String password);

    /**
     * 预编译表名查询
     */
    public List<User> queryByTableName(@Param("tableName") String tableName);

    /***
     * 根据id查询
     */
    public User queryById(Long id);

    /***
     * 查询所有
     * @return
     */
    public List<User> queryAllUser();

    /***
     * 新增
     * @param user
     */
    public void insert(User user);

    /***
     * 根据id删除
     * @param id
     */
    public void deleteById(Long id);

    /***
     * 修改
     * @param user
     */
    public void update(User user);
}
UserMapper.xml映射关系

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--映射文件的跟标签,namespace 名称空间,全局的唯一标识用动态代理的换必须是接口的全路径类名-->
<mapper namespace="cn.itcast.mapper.UserMapper">
    <!--id用动态代理的话必须与方法名一致  resultType最好使用pojo对象的全路径名(可以通过配置扫描简写)-->
    <!--    这个方式获取不到user_name的值,三种解决方法:1.起别名,2.在核心配置中启用驼峰命名3.自定义resultMap

       方法1: select *,user_name as userName from  tb_user where id = #{id}
       方式2前提开启驼峰命名: select * from tb_user where id = #{id}
       -->

    <!--方法3:
         自定义映射关系
            type:结果集封装类型
            id:唯一标识
            autoMapping:自动映射,如果开启了驼峰匹配,就以驼峰匹配的形式映射,建议一直写着
            子标签:id:主键的映射关系
                    column:主键的列名
                    property:主键的属性名
                result:普通属性的映射关系(非主键,非包装类型)
                    column:变种列
                    property:属性名

        <resultMap id="userMap" type="User" autoMapping="true">
            <id column="id" property="id"></id>
            <result column="user_name" property="userName"></result>
        </resultMap>
        <select id="queryById" resultMap="userMap">
            select * from tb_user where id = #{id}
        </select>
    -->
    <!-- 查询的statement
    id:在同一名称空间下的唯一标识。使用动态代理之后要求和mapper接口方法一致,必须属性
    resultType:结果集封装类型,要求和mapper接口的方法返回类型一致,和resultMap
    parameterType:参数类型,可省略
 -->
    <select id="queryById" resultType="User">
        select * from tb_user where id = #{id}
    </select>

    <!--这边用sql片段代替*-->
    <select id="queryAllUser" resultType="cn.itcast.pojo.User">
        SELECT <include refid="CommonSQL.commonSql"></include> FROM tb_user
    </select>

    <!-- 新增的statement
		id:在同一名称空间下的唯一标识。使用动态代理之后要求和mapper接口方法一致,必须属性
		parameterType:参数类型,可省略
		useGeneratedKeys:开启主键回写,回写到方法参数中
		keyColumn:主键的列名
		keyProperty:主键的属性名
	 -->
    <insert id="insert" parameterType="cn.itcast.pojo.User" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        INSERT INTO tb_user(
        user_name,
        password,
        name,
        age,
        sex,
        birthday,
        created,
        updated
        )
        VALUES
        (
        #{userName},
        #{password},
        #{name},
        #{age},
        #{sex},
        #{birthday},
        NOW(),
        NOW()
        );
    </insert>

    <!-- 更新的statement
    id:在同一名称空间下的唯一标识。使用动态代理之后要求和mapper接口方法一致,必须属性
    parameterType:参数类型,可省略
 -->
    <update id="update" parameterType="cn.itcast.pojo.User">
        UPDATE tb_user
        SET
        user_name = #{userName},
        password = #{password},
        name = #{name},
        age = #{age},
        sex = #{sex},
        birthday = #{birthday},
        updated = NOW()
        WHERE
        (id = #{id});
    </update>

    <!-- 删除的statement
    id:在同一名称空间下的唯一标识。使用动态代理之后要求和mapper接口方法一致,必须属性
    parameterType:参数类型,可省略
 -->
    <delete id="deleteById" parameterType="cn.itcast.pojo.User">
        DELETE  FROM tb_user where id = #{id}
    </delete>

    <!--预编译表名查询测试${}和#{}-->
    <select id="queryByTableName" resultType="User">
        SELECT * FROM ${tableName}
    </select>

    <select id="login" resultType="User">
      SELECT * FROM tb_user WHERE user_name=#{userName} AND password=#{password}
    </select>

    <!--动态SQL,使用if标签-->
    <select id="queryuserByUsernameLike" resultType="User">
        SELECT * from tb_user where sex=1
        <if test="userName!=null and userName.trim()!=''">
            AND user_name LIKE "%"#{userName}"%"
        </if>
    </select>

    <!--动态SQL,使用choose标签-->
    <select id="queryByUsernmmeListAndAge" resultType="User">

        SELECT * FROM tb_user where 1=1
        <choose>
            <when test="userName!=null and userName!=''">
                and user_name LIKE "%"#{userName}"%"
            </when>
            <when test="age!=null and age!=''">
                AND age < #{age}
            </when>
            <otherwise>
                AND user_name='zhangsan'
            </otherwise>
        </choose>
    </select>
    <!--动态SQL,使用where标签-->
    <select id="queryByusernameOrAge" resultType="User">
        SELECT * FROM tb_user
        <where>
            <if test="userName!=null and userName!=''">
                and user_name LIKE "%"#{userName}"%"
            </if>
            <if test="age!=null and age!=''">
                AND age < #{age}
            </if>
        </where>
    </select>

    <!--set标签
    		set自动添加set关键字
			也有一定的纠错功能:自动去掉sql语句块之后多余的一个逗号
    -->
    <update id="updateUserUseSet" parameterType="User">
         UPDATE tb_user
        <set>

            <if test="name!=null and name.trim()!=''">name = #{name},</if>
            <if test="age!=null">age = #{age},</if>

        </set>
        WHERE
        (id = #{id});
    </update>

<!--foreach标签]
			foreach:遍历集合
			collection:接收的集合参数
			item:遍历的集合中的一个元素
			separator:分隔符
			open:以什么开始
			close:以什么结束
-->
    <select id="queryUserInIds" resultType="User">
      SELECT * FROM tb_user WHERE id in
      <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
      </foreach>
    </select>
</mapper>

log4j.properties日志文件

log4j.rootLogger=DEBUG,A1
log4j.logger.org.mybatis=DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

commonSQL.xml(用于优化sql语句的可以不用)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--映射文件的跟标签,namespace 名称空间-->
<!--定义SQL片段,在企业中SQL语句不允许出现*,会影响性能-->
<!--别忘了在核心核心配置文件中引入-->
<mapper namespace="CommonSQL">
<sql id="commonSql">
        id,
        user_name,
        password,
        name,
        age,
        sex,
        birthday,
        created,
        updated

</sql>
</mapper>

junit测试代码:

package cn.itcast.test;

import cn.itcast.mapper.UserMapper;
import cn.itcast.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class UserMapperTest {

    private UserMapper userMapper;
    @Before
    public void setUp() throws Exception {
        //指定mybatis的全局配置文件
        String resource = "mybatis.config.xml";
        //服务配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //基于配置文件构建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //打开sqlSession会话
       // SqlSession sqlSession = sqlSessionFactory.openSession();
        //openSession(true)中true表示自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //参数是UserMapper.class接口
        this.userMapper =sqlSession.getMapper(UserMapper.class);

    }

    @Test
    public void queryById() {
        System.out.println(this.userMapper.queryById(1L));
    }

    @Test
    public void queryAllUser() {
        System.out.println(this.userMapper.queryAllUser());
    }

    @Test
    public void insert() {
        User user = new User();
        user.setName("林志4444");
        user.setAge(18);
        this.userMapper.insert(user);
        System.out.println(user.getId());
    }

    @Test
    public void deleteById() {
        this.userMapper.deleteById(5L);
    }

    @Test
    public void update() {
        User user = this.userMapper.queryById(8L);
        user.setName("林志玲");
        user.setAge(20);
        this.userMapper.update(user);
    }


    @Test
    public void queryByTableName(){
        List<User> userList = this.userMapper.queryByTableName("tb_user");
        for (User user : userList) {
            System.out.println(user);
        }
    }
    @Test
    public void login(){
        User user = this.userMapper.login("zhangsan", "123456");
        System.out.println(user);
    }

    @Test
    public void ueryuserByUsernameLike(){
        List<User> userList = this.userMapper.queryuserByUsernameLike("zhang");
        for (User user : userList) {
            System.out.println(user);

        }
    }

    @Test
    public void queryByUsernmmeListAndAge(){
        List<User> userList = this.userMapper.queryByUsernmmeListAndAge("", 30);
        for (User user : userList) {
            System.out.println(user);
        }
    }
    @Test
    public void queryByusernameOrAge(){
        List<User> list = this.userMapper.queryByusernameOrAge("zhang", 30);
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public  void updateUserUseSet(){
        User user = this.userMapper.queryById(8L);
        user.setName("林999");
        user.setAge(27);
        this.userMapper.updateUserUseSet(user);
    }

    @Test
    public  void queryUserInIds(){
        Long[] ids = {1l,2l,4l,3l};
        List<User> userList = this.userMapper.queryUserInIds(ids);
        for (User user : userList) {
            System.out.println(user);
        }

    }
}

实体类User
package cn.itcast.pojo;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{

    private Long id;

    // 用户名
    private String userName;

    // 密码
    private String password;

    // 姓名
    private String name;

    // 年龄
    private Integer age;

    // 性别,1男性,2女性
    private Integer sex;

    // 出生日期
    private Date birthday;

    // 创建时间
    private Date created;

    // 更新时间
    private Date updated;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", name=" + name
                + ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + ", created=" + created
                + ", updated=" + updated + "]";
    }

}

mybatis的高级查询一对一,一对多,多对多:

表的关系:


相关文件:接口OrderMapper.java,OrderMapper.xml,测试类OrderMapperTest,以及相关实体类

接口OrderMapper.java

package cn.itcast.mapper;


import cn.itcast.pojo.Order;
import cn.itcast.pojo.User;
import org.apache.ibatis.annotations.Param;

public interface OrderMapper {
    /**
     * 根据订单号查询订单信息,并且查询出下单人信息
     * @param number
     * @return
     */
    public Order queryOrderWithUserByOrdernumber(@Param("number")String number);

    /**
     * 查询订单,查询出下单人信息并且查询出订单详情中的商品数据。
     * @param number
     * @return
     */
    public Order queryOrderWithUserDetailItem(@Param("number")String number);

    /**
     * 查询订单,查询出下单人信息并且查询出订单详情中的商品数据。
     * @param number
     * @return
     */
    public Order queryOrderWithUserAndDetailAndItem(@Param("number")String number);


}

OrderMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--映射文件的跟标签,namespace 名称空间,全局的唯一标识用动态代理的换必须是接口的全路径类名-->
<mapper namespace="cn.itcast.mapper.OrderMapper">
    <resultMap id="orderMap" type="Order" autoMapping="true">
        <id column="id" property="id"></id>
        <!--        association:一对一的映射
                    property:类中java的属性名
                    javaType:属性名对应的java类型
                    autoMapping:开启自动映射
                    子标签:参照resultMap-->
        <association property="user" javaType="User" autoMapping="true">
            <id column="user_id" property="id"></id>
        </association>
    </resultMap>
 <!--  resultType不能完成user信息的映射,必须使用resultMap,resultMap的值对应resultMap标签的id,resultMap和resultType必须二选一-->
    <select id="queryOrderWithUserByOrdernumber" resultMap="orderMap">
        SELECT * FROM tb_order a LEFT JOIN tb_user b ON a.user_id = b.id
        WHERE a.order_number = #{number}
    </select>


    <!--一对多映射
    property:属性名
    javaType:集合类型
    ofType:集合的泛型
    autoMapping:自动映射
    -->
    <resultMap id="orderDetailMap" type="Order" autoMapping="true" extends="orderMap"><!--通过extends简化配置-->
<!--        <id column="id" property="id"></id>
        <association property="user" javaType="User" autoMapping="true">
            <id column="user_id" property="id"></id>
        </association>-->
        <collection property="orderdetailList" javaType="List" ofType="Orderdetail" autoMapping="true">
            <id property="id" column="detail_id"></id>
        </collection>
    </resultMap>
    <select id="queryOrderWithUserDetailItem" resultMap="orderDetailMap">
        SELECT *,c.id AS detail_id FROM tb_order a
            LEFT JOIN tb_user b ON a.user_id = b.id
            LEFT JOIN tb_orderdetail c ON a.id = c.order_id
            WHERE a.order_number = #{number}
    </select>

    <!--多对多嵌套-->
    <resultMap id="orderDetailItemMap" type="Order" autoMapping="true" extends="orderMap">
      <!--  <id column="id" property="id"></id>
        <association property="user" javaType="User" autoMapping="true">
            <id column="user_id" property="id"></id>
        </association>-->
        <collection property="orderdetailList" javaType="List" ofType="Orderdetail" autoMapping="true">
            <id property="id" column="detail_id"></id>
            <association property="item" javaType="Item" autoMapping="true">
                <id property="id" column="item_id"></id>
            </association>
        </collection>
    </resultMap>

    <select id="queryOrderWithUserAndDetailAndItem" resultMap="orderDetailItemMap">
		select *,c.id as detail_id from tb_order a
			LEFT JOIN tb_user b on a.user_id=b.id
			LEFT JOIN tb_orderdetail c on a.id=c.order_id
			LEFT JOIN tb_item d on c.item_id=d.id
		where a.order_number=#{number}
    </select>
</mapper>

junit测试:

package cn.itcast.test;

import cn.itcast.mapper.OrderMapper;
import cn.itcast.pojo.Order;
import cn.itcast.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;

public class OrderMapperTest {
private OrderMapper orderMapper;
    @Before
    public void setUp() throws Exception {
        //指定全局配置文件
        String resource = "mybatis.config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        orderMapper = sqlSession.getMapper(OrderMapper.class);

    }

    @Test
    public void queryOrderWithUserByOrdernumber() {
        Order order = orderMapper.queryOrderWithUserByOrdernumber("20140921001");
        System.out.println(order);
    }
    @Test
    public  void queryOrderWithUserDetailItem(){
        Order order = orderMapper.queryOrderWithUserDetailItem("20140921001");
        System.out.println(order);
    }
    @Test
    public  void  queryOrderWithUserAndDetailAndItem(){
        Order order = orderMapper.queryOrderWithUserAndDetailAndItem("20140921001");
        System.out.println(order);
    }
}

实体类Order:

package cn.itcast.pojo;


import java.util.List;

/**
 * 订单表
 *
 */
public class Order {

    private Integer id;

    private Long userId;

    private String orderNumber;

    //添加与User的一对一关系
    private User user;

    //一对多
    private List<Orderdetail> orderdetailList;

    public List<Orderdetail> getOrderdetailList() {
        return orderdetailList;
    }

    public void setOrderdetailList(List<Orderdetail> orderdetailList) {
        this.orderdetailList = orderdetailList;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }


    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", userId=" + userId +
                ", orderNumber='" + orderNumber + '\'' +
                ", user=" + user +
                ", orderdetailList=" + orderdetailList +
                '}';
    }
}

实体类OrderDetail

package cn.itcast.pojo;

public class Orderdetail {

    private Integer id;

    private Double totalPrice;

    private Integer status;

    private Item item;

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }

    public Double getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(Double totalPrice) {
        this.totalPrice = totalPrice;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Orderdetail{" +
                "id=" + id +
                ", totalPrice=" + totalPrice +
                ", status=" + status +
                ", item=" + item +
                '}';
    }
}
实体类Item

package cn.itcast.pojo;

/**
 * 商品表
 */
public class Item {

    private Integer id;

    private String itemName;

    private Float itemPrice;

    private String itemDetail;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public Float getItemPrice() {
        return itemPrice;
    }

    public void setItemPrice(Float itemPrice) {
        this.itemPrice = itemPrice;
    }

    public String getItemDetail() {
        return itemDetail;
    }

    public void setItemDetail(String itemDetail) {
        this.itemDetail = itemDetail;
    }

    @Override
    public String toString() {
        return "Item{" +
                "id=" + id +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", itemDetail='" + itemDetail + '\'' +
                '}';
    }
}

数据库建表语句
/*
Navicat MySQL Data Transfer

Source Server         : 127.0.0.1
Source Server Version : 50619
Source Host           : 127.0.0.1:3306
Source Database       : mybatis_test

Target Server Type    : MYSQL
Target Server Version : 50619
File Encoding         : 65001

Date: 2014-11-27 11:00:43
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_name` varchar(32) NOT NULL COMMENT '商品名称',
  `item_price` float(6,1) NOT NULL COMMENT '商品价格',
  `item_detail` text COMMENT '商品描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_item
-- ----------------------------
INSERT INTO `tb_item` VALUES ('1', 'iPhone 6', '5288.0', '苹果公司新发布的手机产品。');
INSERT INTO `tb_item` VALUES ('2', 'iPhone 6 plus', '6288.0', '苹果公司发布的新大屏手机。');

-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `order_number` varchar(20) NOT NULL COMMENT '订单号',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_1` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_order
-- ----------------------------
INSERT INTO `tb_order` VALUES ('1', '1', '20140921001');
INSERT INTO `tb_order` VALUES ('2', '2', '20140921002');
INSERT INTO `tb_order` VALUES ('3', '1', '20140921003');

-- ----------------------------
-- Table structure for tb_orderdetail
-- ----------------------------
DROP TABLE IF EXISTS `tb_orderdetail`;
CREATE TABLE `tb_orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(32) DEFAULT NULL COMMENT '订单号',
  `item_id` int(32) DEFAULT NULL COMMENT '商品id',
  `total_price` double(20,0) DEFAULT NULL COMMENT '商品总价',
  `status` int(11) DEFAULT NULL COMMENT '状态',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`order_id`),
  KEY `FK_orderdetail_2` (`item_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`order_id`) REFERENCES `tb_order` (`id`),
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`item_id`) REFERENCES `tb_item` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_orderdetail
-- ----------------------------
INSERT INTO `tb_orderdetail` VALUES ('1', '1', '1', '5288', '1');
INSERT INTO `tb_orderdetail` VALUES ('2', '1', '2', '6288', '1');
INSERT INTO `tb_orderdetail` VALUES ('3', '2', '2', '6288', '1');
INSERT INTO `tb_orderdetail` VALUES ('4', '3', '1', '5288', '1');

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int(10) DEFAULT NULL COMMENT '年龄',
  `sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123456', '张三', '30', '1', '1984-08-08', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456', '李四', '21', '2', '1991-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '2', '1989-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1', '1988-09-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '1', '1985-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1988-08-08', '2014-09-20 11:41:15', '2014-09-20 11:41:15');

补充:延迟加载

	/**
	 * 测试延迟加载
	 * @param number
	 * @return
	 */
	public Order queryOrderLazy(@Param("number")String number);


先改造高级查询:


处理组合键时,需要传递多个参数,可以使用column=”{prop1=col1, prop2=col2, prop3=col3…}”,设置多个列名传入到嵌套查询语句,mybatis会把prop1,prop2,prop3设置到目标嵌套的查询语句中的参数对象中。
子查询中,必须通过prop1,prop2,prop3获取对应的参数值,你也可以使用这种方式指定参数名例如:

最后在mybatis-config.xml配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值