mybatis学习笔记之mybatis注解配置详解

 更新时间:2017年12月11日 11:40:50   作者:御前两把刀刀  
本篇文章主要介绍了mybatis学习笔记之mybatis注解配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Java API

既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了。 MyBatis 的 Java API 就是你收获你所做的努力的地方。正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护。MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀。

MyBatis 3构建在基于全面且强大的Java配置API上。该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础。

注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。

Mybatis常用注解对应的目标和标签如表所示:

注解 目标 对应的XML标签
@CacheNamespace <cache>
@CacheNamespaceRef <cacheRef>
@Results 方法 <resultMap>
@Result 方法

<result>

<id>
@One 方法 <association>
@Many   方法 <collection>

@Insert

@Update

@Delete
方法

<insert>

<update>

<delete>

@InsertProvider

@UpdateProvider

@DeleteProvider

@SelectProvider
方法

<insert>

<update>

<delete>

<select>

允许创建动态SQL
@Param  参数 N/A
@Options  方法 映射语句的属性
@select 方法 <select>

Mybatis常用注解的含义:

@CacheNamespace(size = 512):定义在该命名空间内允许使用内置缓存

@Options(useCache = true, flushCache = false, timeout = 10000):一些查询的选项开关

@Param("id"):全局限定别名,定义查询参数在sql语句中的位置不再是顺序下标0,1,2,3......的形式,而是对应名称,该名称在此处定义。 

@Results是以@Result为元素的数组,@Result表示单条属性——字段的映射关系,id = true表示该id字段是主键,查询时mybatis会给予必要的优化。数组中所有的@Result组成了单个记录的映射关系,而@Results则是单个记录的集合。另外,还有一个非常重要的注解@ResultMap,其与@Results类似

@Select("查询语句")、@Insert("增加语句")、@Update("更新语句")和@Delete("删除语句")表示对数据进行查询、添加、更新和删除的操作。

接下来,咱们来看一下注解的使用。

(1)   常规注解使用(不需要自定义map的操作):

示例1

//添加作者
@Insert("Insertinto Author(username,password,email,address,phone) " +
"values(#{username},#{password},#{email},#{address},#{phone})")
@Options(useGeneratedKeys=true,keyProperty="authId",flushCache= false, timeout = 10000)
public voidaddAuthor(Author author);
  //删除作者
@Delete("deletefrom author where id = #{id}")
@Options(flushCache= false, timeout = 10000)
public voiddeleteAuthor(@Param("id") int id);

提示:  调用方法前需要注册映射器:

sessionFactory.getConfiguration().addMapper(TestInteger.class);

或者在mapper.xml中配置<mapper class="映射器接口路径"></mapper>

注册之后再获取mapper接口正常调用

(2)有需要自定义map的情况可以使用Results注解:

示例2

//查询所有作者信息
@Select("select * from author")
@Options(flushCache = false, timeout = 10000,useCache=true)
@Results(
 value = {
  @Result(id=true,column="id",property="id"),  
@Result(property="username",column="username"),  
@Result(property="password",column="password"),  
@Result(property="email",column="email"),   
@Result(property="address",column="address"),
  @Result(property="phone",column="phone")
 }
)
public List<Author> findAuthors();
//查询某作者信息
@Select("select * from author where id =#{id}")
@Options(flushCache = false, timeout =10000,useCache=true)
@Results(
 value = {@Result(id=true,column="id",property="id"),
   @Result(property="username",column="username"),
   @Result(property="password",column="password"),  
@Result(property="email",column="email"),
@Result(property="address",column="address"),  
@Result(property="phone",column="phone")
  }
)
public Author findAuthorById(@Param("id") intid);

如果多个查询返回的结果集结构都一样,可以使用@ResultMap定义返回结构,使用该注解,你将不得不在你的映射文件中配置你的resultMap,而@ResultMap(value = "名")即为映射文件中的resultMap ID,如此一来,你需要在<mapper>中注册你的配置文件,在接口中使用@ResultMap来引用配置文件中的resultMap ID如下:

示例3

SelfMapper.xml

 //每行记录是一个hashmap
<resultMaptype="java.util.HashMap" id="selfMap">
  <resultproperty="n" column="city_name" />
      ...............
</resultMap>

SelfMapper.java:

@Select("select a.id,b.name,c.state from...........")
@ResultMap(value="selfMap")
public List<HashMap> sel();//注意,返回的是List集合

完整案例

接口代码

package com.obtk.dao; 
import java.util.HashMap; 
import java.util.List; 
import org.apache.ibatis.annotations.Insert; 
import org.apache.ibatis.annotations.Options; 
import org.apache.ibatis.annotations.Result; 
import org.apache.ibatis.annotations.Results; 
import org.apache.ibatis.annotations.Select; 
import com.obtk.entitys.StudentEntity; 
public interface IStudentDao { 
 @Insert("insert into Student(stuName,gender,age,address,deptIdd)"+ 
   "values(#{stuName},#{gender},#{age},#{address},#{deptIdd})") 
 @Options(useGeneratedKeys=true,keyProperty="stuId") 
 int saveOne(StudentEntity stu); 
  
 @Select("select * from Student where stuId=#{stuId}") 
 @Results( 
  //只要配置和列名不一致的属性 
  value={ 
   @Result(column="gender",property="sex") 
  } 
 ) 
 StudentEntity queryById(Integer stuId); 
  
 @Select("select * from Student where gender=#{qqq} and address=#{area}") 
 @Results( 
  //只要配置和列名不一致的属性 
  value={ 
   @Result(column="gender",property="sex") 
  } 
 ) 
 List<StudentEntity> queryByMany(HashMap theMap); 
  
 //万能关联注解配置 
 @Select("select * from student s inner join department d" 
   +" on s.deptIdd=d.deptId" 
   +" where s.gender=#{sex}" 
   +" and d.departName=#{deptName}") 
 List<HashMap> queryByQnn(HashMap theMap); 
  
} 

案例1   查询一个对象

package com.obtk.test; 
import org.apache.ibatis.session.SqlSession; 
import org.apache.ibatis.session.SqlSessionFactory; 
import com.obtk.dao.IStudentDao; 
import com.obtk.entitys.StudentEntity; 
import com.obtk.utils.MybatisUtil; 
public class AnnoSelectOne { 
 public static void main(String[] args) { 
  SqlSession session=null; 
  SqlSessionFactory factory=null; 
  try { 
   session=MybatisUtil.getSession(); 
   factory=MybatisUtil.getFactory(); 
   //把接口里面的sql配置和核心配置文件进行关联 
   factory.getConfiguration().addMapper(IStudentDao.class); 
   IStudentDao stuDao=session.getMapper(IStudentDao.class); 
   StudentEntity stu=stuDao.queryById(129); 
   System.out.println(stu.getStuName()+","+stu.getSex() 
     +","+stu.getAddress()+","+stu.getStuId()); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  }finally{ 
   MybatisUtil.closeSession(); 
  } 
 } 
} 

案例2   传递多个参数,查询多个对象

package com.obtk.test; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import org.apache.ibatis.session.SqlSession; 
import org.apache.ibatis.session.SqlSessionFactory; 
import com.obtk.dao.IStudentDao; 
import com.obtk.entitys.StudentEntity; 
import com.obtk.utils.MybatisUtil; 
public class AnnoSelectMany { 
 public static void main(String[] args) { 
  SqlSession session=null; 
  SqlSessionFactory factory=null; 
  try { 
   session=MybatisUtil.getSession(); 
   factory=MybatisUtil.getFactory(); 
   //把接口里面的sql配置和核心配置文件进行关联 
   factory.getConfiguration().addMapper(IStudentDao.class); 
   IStudentDao stuDao=session.getMapper(IStudentDao.class); 
   HashMap paramMap=new HashMap(); 
   paramMap.put("qqq", "男"); 
   paramMap.put("area", "学生宿舍"); 
   List<StudentEntity> stuList=stuDao.queryByMany(paramMap); 
   for(StudentEntity stu :stuList){ 
    System.out.println(stu.getStuName()+","+stu.getSex() 
      +","+stu.getAddress()+","+stu.getStuId()); 
   } 
  } catch (Exception e) { 
   e.printStackTrace(); 
  }finally{ 
   MybatisUtil.closeSession(); 
  } 
 } 
} 

案例3   添加对象

package com.obtk.test; 
import org.apache.ibatis.session.SqlSession; 
import org.apache.ibatis.session.SqlSessionFactory; 
import com.obtk.dao.IStudentDao; 
import com.obtk.entitys.StudentEntity; 
import com.obtk.utils.MybatisUtil; 
public class AnnoSaveTest { 
 public static void main(String[] args) { 
  SqlSession session=null; 
  SqlSessionFactory factory=null; 
  try { 
   session=MybatisUtil.getSession(); 
   factory=MybatisUtil.getFactory(); 
   //把接口里面的sql配置和核心配置文件进行关联 
   factory.getConfiguration().addMapper(IStudentDao.class); 
   IStudentDao stuDao=session.getMapper(IStudentDao.class); 
   StudentEntity stu=new StudentEntity("testC#", 
     "男", 21, "冥王星"); 
   stu.setDeptIdd(10); 
   int result=stuDao.saveOne(stu); 
   session.commit(); 
   System.out.println("保存成功:"+stu.getStuId()); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  }finally{ 
   MybatisUtil.closeSession(); 
  } 
 } 
} 

案例4    利用hashmap进行关联查询

package com.obtk.test; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import org.apache.ibatis.session.SqlSession; 
import org.apache.ibatis.session.SqlSessionFactory; 
import com.obtk.dao.IStudentDao; 
import com.obtk.entitys.StudentEntity; 
import com.obtk.utils.MybatisUtil; 
 
public class AnnoJoinQnn { 
 public static void main(String[] args) { 
  SqlSession session=null; 
  SqlSessionFactory factory=null; 
  try { 
   //4.得到session 
   session=MybatisUtil.getSession(); 
   factory=MybatisUtil.getFactory(); 
   //把接口里面的sql配置和核心配置文件进行关联 
   factory.getConfiguration().addMapper(IStudentDao.class); 
   IStudentDao stuDao=session.getMapper(IStudentDao.class); 
   HashMap paramMap=new HashMap(); 
   paramMap.put("sex", "男"); 
   paramMap.put("deptName", "计算机系"); 
   //5.执行语句 
   List<HashMap> stuList=stuDao.queryByQnn(paramMap); 
   for(HashMap theObj : stuList){ 
    System.out.println(theObj.get("stuId")+","+theObj.get("gender") 
      +","+theObj.get("stuName")+","+theObj.get("departName")); 
   } 
  } catch (Exception e) { 
   e.printStackTrace(); 
  }finally{ 
   MybatisUtil.closeSession(); 
  } 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java调用微信客服消息实现发货通知的方法详解

    Java调用微信客服消息实现发货通知的方法详解

    这篇文章主要介绍了Java调用微信客服消息实现发货通知的方法,结合实例形式详细分析了java针对微信接口调用的原理、调用方法与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • springboot集成es插入和查询的简单使用示例详解

    springboot集成es插入和查询的简单使用示例详解

    这篇文章主要介绍了springboot集成es 插入和查询的简单使用,本文分步骤结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java获取泛型实际类型的方法详解

    Java获取泛型实际类型的方法详解

    这篇文章主要介绍了Java获取泛型实际类型的方法详解,泛型,即“参数化类型”,一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数,需要的朋友可以参考下
    2023-11-11
  • 学习java编程后可以走哪些职业道路

    学习java编程后可以走哪些职业道路

    在本篇文章里给大家介绍了关于学习java后的职业道路,以及需要学习的相关知识内容,有兴趣的朋友们可以跟着学习下。
    2022-11-11
  • Springboot+Flowable 快速实现工作流的开发流程

    Springboot+Flowable 快速实现工作流的开发流程

    这篇文章主要介绍了Springboot+Flowable 快速实现工作流的开发流程,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • SpringBoot中定义Bean的方法总结

    SpringBoot中定义Bean的方法总结

    在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础,pring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势,本文将介绍Spring Boot中定义Bean的几种常见方式,需要的朋友可以参考下
    2023-12-12
  • Java连接MYSQL数据库的详细步骤

    Java连接MYSQL数据库的详细步骤

    这篇文章主要为大家介绍了Java连接MYSQL数据库的详细步骤,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • IDEA打开java项目后里面的java文件不能运行解决办法

    IDEA打开java项目后里面的java文件不能运行解决办法

    这篇文章主要给大家介绍了关于IDEA打开java项目后里面的java文件不能运行的解决办法,有时候想运行别人的项目,但是别人的项目并非IDEA项目(甚至只有源码),当我们打开项目时候,并不能运行,需要的朋友可以参考下
    2023-10-10
  • java编程简单获取图片像素的方法

    java编程简单获取图片像素的方法

    这篇文章主要介绍了java编程简单获取图片像素的方法,涉及Java针对图片的读取与属性获取技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 启动 Eclipse 弹出 Failed to load the JNI shared library jvm.dll 错误的解决方法

    启动 Eclipse 弹出 Failed to load the JNI shared library jvm.dll

    这篇文章主要介绍了有时候,新电脑上回碰到打开Eclipse时,弹出提示“Failed to load the JNI shared library jvm.dll”错误,这里给大家分享解决方案
    2016-08-08

最新评论