初入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&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(); } }