Mybatis执行SQL的两种方式:Sqlsession与Mapper接口

网上看了很多关于写mybatis的的简单教程,由于每个人都有不同思路与方法,最终执行的结果也不尽相同,导致了看过之后,自己对于mybatis的知识也是出于一知半解:
最终发现mybatis执行sql有两种方式:

第一种就是SqlSession发送Sql;
主要就是“配置文件(xml)+映射文件(mapper)+实体类(pojo)+测试类(test)”

Role role = (Role)sqlSession.selectOne("com.mybatis.mapper.RoleMapper.getRole",1L);

selectOne 方法表示使用查询并且只返回一个对象,而参数则是一个 String 对象和一个 Object 对象。这里是一个 long 参数,long 参数是它的主键。


String 对象是由一个命名空间加上 SQL id 组合而成的,它完全定位了一条 SQL,这样 MyBatis 就会找到对应的 SQL。如果在 MyBatis 中只有一个 id 为 getRole 的 SQL,那么也可以简写为:

Role role = (Role)sqlSession.selectOne("getRole",1L);

这是 MyBatis 前身 iBatis 所留下的方式。

第二种就是用 Mapper 接口发送 SQL;
主要就是“配置文件(xml)+映射文件(mapper)+实体类(pojo) + Dao(接口)+测试类(test)”

RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);

通过 SqlSession 的 getMapper 方法来获取一个 Mapper 接口,就可以调用它的方法了。因为 XML 文件或者接口注解定义的 SQL 都可以通过“类的全限定名+方法名”查找,所以 MyBatis 会启用对应的 SQL 进行运行,并返回结果。

对比两种发送 SQL 方式

上面分别展示了 MyBatis 存在的两种发送 SQL 的方式,一种用 SqlSession 直接发送,另外一种通过 SqlSession 获取 Mapper 接口再发送。笔者建议采用 SqlSession 获取 Mapper 的方式,理由如下:

使用 Mapper 接口编程可以消除 SqlSession 带来的功能性代码,提高可读性,而 SqlSession 发送 SQL,需要一个 SQL id 去匹配 SQL,比较晦涩难懂。使用 Mapper 接口,类似 roleMapper.getRole(1L)则是完全面向对象的语言,更能体现业务的逻辑。

使用 Mapper.getRole(1L)方式,IDE 会提示错误和校验,而使用 sqlSession.selectOne(“getRole”,1L)语法,只有在运行中才能知道是否会产生错误。

目前使用 Mapper 接口编程已成为主流,尤其在 Spring 中运用 MyBatis 时,Mapper 接口的使用就更为简单…

/*
*
*/
EX:

CRUD两种方法的相关写法:
首先是sql的相关mapper

<?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">


<!--注意这里的命名空间,这里的名字可以随便起的,但是如果要调用到sql语句的时候,相关参数,第一个为:命名空间.id名称,然后才是sql的参数;-->
<!--如果命名空间直接指向调用sql的类或者接口,相关参数,第一个可以省略掉,直接写id名称,因为mybatis会帮你自动识别-->
<mapper namespace="com.dmh.mapper.CategoryMapper">


    <select id="getCategory" parameterType="int" resultType="Category">
            select * from   category_  where id= #{id}
        </select>

    <select id="listCategory" resultType="Category">
            select * from   category_
        </select>

    <insert id="addCategory" parameterType="Category">
        insert into category_(id ,name ) values( #{id},#{name})
    </insert>


    <update id="updateCategory" parameterType="Category">
        update category_ set name=#{name} where id=#{id}
    </update>

    <delete id="deleteById" parameterType="Category">
        delete from category_ where id= #{id}
    </delete>

</mapper>

然后是pojo与mapper接口(接口仅仅是对于mapper方法而存在)

pojo

package com.dmh.pojo;

import java.util.List;

public class Category {
    private int id;
    private String name;
    List<Product> products;

    public int getId() {
        return id;
    }

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

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return  "Category : {id:" + id + ", name:" +name +", products:" + products+"}";
    }
}

mapper

package com.dmh.mapper;

        import com.dmh.pojo.Category;

        import java.util.List;

public interface CategoryMapper {

    /**
     * 查询
     *
     */

    public Category getCategory( int id );

    /**
     * 查询所有
     */
    public List<Category> listCategory ();

    /**
     * 添加一条数据
     */

    public void addCategory( Category category);
    /**
     * 修改一条数据
     */
    public  void  updateCategory( Category category);

    /**
     * 删除一条数据
     *
     */
    public  void deleteById( Category category);
}

接下来是针对sql的相关写法;
分别是session直接调用方法,或者mapper调用接口调用相关方法


//首先是加载配置文件,生产session,这个基本都是这样写的——
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();


//用mapper接口发送sql,接口实现Category生产一个categoryMapper对象;
//这里可以看到是一个接口实现session.getMapper()方法(所以说mapper接口的方法实际上也是间接在实现session的相关方法)
CategoryMapper categoryMapper = session.getMapper(CategoryMapper.class); 


/*
*
*  查询一条数据==========================================
*
*/

//这个是通过Sqlsession查询
Category category = (Category)session.selectOne("com.dmh.mapper.CategoryMapper.getCategory",1);
System.out.println(category);

//这个是通过mapper接口的实现类查询
Category category02 = categoryMapper.getCategory(1);
System.out.println(category02);


/*
*
*  查询所有数据==========================================
*
*/

List<Category> cs = session.selectList("listCategory");
   for (Category c : cs) {
      system.out.println(c);
   }

List<Category> category03 = categoryMapper.listCategory();
  for (Category c : category03) {
     System.out.println(c);
  }


/*
*
*  添加一条数据==========================================
*
*/

Category c = new Category();
c.setName("新增加的Category");

//这个是通过Sqlsession添加
session.insert("addCategory",c);

//这个是通过mapper接口的实现类添加
categoryMapper.addCategory(c);



/*
*
*  修改一条数据==========================================
*
*/
//这个是通过Sqlsession修改
Category cc= session.selectOne("getCategory",1);
cc.setName("修改了的Category名稱");
session.update("updateCategory",c);

//这个是通过mapper接口的实现类修改
Category cat = new Category();
cat.setName("这是一条修改后的数据");
cat.setId(1);
categoryMapper.updateCategory(cat);


/*
*
*  删除一条数据==========================================
*
*/

//这个是通过Sqlsession删除
Category cass = new Category();
cass.setId(6);
session.delete("deleteCategory",cass);

//这个是通过mapper接口的实现类修改
Category cass = new Category();
cass.setId(6);
categoryMapper.deleteById( cass );

可以阅读站长的相关资料——
http://how2j.cn/k/mybatis/mybatis-tutorial/1087.html
站长的CRUD使用的session的方法来实现的,我这里是采用的mapper接口的方法来实现的——;

基于java的语法规范与理解程度,建议使用mapper的方法便于理解——
虽然要多写一个mapper——

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值