• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
删库然后跑路
博客园    首页    新随笔    联系   管理    订阅  订阅

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";
      InputStream in= Resources.getResourceAsStream(config);
    SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
      SqlSession sqlSession=factory.openSession();
       
      //动态代理使用接口
      dao接口 dao=sqlSession.getMapper(dao接口.class);
  List<Objects>Objects=dao.selectObjects();
          }
       

 

posted @ 2022-01-20 18:06  删库然后跑路  阅读(115)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3