Spring-Boot 2.0 初探-记录学习

代码地址:https://github.com/MelvinCen/orderSpringBoot

准备:

在自己的数据库test2中新建了两张表,order_main和order_detail,这是看尚学堂老葛的时候看到的,没有刻意设计,只为test

create table t_user (
	user_id int  auto_increment primary key comment '用户id',
    user_name varchar(20) not null comment '用户姓名',
    user_password varchar(20) not null comment '用户密码',
    user_email varchar(20) not null comment '用户邮箱',
    user_phone varchar(20) not null comment '用户手机'
);

create table order_main (
	id int auto_increment  primary key comment '订单id',
    order_date timestamp not null comment '订单日期',
    consignee varchar(20) not null comment '收货人姓名',
    phone varchar(20) not null comment '收货人手机号',
    province varchar(50) not null comment '收货人所在省',
    city varchar(50) not null comment '收货人所在市',
    district varchar(50) not null comment '收货人所在区',
    address varchar(50) not null comment '详细地址',
    status int default 0 comment '订单状态'
);

开始第一步:创建项目,使用的jdk1.8.0_144,mysql,mybatis

图1.1

 图1.2

图1.3

创建完成后的gradle文件:

图1.4

第二步:配置application.yml文件

生成的是application.properties,改成了application.yml

配置连接

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test2
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

 第三步:

新建domain包,根据数据库字段新建相应的pojo

public class Order {

    private int id;
    private String orderDate;//订单时间
    private String consignee;//收货人
    private String phone;//收货人手机号
    private String province;//收货人所在省
    private String city;//收货人所在市
    private String district;//收货人所在区
    private String address;//收货人详细地址
    private List<OrderItem> orderItems;//订单商品详细信息
    private int status;//订单状态
  
}

public class OrderItem {
    private int id;
    private int OrderId;
    private int productId;
    private String productName;//商品名称
    private int num;//订单的该商品数量
    private int price;//商品单价


}

新建一个功能的接口

public interface IOrder {

    public Order queryOneOrder(int id);

    public Order queryOneOrderWithDetail(int id);

    public int insertOneOrder(Order order);

    public OrderItem queryOneOrderDetail(int id);

    public void insertOneOrderDetail(OrderItem orderItem);

    public void insertBatchOrderDetail(List<OrderItem> orderItems);
}

 第四步:

在resources文件夹下新建一个放置mapper.xml的文件夹

用于新建各自的mapper.xml

order_main的:

<?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">
<mapper namespace="cn.melvin.order.dao.order.IOrder">

    <!--该结果集只映射订单主表的基本信息,没有映射订单子表的信息-->
    <resultMap id="OrderResult" type="OrderAlias">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="order_date" jdbcType="TIMESTAMP" property="orderDate"/>
        <result column="status" jdbcType="INTEGER" property="status"/>
        <result column="consignee" jdbcType="VARCHAR" property="consignee"/>
        <result column="phone" jdbcType="VARCHAR" property="phone"/>
        <result column="province" jdbcType="VARCHAR" property="province"/>
        <result column="city" jdbcType="VARCHAR" property="city"/>
        <result column="district" jdbcType="VARCHAR" property="district"/>
        <result column="address" jdbcType="VARCHAR" property="address"/>
    </resultMap>

    <!--该结果集映射了订单主表的信息还包括订单子表的信息-->
    <resultMap id="OrderWithDetailResult" type="OrderAlias">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="order_date" jdbcType="TIMESTAMP" property="orderDate"/>
        <result column="status" jdbcType="INTEGER" property="status"/>
        <result column="consignee" jdbcType="VARCHAR" property="consignee"/>
        <result column="phone" jdbcType="VARCHAR" property="phone"/>
        <result column="province" jdbcType="VARCHAR" property="province"/>
        <result column="city" jdbcType="VARCHAR" property="city"/>
        <result column="district" jdbcType="VARCHAR" property="district"/>
        <result column="address" jdbcType="VARCHAR" property="address"/>
        <collection property="orderItems" resultMap="cn.melvin.order.dao.order.IOrder.OrderDetail"/>
    </resultMap>

    <!--查询订单但不涉及订单子表-->
    <select id="queryOneOrder" parameterType="int" resultMap="OrderResult">
        SELECT id,order_date,consignee,status FROM order_main WHERE id=#{id:INTEGER}
    </select>

    <!--查询订单包括订单子表的集合-->
    <select id="queryOneOrderWithDetail" parameterType="int"
            resultMap="OrderWithDetailResult">
        SELECT a.id,a.order_date,a.consignee,a.status,b.id did,b.order_id,b.product_id,b.product_name,
        b.num,b.price FROM order_main a left join order_detail b on a.id=b.order_id
        WHERE a.id = #{id:INTEGER}
    </select>

    <!--插入一条订单不包括子订单-->
    <insert id="insertOneOrder" parameterType="OrderAlias"
            useGeneratedKeys="true" keyProperty="id">
        INSERT INTO order_main (order_date,consignee,phone,province,city,district,address,status)
        VALUES (#{orderDate},#{consignee},#{phone},#{province},#{city},#{district},#{address},#{status})
    </insert>
</mapper>

 order_detail的:

<?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">
<mapper namespace="cn.melvin.order.dao.order.IOrder">

    <!--订单子表结果集映射-->
    <resultMap id="OrderDetail" type="OrderDetailAlias">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="order_id" jdbcType="INTEGER" property="OrderId"/>
        <result column="product_id" jdbcType="INTEGER" property="productId"/>
        <result column="product_name" jdbcType="VARCHAR" property="productName"/>
        <result column="num" jdbcType="INTEGER" property="num"/>
        <result column="price" jdbcType="INTEGER" property="price"/>
    </resultMap>

    <!--查询订单子表的信息-->
    <select id="queryOneOrderDetail" parameterType="int" resultMap="OrderDetail">
        SELECT * FROM order_detail WHERE id=#{id:INTEGER}
    </select>

    <insert id="insertOneOrderDetail" parameterType="cn.melvin.order.domain.order.OrderItem">
        INSERT INTO order_detail
        (order_id,product_id,product_name,num,price) VALUES (#{OrderId},#{productId},#{productName},#{num},#{price})
    </insert>

    <insert id="insertBatchOrderDetail" parameterType="java.util.List">
        INSERT INTO order_detail (order_id,product_id,product_name,num,price) VALUES
        <foreach collection="list" index="index" item="item" separator=",">
            (#{item.OrderId},#{item.productId},#{item.productName},#{item.num},#{item.price})
        </foreach>
    </insert>
</mapper>

在resources根目录下新建了配置文件configration.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>
    <typeAliases>
        <typeAlias alias="OrderAlias" type="cn.melvin.order.domain.order.Order"/>
        <typeAlias alias="OrderDetailAlias" type="cn.melvin.order.domain.order.OrderItem"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test2"/>
                <property name="username" value="root"/>
                <property name="password" value="63692234"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <mapper resource="mybatis/Order.xml"/>
        <mapper resource="mybatis/OrderItem.xml"/>
    </mappers>
</configuration>

注意:

1,这里的namespace很关键,不然会包找不到

2,jdbcType我之前写成了int报错,jdbcType类型可以网上查询

地址:http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.html

3,mapper中的返回值type是在configration.xml这个配置文件中配置后引用的

第五步:

分别创建了Dao,service和controller,没有test直接boot:run后用的postman测试

@Repository
public class OrderDao {

    MybatisUtils mybatisUtils = new MybatisUtils();
    SqlSession sqlSession = null;

    public int insertOneOrder(Order order){
        int count = 0;

        try {
            sqlSession = mybatisUtils.getSqlSession();
            IOrder iOrder = sqlSession.getMapper(IOrder.class);
            count = iOrder.insertOneOrder(order);
            sqlSession.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
        return count;
    }

    public void insertBatchOrderDetail(List<OrderItem> orderItems){
        try {
            sqlSession = mybatisUtils.getSqlSession();
            IOrder iOrder = sqlSession.getMapper(IOrder.class);
            iOrder.insertBatchOrderDetail(orderItems);
            sqlSession.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (sqlSession != null) {
                sqlSession.close();
            }

        }
    }

}
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    OrderService orderService;


    @PostMapping("/insertOrder")
    public String insertOne(@RequestBody Order order){
        orderService.insertOne(order);
        return "success";
    }
}

mybatisUtils摘自网络

public class MybatisUtils {
    public SqlSession getSqlSession() throws IOException {
        // 1通过配置文件获取数据库连接信息
        InputStream inputStream = Resources.getResourceAsStream("Configuration.xml");
        // 2通过配置文件得到sqlSessionFactory对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
        // 3通过sessionFactory得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        System.out.println("创建的sqlSession - "+sqlSession);
        return sqlSession;
    }
}

最终的目录结构:

 第六步:

测试

 

插入成功。

成功hello world

继续学习

猜你喜欢

转载自blog.csdn.net/MelvinCen/article/details/82383887