微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2021-05-01 MyBatis 基于注解形式的开发

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 举报,一经查实,本站将立刻删除。