现在主流的框架就是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表达式
- if标签:判断语句,用于进行逻辑判断的。
- choose标签:条件选择 otherwise子标签:当所有条件都不满足时,才会执行该条件。when子标签:编写条件,不管有多少个when条件,一旦其中一个条件成立,后面的when条件都不执行。
- where标签::用于sql动态条件拼接,可以自动将动态sql中多出来的一个and或者or去除。
- set标签:可以自动添加一个set关键字,并且会将动态sql最后多余的逗号去除。
- foreach标签:遍历集合
Mybatis的动态代理,很重要!
Mybatis的强大之处有很多,其中动态代理就是其中一个。
我们的按照Mybatis的动态代理方式编写接口,那么我们的实现类由Mybatis自动生成(即动态代理对象)
需要遵循一些规范:
- 映射文件中的命名空间与Mapper接口的全路径一致
- 映射文件中的statement的Id与Mapper接口的方法名保持一致
- 映射文件中的statement的ResultType必须和mapper接口方法的返回类型一致
Mapper接口中是否可以有重载的方法?
注意:由于使用的是接口方式进行查询(动态代理),而其它要求映射文件中的statement的Id与Mapper接口的方法名保持一致。
而statement的id由于是唯一的不能重复,因此也就意味着接口中的方法也不能重名,那也就是说不能有重载的方法了。