MyBatis初学心得和收获总结
下面的文章是我之前单纯的对MyBatis快速入门简单写的一篇文章,大伙可以看我的另一篇
SSM之MyBatis框架的学习(上学期学的过于浅薄,复习加持续学习中,持续更新中) - -她的梦- - 博客园 (cnblogs.com)
首先MyBatis是一个优秀的大型持久层框架,用于简化JDBC的开发,javaee分为表现层、业务层和持久层三层架构。框架是一个半成品软件。
利用MyBatis可以简化JDBC的书写,在后续的开发过程中可以解决硬编码问题(即需要在java代码内部去修改信息,比如修改url,数据库,更或者说是sql语句)。
我们知道JDBC是甲骨文公司提供的标准化接口,不同的数据库厂商提供不同的jar驱动包,也就是编写具体的类去实现接口,对于Mysql数据库来说,在书写过程中需要构建Collection对象,再通过Preparedment对象来操作sql语句,最后再执行对应的方法来实现sql语句的执行。
首先是使用MyBatis,如果在普通的项目内想使用,就要导入对应的jar包,要使用 MyBatis, 只需将 mybatis.xxx.jar 文件置于类路径(classpath)中即可。
而在这里我用的是maven项目,所以需要在pom.xml文件下导一下jar包即可。
而MyBatis是通过xml文件来书写jdbc代码,如下是我的Mybatis实现增删改查的一个整体页面。
首先在我的resource目录下有一个mybatis-config.xml文件,主要内容都存放在<configuration>标签内部,其中存放的数据库的连接信息,包括用户名,密码,url信息,放在datasource标签下。
mapper标签下存储的是映射文件的信息,比如BrandMapper.xml文件
第二步需要创建一个表,在这里我将tb_brand表放在的mybatis数据库下。
然后需要写一个Javabean类,里面的字段名需要和数据库的列名相等,如果不相等需要在映射文件里面改名。写好get set方法和重写tostring方法。
第三步是需要写我们的接口,我们这里直接使用了Mapper代理的方式,因为原生的Mybatis写法也存在硬编码问题。接口名应定义为操作数据库表的一系列名字,比如selectAll等等。在这里需要重点注意,我的BrandMapper文件需要和我们下一步创建的映射文件在同一目录下,编译和运行之后会生成对应的target文件,若想实现MyBatis,就必须要这么做,在target文件里能看到接口对应的字节码文件和我们的映射配置文件在同一目录下。总结:使用Mapper代理的方式就必须要接口名和映射文件名一样,并且在同一目录下。
最后需要书写的是我们的映射文件,在这里我以BrandMapper.xml为例。
sql语句需要以标签的形式写在Mapper标签的包裹之内。<mapper>标签的属性有namespace,如果用mapper代理的方式开发命名空间应该为完整的路径。
<mapper namespace="com.itheima.mapper.BrandMapper">
接着是sql语句的书写:
<select id="SelectAll" resultType="brand">
select
*
from tb_brand;
</select>
在这里id是select标签的属性,代表该sql标签的唯一标识,对应Mapper接口的方法名。resulttype代表的是我执行完Mapper接口的实现类方法的返回值类型。可以是集合的形式。
如果我的javabean类的字段名不等于数据库列名,可以使用resultMap标签,具体使用如下:
<!-- id是唯一标识,type是映射的类型,支持别名,即Brand或者brand-->
<resultMap id="brandResultMap" type="brand">
<!-- id完成主键字段的映射
column表的列名 property 实体类的属性名称
result完成一般字段的映射-->
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
//在这里Column代表数据库列名,property代表javabean里面的字段名。
</resultMap>
因为resultType存放的是操控完sql语句后封装的对象的类型,这个类型可以采用别名。
<!-- 起别名,在pojo包下的类名可以不加路径,并且不区分大小写-->
<typeAliases>
<package name="com.itheima.pojo"/>
</typeAliases>
在<typeAliases>标签内,把name的值写成实体类所在的包下,这样可以不区分大小写,在写resultType的时候也可以不用加实体类所在的全部路径。
如果mapper接口名和映射文件名相同,并且在同一目录下,则可以使用包扫描的方式来简化加载映射文件,写在核心配置文件下mybatis-config.xml
<mappers>
<!-- 加载sql映射文件-->
<!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
<!-- Mapper代理方式-->
<!-- 利用包扫描的方式,简化sql映射文件的加载-->
<package name="com.itheima.mapper"/>
</mappers>
这样写完之后,在com.itheima.mapper目录下的所有配置文件都会加载到核心配置文件中。
到这里,我们的准备环境配置信息就做好了。
*******************************************************************************************************************************************************************************************************************
接下来是用Mybatis来实现增删改查的功能
一、查询信息
1.查询所有信息:
首先构造mapper代理对象,固定代码如下:
String resource = "mybatis-config.xml";//相对路径,因为该文件在resource根目录下
//字节输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SQlSession对象,用他来执行sql
SqlSession sqlSession =sqlSessionFactory.openSession();
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
然后在接口里面定义好我的抽象方法名和对应的形参和返回值类型。然后在映射文件里面写入对应的sql语句,再通过mapper对象代理执行即可。
在这里的#{}是参数占位符,具体解释如下:
<!-- mybatis 参数占位符
1.#{}会将其替换为?
2.${}未替换为?,拼sql,会存在sql注入问题-->
<!-- 使用时机:表名或列名不固定的情况下可以用${}不过依然存在sql注入问题
parameterType可以省略
这里是对特殊字符的处理,比如小于号
特殊字符的处理:比如小于号在xml文件里代表的是标签的开始,直接使用‘<‘会报错 使用转义字符 <代表小于号 或者CDATA区-->
<!--在CDATA区里面的内容会当作纯文本来处理-->
<!-- <select id="selectById" parameterType="int" resultType="brand">-->
<!-- select *-->
<!-- from tb_brand where id <![CDATA[
]]> #{id};-->
#{ }执行sql时会将占位符转化为? 而${ }是单纯的拼接sql,会存在注入问题。
2.多条件查询
//1.散装参数,如果方法中有多个参数,需要使用@Param("SQL参数占位符名称“)
//2.对象参数,对象的属性名称要和参数占位符一致
//3.Map集合参数
3.动态sql,用户在输入条件时,肯定不会所有的条件都填写,这个时候我们的SQL语句就不能那样写的,这样就需要对用户输入的信息进行判断,来决定要查询的语句。
1)首先是if标签和where标签。
if标签用来进行条件判断,在if标签的test属性里面书写逻辑表达式,这里举个例子
但是如果没有第一个status输入的内容,就会导致and作为sql语句的开始,所以会报错,所以需要使用where标签。
如上图所示,在查询时只能选择 `品牌名称`、`当前状态`、`企业名称` 这三个条件中的一个,但是用户到底选择哪儿一个,我们并不能确定。这种就属于单个条件的动态SQL语句。 这种需求需要使用到 `choose(when,otherwise)标签` 实现, 而 `choose` 标签类似于Java 中的switch语句。
使用方法如上所示。otherwise对应java里面的default
在数据添加成功后,有时候需要获取插入数据库数据的主键(主键是自增长)。
3.批量删除