当前位置: 移动技术网 > IT编程>开发语言>Java > mybatis学习笔记之mybatis注解配置详解

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

2019年07月19日  | 移动技术网IT编程  | 我要评论
java api 既然你已经知道如何配置 mybatis 和创建映射文件,你就已经准备好来提升技能了。 mybatis 的 java api 就是你收获你所做的努力的地方

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

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网