网上看了很多关于写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——