SSM框架(一)-----------持久层Mybatis框架

      现在主流的框架就是ssm框架,那么我们的ssm具体是怎么实现的?下面我先来说说mybatis框架。

什么是mybatis框架?

Mybatis原名叫做Ibatis,在2010年6月被谷歌托管,更名为Mybatis。Mybatis是一个半自动化的基于SQL的ORM(Object-Relation Mapping)持久层框架,支持普通的sql查询,它简化了对关系数据库的使用。其主要就完成2件事情:
1、封装JDBC操作
2、利用反射打通Java类与SQL语句之间的相互转换

Mybatis的执行流程是什么?

pom.xml里面导入mybatis的依赖

1,加载配置, 获取全局配置文件输入流:我们主要的配置有全局配置文件,配置了mybatis的运行环境信息。一般情况下,我们的JDBC都是配置在这里面,jdbc配置数据库驱动,url,username,password。在全局配置文件里面还有一个配置映射文件:用来配置sql语句和结果集类型等。

     InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

2,通过全局配置文件的输入流获取SqlSessionFactory

      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

3,通过sqlSessionFactory来获取我们的sqlsession

      SqlSession sqlSession = sqlSessionFactory.openSession();

4,、通过SqlSession的调用,操作crud

5、关闭SqlSession,释放资源。    sqlSession.close();

 

配置映射文件的注意事项

一,编写crud的statement标签:

 <select/> 查询 

<select id="queryUserById" resultType="cn.itcast.pojo.User">

    select * from tb_user where id = #{id}

  </select>

       select:编写查询语句

       id:语句的唯一标识

       resultType:配置返回的结果集类型

 

下面的基本一样,只写一个select作个参考

<update/> 更新

<insert/> 插入

<delete/>删除

二,参数的传递是怎么样实现的

①传递单个参数:#{}就相当于一个 ?,可以进行预编译的占位。在一个参数的情况下#{id}中的id可以修改成任意字符

②传递多个参数:通常在方法的参数列表上加上一个注解@Param(“xxxx”) 表示参数的名字,然后通过${“xxxx”}或#{“xxxx”}获取参数

三,#{}  和  ${} 的区别

很简单,就是能不能sql注入问题。

#{}:它主要起到占位符的作用,没法 进行sql注入

${} :它就不是占位符,在正常情况下也可以传递参数,但是一旦使用了我们的前端页面标签,那么就可以进行sql注入,影响我们预期的目的。

四,动态sql的编写

test属性:编写ognl表达式

  1. if标签:判断语句,用于进行逻辑判断的。
  2. choose标签:条件选择       otherwise子标签:当所有条件都不满足时,才会执行该条件。when子标签:编写条件,不管有多少个when条件,一旦其中一个条件成立,后面的when条件都不执行。
  3.  where标签::用于sql动态条件拼接,可以自动将动态sql中多出来的一个and或者or去除。
  4. set标签:可以自动添加一个set关键字,并且会将动态sql最后多余的逗号去除。
  5. foreach标签:遍历集合

Mybatis的动态代理,很重要!

Mybatis的强大之处有很多,其中动态代理就是其中一个。

我们的按照Mybatis的动态代理方式编写接口,那么我们的实现类由Mybatis自动生成(即动态代理对象)

需要遵循一些规范:

  1. 映射文件中的命名空间与Mapper接口的全路径一致
  2. 映射文件中的statement的Id与Mapper接口的方法名保持一致
  3. 映射文件中的statement的ResultType必须和mapper接口方法的返回类型一致

Mapper接口中是否可以有重载的方法?

注意:由于使用的是接口方式进行查询(动态代理),而其它要求映射文件中的statement的Id与Mapper接口的方法名保持一致。

而statement的id由于是唯一的不能重复,因此也就意味着接口中的方法也不能重名,那也就是说不能有重载的方法了。

猜你喜欢

转载自blog.csdn.net/weixin_41491254/article/details/81428424