MyBatis 基于注解形式的开发
两个xml文件
configuration--配置信息 driver url username password
mapper---------sql语句 <insert> <delete>
两个好处
1.写完程序后还可更改(执行项目时候 修改几乎不会产生)
2.一个ma pper文件 StudentMapper.xml 语句(CURD)在一起(语句在一起便于管理)
不好的地方
1.文件本身的结构比较复杂
2.文件中的sql与DAO方法不在一起------开发者觉得写起来更方便的
注解方式
为了弥补XML文件的不好方式
1.写在方法上面(sql+DAO方法 绑定在一起 开发者写起来更加方便)
2.注解通常就一行(比原来的xml形式简单 一对多 一对一 多对多关系也不是很简单)
需要注意
注解本身我们是调用不到的----底层需要通过反射技术来解析
如果想要使用注解方式执行----必须依托于Mapper代理
DAO类是普通的 dao中需要sqlSession对象属性 + mapper.xml
DAO类是接口 dao中不需要对象属性 + mapper.xml
DAO类是接口 + 注解形式
提供sqlSession和mapper的类
public class MyUtil {
private static sqlSessionFactory factory = new sqlSessionFactoryBuilder().build(Thread.currentThread().getContextClassLoader().getResourceAsstream("configuration.xml"));
public static sqlSession getsqlSession(boolean flag){
return factory.openSession(flag);
}
public static <T>T getMapper(Class clazz,boolean flag){
return (T)getsqlSession(flag).getMapper(clazz);
}
}
configuration.xml配置文件中mapper标签应该是类而不是xml文件了
<mappers>
<mapper class="dao.AtmDao"/>
</mappers>
dao类是一个接口了
public interface AtmDao {
//方法的底层有一个代理 帮我们执行这个方法该做的事情
//分析方法 方法名字delete 方法参数sid
//分析mapper.xml 类名字dao.StudentDao---namespace
// 方法名字delete----------id
// mapper的<delete>-------sql语句
// 语句上面有参数#{key}-----利用方法传递的sid参数进行匹配
// 代理对象会根据标签<delete> 调用原来sqlSession对象中的delete方法
//类方法名和sql之间的对应关系 找到sql 知道sql上面的信息 执行哪个方法
//如果将原有的xml文件删掉 改成注解的形式
//1.类 方法名和sql对应关系就简单了
//2.注解中的信息肯定需要写sql
//3.执行底层的哪个对应方法-----注解名字类似以前的标签名 为了找寻底层方法用的
// Insert Delete Update Select
@Delete(value = {"delete from atm where username=#{username}"})
void delete(String username);
@Insert("insert into atm values(#{username},#{password},#{money})")
void insert(Atm atm);
@Update("update atm set money=459")
void update();
}
service中获取dao的方式发生改变了
private AtmDao atmDao = MyUtil.getMapper(AtmDao.class,true);
dao中方法参数的处理
1.当方法中只有一个参数时,参数的名字可以和sql语句中{}中的值不相同
2.可以传递对象
3.可以传递map集合
4.如果方法中有好多参数,即没有组合成对象或map集合,有两种解决办法
4.1.sql中将原来的#{key}—#{param1} #{param2}
@Insert("insert into atm values(#{param1},#{param2},#{param3})")
void insert(String username,String password,Float mooney);
4.2.方法的每一个参数前面 添加@Param(“key”) 注解的key与sql#{key} 对应
@Insert("insert into atm values(#{username},#{password},#{money})")
void insert(@Param("username")String aaa,@Param("password")String bbb,@Param("money")Float ccc);
public interface PersonDao {
@Select("select * from person where pid=#{pid}")
@Results(id="selectOne",
value = {
//id=true表示是主键
@Result(id=true,property = "pid",column = "pid"),
@Result(property = "pname",column = "pname"),
//one=@One(select="")表示查询一个对象
//many = @Many(select="")表示查询好多对象
//one=@One(select="yyy")里面的select值是辅助方法的名字
//fetchType = FetchType.LAZY设置懒加载
//fetchType = FetchType.DEFAULT默认的.表示不懒加载
@Result(property = "idCard",column = "cardid",javaType = IDCard.class,one=@One(select="yyy",fetchType = FetchType.DEFAULT))
}
)
Person selectOne(Integer pid);
@Select("select * from idcard where cardid=#{cardid}")
IDCard yyy(String cardid);
@Select("select * from person")
@ResultMap("selectOne")
List<Person> selectAll();
}
知识回顾
@Insert @Delete @Update
@Param
@ResultMap
@Results(id="规则名",value={
@Result(property="",column="",id=true),
@Result(property="",column=""),
@Result(property="",column=""),
@Result(property="",javaType=XXX.class,column="",one=@One(select="方法名",fetchType=FetchType.LAZY)),
})
@Select("select * from xxx where xxx = #{key}")
public Person selectOne(String key);
@Select("")
public IDCard selectIDCard();
============================================================================
EMP(员工) DEPT(部门)
知识回顾
#{} ${}
@Insert("sql") @Delete("sql") @Update("sql")
@Param("key")
@Select("sql")
@Results()
@Result()
@One()
@Many()
@ResultMap("")
@Results(id="",value={@Result(),@Result})
@Result(property="",column="",id=true)
@Result(property="",column="")
@Result(property="",column="",one=@One(select=""))
@Result(property="",column="",many=@Many(select=""))
========================================================================
多对多关联查询
dao接口+注解方式
dao接口+mapper.xml形式
基于注解的方式实现"动态sql" 自己做了判断 拼接sql
基于注解开发 实现动态sql
dao接口(底层代理)
mapper.xml Annotation
将原有的mapper.xml形式文件---->替换成基于注解开发
原有的configuration.xml中告知扫描注解
<mapper resource>-->基于mapper.xml
<mapper class>----->基于注解
<select id="" resultType="" | resultMap="">
<delete id=""> <insert id=""> <update id="">
<where> <if> <foreach>
@Param("key")
@Results(id="",value={@Result(one=@One()),@Result(many=@Many(select=""))})
@Select("sql")
@Insert("sql") @Delete("sql") @Update("sql")
@SelectProvider(type=XXX.class,method="")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。