mybatis学习笔记之mybatis注解配置详解
JavaAPI
既然你已经知道如何配置MyBatis和创建映射文件,你就已经准备好来提升技能了。MyBatis的JavaAPI就是你收获你所做的努力的地方。正如你即将看到的,和JDBC相比,MyBatis很大程度简化了你的代码而且保持简洁,很容易理解和维护。MyBatis3已经引入了很多重要的改进来使得SQL映射更加优秀。
MyBatis3构建在基于全面且强大的Java配置API上。该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础。
注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。
Mybatis常用注解对应的目标和标签如表所示:
@Insert @Update @InsertProvider @UpdateProvider @DeleteProvider
注解
目标
对应的XML标签
@CacheNamespace
类
@CacheNamespaceRef
类
@Results
方法
@Result
方法
@One
方法
@Many
方法
方法
方法
@Param
参数
N/A
@Options
方法
映射语句的属性
@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("InsertintoAuthor(username,password,email,address,phone)"+
"values(#{username},#{password},#{email},#{address},#{phone})")
@Options(useGeneratedKeys=true,keyProperty="authId",flushCache=false,timeout=10000)
publicvoidaddAuthor(Authorauthor);
//删除作者
@Delete("deletefromauthorwhereid=#{id}")
@Options(flushCache=false,timeout=10000)
publicvoiddeleteAuthor(@Param("id")intid);
提示: 调用方法前需要注册映射器:
sessionFactory.getConfiguration().addMapper(TestInteger.class);
或者在mapper.xml中配置
注册之后再获取mapper接口正常调用
(2)有需要自定义map的情况可以使用Results注解:
示例2
//查询所有作者信息
@Select("select*fromauthor")
@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")
}
)
publicListfindAuthors();
//查询某作者信息
@Select("select*fromauthorwhereid=#{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")
}
)
publicAuthorfindAuthorById(@Param("id")intid);
如果多个查询返回的结果集结构都一样,可以使用@ResultMap定义返回结构,使用该注解,你将不得不在你的映射文件中配置你的resultMap,而@ResultMap(value="名")即为映射文件中的resultMapID,如此一来,你需要在
示例3
SelfMapper.xml
//每行记录是一个hashmap...............
SelfMapper.java:
@Select("selecta.id,b.name,c.statefrom...........")
@ResultMap(value="selfMap")
publicListsel();//注意,返回的是List集合
完整案例
接口代码
packagecom.obtk.dao;
importjava.util.HashMap;
importjava.util.List;
importorg.apache.ibatis.annotations.Insert;
importorg.apache.ibatis.annotations.Options;
importorg.apache.ibatis.annotations.Result;
importorg.apache.ibatis.annotations.Results;
importorg.apache.ibatis.annotations.Select;
importcom.obtk.entitys.StudentEntity;
publicinterfaceIStudentDao{
@Insert("insertintoStudent(stuName,gender,age,address,deptIdd)"+
"values(#{stuName},#{gender},#{age},#{address},#{deptIdd})")
@Options(useGeneratedKeys=true,keyProperty="stuId")
intsaveOne(StudentEntitystu);
@Select("select*fromStudentwherestuId=#{stuId}")
@Results(
//只要配置和列名不一致的属性
value={
@Result(column="gender",property="sex")
}
)
StudentEntityqueryById(IntegerstuId);
@Select("select*fromStudentwheregender=#{qqq}andaddress=#{area}")
@Results(
//只要配置和列名不一致的属性
value={
@Result(column="gender",property="sex")
}
)
ListqueryByMany(HashMaptheMap);
//万能关联注解配置
@Select("select*fromstudentsinnerjoindepartmentd"
+"ons.deptIdd=d.deptId"
+"wheres.gender=#{sex}"
+"andd.departName=#{deptName}")
ListqueryByQnn(HashMaptheMap);
}
案例1 查询一个对象
packagecom.obtk.test;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importcom.obtk.dao.IStudentDao;
importcom.obtk.entitys.StudentEntity;
importcom.obtk.utils.MybatisUtil;
publicclassAnnoSelectOne{
publicstaticvoidmain(String[]args){
SqlSessionsession=null;
SqlSessionFactoryfactory=null;
try{
session=MybatisUtil.getSession();
factory=MybatisUtil.getFactory();
//把接口里面的sql配置和核心配置文件进行关联
factory.getConfiguration().addMapper(IStudentDao.class);
IStudentDaostuDao=session.getMapper(IStudentDao.class);
StudentEntitystu=stuDao.queryById(129);
System.out.println(stu.getStuName()+","+stu.getSex()
+","+stu.getAddress()+","+stu.getStuId());
}catch(Exceptione){
e.printStackTrace();
}finally{
MybatisUtil.closeSession();
}
}
}
案例2 传递多个参数,查询多个对象
packagecom.obtk.test;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importcom.obtk.dao.IStudentDao;
importcom.obtk.entitys.StudentEntity;
importcom.obtk.utils.MybatisUtil;
publicclassAnnoSelectMany{
publicstaticvoidmain(String[]args){
SqlSessionsession=null;
SqlSessionFactoryfactory=null;
try{
session=MybatisUtil.getSession();
factory=MybatisUtil.getFactory();
//把接口里面的sql配置和核心配置文件进行关联
factory.getConfiguration().addMapper(IStudentDao.class);
IStudentDaostuDao=session.getMapper(IStudentDao.class);
HashMapparamMap=newHashMap();
paramMap.put("qqq","男");
paramMap.put("area","学生宿舍");
ListstuList=stuDao.queryByMany(paramMap);
for(StudentEntitystu:stuList){
System.out.println(stu.getStuName()+","+stu.getSex()
+","+stu.getAddress()+","+stu.getStuId());
}
}catch(Exceptione){
e.printStackTrace();
}finally{
MybatisUtil.closeSession();
}
}
}
案例3 添加对象
packagecom.obtk.test;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importcom.obtk.dao.IStudentDao;
importcom.obtk.entitys.StudentEntity;
importcom.obtk.utils.MybatisUtil;
publicclassAnnoSaveTest{
publicstaticvoidmain(String[]args){
SqlSessionsession=null;
SqlSessionFactoryfactory=null;
try{
session=MybatisUtil.getSession();
factory=MybatisUtil.getFactory();
//把接口里面的sql配置和核心配置文件进行关联
factory.getConfiguration().addMapper(IStudentDao.class);
IStudentDaostuDao=session.getMapper(IStudentDao.class);
StudentEntitystu=newStudentEntity("testC#",
"男",21,"冥王星");
stu.setDeptIdd(10);
intresult=stuDao.saveOne(stu);
session.commit();
System.out.println("保存成功:"+stu.getStuId());
}catch(Exceptione){
e.printStackTrace();
}finally{
MybatisUtil.closeSession();
}
}
}
案例4 利用hashmap进行关联查询
packagecom.obtk.test;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importcom.obtk.dao.IStudentDao;
importcom.obtk.entitys.StudentEntity;
importcom.obtk.utils.MybatisUtil;
publicclassAnnoJoinQnn{
publicstaticvoidmain(String[]args){
SqlSessionsession=null;
SqlSessionFactoryfactory=null;
try{
//4.得到session
session=MybatisUtil.getSession();
factory=MybatisUtil.getFactory();
//把接口里面的sql配置和核心配置文件进行关联
factory.getConfiguration().addMapper(IStudentDao.class);
IStudentDaostuDao=session.getMapper(IStudentDao.class);
HashMapparamMap=newHashMap();
paramMap.put("sex","男");
paramMap.put("deptName","计算机系");
//5.执行语句
ListstuList=stuDao.queryByQnn(paramMap);
for(HashMaptheObj:stuList){
System.out.println(theObj.get("stuId")+","+theObj.get("gender")
+","+theObj.get("stuName")+","+theObj.get("departName"));
}
}catch(Exceptione){
e.printStackTrace();
}finally{
MybatisUtil.closeSession();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。