欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-22 13:21:53
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(); 
  } 
 } 
} 

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