mybatis个人整理
三层架构
三层架构概念:
    界面层,业务逻辑层,数据访问层
三层架构对应的包:
    界面层:controller包(servlet)
    业务逻辑层:service包(service)
    数据访问层:dao包(dao)
    
三层架构对应的框架
    界面层:servlet-springmvc框架
    业务逻辑层:service类-spring框架
    数据访问层:dao类-mybatis框架
MyBatis的使用
1,创建数据库
2,加入maven依赖,和mysql依赖
3,创建与数据库表对应的实体类----用来保存表中的数据
4,创建dao持久层--自定义操作数据库的方法
5,创建mybatis的sql映射文件:
            1,在dao接口所在的目录
            2,文件名称和dao接口保持一致
6,创建mybatis的主配置文件:
            1,一个项目就一个主配置文件
            2,主配置文件里面写的是sql映射文件位置,和数据库连接信息
7,创建测试类
SQL映射文件
<!--namepace 叫命名空间,唯一值,可以自定义-->
<mapper namespace="要求和dao接口全限定名称一样">
    <select id='' resultType='返回值'>
        查询
    </select>
    <update id='' resultType='范胡子'>
        更新
    </undate>
    <insert id=''>
        插入
        insert into table values(#{此处要跟实体类属性名一样})
    </insert>
    <delete id='' resultType='范胡子'>
        删除
    </delete>
</mapper>
主配置文件
<configuration(配置)>
    <environments(环境) default="连接数据库的id/环境名称">
        <environments id='自定义,唯一值,表示环境的名称'>
            <transactionManager(事务) type="mybatis事务类型"/>
           
        </environments>
    </environments>
    <mappers>
            <mapper resource="sqlxml映射文件位置,
                              从target/classess开始,
                              演示:org/one/mybatis.xml"/>
    </mappers>
</configuration>
测试
public class one{
    public static void main (String[]args){
        //InputStream:输入流     Resources:资源
        //Session:会话   Factory:工厂  Builder:模式,生成器
    
    //读取主配置文件    
    InputStream in=resources.getResourcesAsStream(这里写主配置文件位置);
        
    //创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
    
    /**
    *   重要对象,创建使用资源较多,一个就够了
    *   说明,sqlsessionFactory的实现类是DefaultSqlSessionFactoty
    *   作用:获取sqlsession对象
    */
    SqlSessionFactory factory=builder.build(in);
    
    /**
    *   方法说明:
    *   factory.openSession(false);获取非自动提交的事物
    *   factory.openSession(true);获取自动提交的事物
    *   默认是false
    *   
    *   sqlsession的实现类是DefaultSqlSession
    *   sqlsession的接口定义了 selectOne(),selectList(),insert(),
    *   update(),delete(),rollback(),commit()方法
    *
    *   方法注意事项
    *   sqlsession不是线程安全的,需要在方法内部使用,
    *   在执行sql语句之后,需要关闭它。sqlsession.close();
    *                           这样可以保证线程安全
    */
   SqlSession  sqlSession=factory.openSession(这里可以写布尔类型参数);
   返回结果=sqlSession.selectList(sql映射文件的namespace.sql语句的id);
    }
}
SQL注意事项
1,mybatis不是自动提交事务的:
    在使用除了select以外都要手动提交一下:sqlseeion.commit
配置日志
STDOUT:标准输出     LOGGING:日志
<!--settings是控制mybatis全局行为-->
<settings>
    <stting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
动态代理
使用动态代理条件
1,dao接口全限定名称和sql映射文件中的namespace相同
2,dao接口中的方法和sql映射文件中的sql语句标签中id值相同
3,通过dao接口方法返回值也可以确定sqlsession将调用的方法
    如果返回值是list那么就调用sqlsession.selectList()方法
    如果返回值是int,或者是非list的,那么看sql语句xml映射文件标签
        标签是insert,update就会调用insert。update   
        
mybatis动态代理原理:
        mybatis根据你的dao接口,创建出一个dao接口实现类,并创建这个类的对象,
        完成sqlsession调用方法,访问数据库。
个人理解
原本是主配置文件,mapper文件,还有就是调用具体的sql语句,不使用动态代理的话,
那么就是需要我们把每个sql方法调用封装好:
        我们需要指定他执行哪个mapper文件中哪个语句,sqlsession调用什么方法。
        List<Object>o=sqlsession.selectList(要执行的映射文件的语句);
        然后把这样的一个个方法封装成具体的方法,
封装:public class fengzhuang{
            public List<Student>selectObjects() {
                String config="mybatis.xml";
                InputStream in= Resources.getResourceAsStream(config);
                SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();    
                SqlSessionFactory factory=builder.build(in);    
                 SqlSession sqlSession=factory.openSession();
                 List<Objects>Objects=qlSession.selectList(mapper限定名称.sql语句id);
                 return Objects
               }
            public static void main(String[]args){
                fengzhuang f=new fengzhuang();
                List<Objects>Objects=f.selectObjects();
            }       
           
            
}
    
    使用动态代理后呢
    这个类不需要实现了。
        public static void main(String[]args){
                String config="mybatis.xml";