初入MyBatis,配置与使用

一.下载MyBatis

  github项目地址:https://github.com/mybatis/mybatis-3/releases

二.将MySql驱动和MyBatis的jar包放到项目的buildpath中

 

 

 三.在src根目录下新建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加载数据库driver,url,username,password的字段封装) -->
    <!--properties resource="db.properties"/-->

    <!--此处设置Java POJO类型别名-->
    <typeAliases>
        <!--1.单独设置某个类型的别名-->
        <!--<typeAlias type="com.woniuxy.mall.entity.Category" alias="Category"/>-->
        <!--2.将package中的所有类,都以简单类名作为别名-->
        <package name="com.woniu.mall.entity"/>
    </typeAliases>
    <!-- 设置一个默认的连接环境信息 -->
    <environments default="development">
        <!-- 连接环境信息,取一个任意唯一的名字 -->
        <environment id="development">
            <!-- mybatis使用jdbc事务管理方式 -->
            <transactionManager type="JDBC" />
            <!-- mybatis使用连接池方式来获取连接 -->
            <dataSource type="POOLED">
                <!-- 配置与数据库交互的4个必要属性 -->
                <!--1.若存在属性文件字段(例:jdbc.driver=com.mysql.cj.jdbc.Driver)则使用${mysql.*}方式读取-->
                <!--property name="driver" value="${mysql.driver}"/-->
                <!--2.若不存在属性文件,则手动填写数据库连接相应信息(driver,url,username,password)-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url"    value="jdbc:mysql://localhost:3310/woniumall?useSSL=false&amp;serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 加载映射文件-->
    <mappers>
        <mapper resource="com/woniu/mall/dao/CategoryMapper.xml" />
        <mapper resource="com/woniu/mall/dao/UserMapper.xml" />
        <mapper resource="com/woniu/mall/dao/RecAddressMapper.xml" />
        <mapper resource="com/woniu/mall/dao/GoodsMapper.xml"/>
        <mapper resource="com/woniu/mall/dao/CartMapper.xml"/>
        <mapper resource="com/woniu/mall/dao/OrderMapper.xml"/>
        <mapper resource="com/woniu/mall/dao/OrderDetilsMapper.xml"/>
    </mappers>
</configuration>

 

三.在实体类entity包新建POJO, 属性与关系数据库中的列对应

  

 

 

 四.在数据访问层 DAO(Data Access Object),dao包中新建接口XxxDAO,里面声明若干的抽象方法

  

 

 

 五.为每一个在同一个包中新建一个_ _Mapper.xml的映射文件,其中配置就是DAO中的方法,映射关系

   

  映射文件配置:

  

<?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对应一个dao -->
<mapper namespace="com.woniu.mall.dao.CartDAO">
    <!-- id字段必填对应接口中抽象方法名-->
    <!-- parameterType (可选配置, 默认为mybatis自动选择处理)
        将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理
        parameterType 主要指定参数类型,可以是int, short, long, string等类型(简单类型),也可以是复杂类型(如对象) -->
    <!--此处的别名已在config文件中将实体类全部包扩,将com.*.entity前缀简化-->
    <insert id="add" parameterType="Cart">
        insert into mall_cart(userid,goodsid,goodsnum,goodsprice,date)
        values(#{userId},#{goodsId},#{goodsNum},#{goodsPrice},#{date})
    </insert>
</mapper>

六.将映射文件配置到config文件中

  <!-- 加载映射文件-->
    <mappers>
        <mapper resource="com/woniu/mall/dao/CategoryMapper.xml" />
        <mapper resource="com/woniu/mall/dao/UserMapper.xml" />
    </mappers>

 

七.写入数据测试

@Test
    public void testAdd() {
     //读取mybatis-config.xml文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
     //初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     //创建一个session实例
        SqlSession session = sqlSessionFactory.openSession(); // 类似Connection
     //使用session.getMapper(**DAO.class)创建对应的DAO实例
        CategoryDAO dao = session.getMapper(CategoryDAO.class); // 会根据接口产生一个实现(动态代理)
        Category category = new Category();
        category.setName("生活");
        category.setStatus("1");
     //调用DAO接口中对应的抽象方法,实现数据的增删改查
        dao.add(category);
     //事务提交
        session.commit();   //提交,MyBatis默认不会提交事务

    }

 七.Service层的调用方式:

  1.将Session实例的产生封装为一个Utils类方法,

 

 

 

public class MallUtils {
  //产生一个静态 SqlSessionFactory,使用单例模式,SqlSessionFactory是创建SqlSession的工厂
    private static SqlSessionFactory sqlSessionFactory;
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
  //控制单个线程只产生一个session
    private static ThreadLocal<SqlSession> sessionThreadLocal=new ThreadLocal<>();
    public static SqlSession getSession(){
        if(sessionThreadLocal.get()==null){
            SqlSession session=sqlSessionFactory.openSession();
            sessionThreadLocal.set(session);
            return session;
        }
        return sessionThreadLocal.get();
    }
  //得到DAO实例
    public static <T> T getDAO(Class<T> c) {
        return getSession().getMapper(c);
    }
}

  2.业务逻辑层创建对应的Service

 

    

public class OrderService {
    /**
     * 添加订单,并加入订单详细,业务方法
     * @param order
     * @param orderDetils
     */
    public void add(Order order, List<OrderDetils> orderDetils){
        order.setOrderNo("wn002");
        order.setPayType("支付宝");
        //使用Utils类方法,得到对应DAO实例
        GoodsDAO goodsDAO= MallUtils.getDAO(GoodsDAO.class);
        BigDecimal totalMoney=new BigDecimal("0");
        for(OrderDetils detils:orderDetils){
            Goods goods=goodsDAO.getById(detils.getGoodsId());
            totalMoney=totalMoney.add(goods.getSalesPrice().multiply(new BigDecimal(String.valueOf(detils.getGoodsNum()))));
            detils.setGoodsPrice(goods.getSalesPrice());
        }
        order.setCost(totalMoney);
        order.setOrderDate(MallUtils.getNow());
        OrderDAO orderDAO = MallUtils.getDAO(OrderDAO.class);
        orderDAO.add(order);
        OrderDetilsDAO orderDetilsDAO=MallUtils.getDAO(OrderDetilsDAO.class);
        for (OrderDetils detils:orderDetils){
            detils.setOrderId(order.getId());
            orderDetilsDAO.add(detils);
        }
        //事务提交
        MallUtils.getSession().commit();
    }
}

 

posted @ 2020-06-14 19:00  木子李和三点水  阅读(236)  评论(0编辑  收藏  举报