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(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。