【SSM】mybatis初见

准备:

  • JDK1.8
  • Eclipse
  • mybatis所需jar包
  • mysql驱动jar
    这里写图片描述

比起hibernate,mybatis要轻量得多(看jar包就知道[偷笑])

第一步:建立web项目,这里因为后期整合,就直接建立web项目。再就是导入上面提到的包了。建立测试数据库。这里就以mall的products和category为例了。
字段如下了:
category:
这里写图片描述
products
这里写图片描述

建立对应实体类(省略getter和setter):

这里写图片描述

这里写图片描述

第二步:在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>
<!-- 环境配置,默认为development,有详细的错误信息 -->
  <environments default="development">
  <!-- id不是绝对,可以区分多个环境配置,如不同平台数据库  -->
    <environment id="development">
    <!-- 事务管理配置,可选参数"JDBC"/"MANAGED",JDBC事务管理机制或者spring类型的web容器管理 -->
      <transactionManager type="JDBC"/>
      <!-- type可选参数,POOLED为连接池连接,UNPOOLED为非连接池链接 -->
      <dataSource type="POOLED">
      <!-- 数据库的连接配置 -->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mall"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 指定数据库操作映射文件 -->
  <mappers>
    <mapper resource="mapper/products-mapper.xml"/>
  </mappers>
</configuration>

第三步:配置数据库操作的映射文件以及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="products_dao.ProductsDao">
  <!-- 添加数据 -->
  <insert id="insertProducts" parameterType="entity.Products">
    insert  into products(pname,price,unitsOnStack) values(#{pname},#{price},#{unitsOnStack})
  </insert>
  <!-- 删除数据 -->
  <delete id="deleteProduct" parameterType="int">
    delete from products where pid = #{pid}
  </delete>
  <!-- 更新数据 -->
  <update id="updateProduct" parameterType="entity.Products">
    update products set pname = #{pname} where pid=#{pid}
  </update>

  <!-- 定义一个结果映射,这里包含了products和category的多对一关系 -->
    <resultMap type="entity.Products" id="product">
        <id column="pid" property="pid" javaType="java.lang.Integer" />
        <result column="pname" property="pname" javaType="java.lang.String" />
        <result column="price" property="price" javaType="java.lang.Double" />
        <result column="unitsOnStack" property="unitsOnStack" javaType="java.lang.Double" />
        <!--association配置多对一多方,实体内包含类型类-->
        <association property="category" column="cid"
            select="queryCategoryByID">
        </association>
    </resultMap>
    <!-- 这是category的结果映射,这里包含了category与products的一对多关系 -->
    <resultMap type="entity.Category" id="category">
        <id column="cid" property="cid" />
        <result column="cname" property="cname" />
        <!--collection配置多对一一方,实体内包含商品集合-->
        <collection property="products" column="cid" select="queryProductsByID"></collection>
    </resultMap>
    <!-- 包含两个表的联合结果映射product1 -->
    <resultMap type="entity.Products" id="product1">
        <id column="pid" property="pid" />
        <result column="pname" property="pname" />
        <association property="category" javaType="entity.Category">
            <id column="cid" property="cid" />
            <result column="cname" property="cname" />
            <collection property="products" resultMap="product1"></collection>
        </association>
    </resultMap>

    <!-- 通过id查询的结果映射到category -->
    <select id="queryCategoryByID" parameterType="int" resultMap="category">
        select * from category
        where cid=#{cid}
    </select>
    <!-- 通过id查询的结果映射到product -->
    <select id="queryProductsByID" resultMap="product"
        parameterType="int">
        select * from products where cid=#{cid}
    </select>
    <!-- 将查询的内容映射到product对应的结果映射  -->
    <select id="queryProducts" resultMap="product">
        select * from products
    </select>
      <!-- 将查询的内容映射到category对应的结果映射 -->
    <select id="queryCategory" resultMap="category">
        select * from category
    </select>
  <!-- 最后通过两个表的结果映射所得到的结果 -->
  <select id="queryProductsByUnion" resultMap="product1">
        select * from
        mall.products a left join mall.category b on a.cid=b.cid;
    </select>
  <!-- 动态查询 -->
  <select id="queryProductsByCondition" parameterType="entity.Products" 
  resultType="entity.Products">
  select * from products
  <!-- trim加where前缀和去掉重复的and -->
  <trim prefix="where" suffixOverrides="and">
        <if test="pname != null">
            pname = #{pname} and
        </if>
        <if test="price != null">
            price = #{price} and
        </if>
        <if test="unitsOnStack != null">
            unitsOnStack = #{unitsOnStack}
        </if>
  </trim>
  </select>
</mapper>

dao接口:

package products_dao;

import java.util.List;
import entity.Products;

public interface ProductsDao {
    List<Products> queryProducts();
    int insertProducts(Products pro);
    int deleteProduct(int pid);
    int updateProduct(Products pro);
    List<Products> queryProductsByUnion();
    List<Products> queryProductsByCondition(Products pro);
}

当 查询的数据不是实体类中存在,而是一些特殊业务场景,如联表统计销售额等等,使用返回值类型为map集合就很适合此时的业务,从而没有必要去建立一个实体类

第四步:测试

package test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

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 entity.Products;
import products_dao.ProductsDao;

public class PrdouctTest {
    public static void main(String[] args) throws IOException {
        String configPath = "mybatis-config.xml";
        //  读取配置
        Reader reader = Resources.getResourceAsReader(configPath);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(reader);
        SqlSession session = factory.openSession();

        //  查询
        //  通过接口映射所对应执行的sql语句
        ProductsDao dao = session.getMapper(ProductsDao.class);
        List<Products> list = dao.queryProducts();
        for (Products products : list) {
            System.out.println(products.getPname());
        }

        //  添加
        Products pro = new Products();
        pro.setPname("嘻嘻");
        pro.setPrice(4.0);
        pro.setUnitsOnStack(100.0);

        int rs = dao.insertProducts(pro);
        if(rs>0) {
            System.out.println("恭喜你插入成功");
        }else{
            System.out.println("恭喜你插入失败");
        }
        session.commit();

        // 删除
        int rs1 = dao.deleteProduct(9);
        if(rs1>0) {
            System.out.println("恭喜你删除成功");
        }else{
            System.out.println("恭喜你删除失败");
        }
        session.commit();

        // 更新
        Products pro1 = new Products();
        pro1.setPid(8);
        pro1.setPname("辣条");
        int rs2 = dao.updateProduct(pro1);
        if(rs2>0) {
            System.out.println("恭喜你修改成功");
        }else{
            System.out.println("恭喜你修改失败");
        }
        session.commit();

        // 联表查询
        List<Products> list1=dao.queryProductsByUnion();
        for(Products pro2:list1){
            System.out.println(pro2.getPid()+"  "+pro2.getCategory().getCname());
        }

        // 动态查询
        Products pro3 = new Products();
        pro.setPname("辣条");
        List<Products> list2=dao.queryProductsByCondition(pro3);
        System.out.println(list2.size());

    }
}

写的比较仓促,基本用法都有了。有时间再补充一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值