mybatis系列十一:mybatis注解配置

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





  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御前两把刀刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值