Mybatis基础(一)

本文详细介绍了Mybatis配置文件中的各个元素,包括<settings>、<typeAliases>、<typeHandler>、<plugins>、<environments>、<mappers>等,以及如何进行动态SQL操作,如<if>、<choose>、<when>、<otherwise>、<where>、<set>和<foreach>等元素的使用,帮助理解Mybatis的配置和动态SQL的强大功能。
摘要由CSDN通过智能技术生成
Mybatis配置文件元素
在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<configuration>元素内配置。
元素

<properties>是一个配置属性的元素,通过外部配置来动态替换内部定义的属性:
如首先需创建一个jdbc.properties配置文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=alian

其次需要在mybatis-config.xml文件中配置<properties/>属性:

<properties resource="jdbc.properties"/>
<dataSource type="POOLED">
	<property name="driver" value="${jdbc.driver}">
	<property name="url" value="${jdbc.url}">
	<property name="username" value="${jdbc.username}">
	<property name="password" value="${jdbc.password}">
</dataSource>

dataSource中连接数据库的4个属性(driver、url、username和password)值将会由jdbc.properties文件中对应的值来动态替换,这就为配置提供了灵活性。

<settings>元素

<settings>元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。

<typeAliases>元素

<typeAliases>元素用于为配置文件中的Java类型设置别名,其使用的意义在于减少全限定类名的冗余:

<typeAliases>
	<typeAlias alias="user" type="com.neu.po.User"/>
</typeAliases>
<typeAliases>
	<package name="com.neu.po"/>
</typeAliases>

<typeAliases>中alias属性的属性值"user"就是自定义的别名,可以代替"com.neu.po.User"使用在MyBatis文件的任何位置;如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名。当POJO类过多时,还可以通过自动扫描包的形式自定义别名。

<typeHandler>元素

typeHandler的作用就是将预处理语句(prepared statement)中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。

<typeHandlers>
	<typeHandler handler="com.neu.type.UsertypeHandler"/>
</typeHandlers>
<!--注册一个包中所有的类型处理器-->
<typeHandlers>
	<package name="com.neu.type"/>
</typeHandlers>

使用这种方式,系统会在启动时自动扫描com.neu.type包下所有的文件,并把它们作为类型处理器。

<plugins>元素

<plugins>元素的作用就是配置用户所开发的插件

<environments>元素

<environments>元素用于在配置文件中对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,可以通过<environments>元素配置多种数据源,即配置多种数据库。

  • <transactionManager>元素用于配置事务管理
  • <dataSource>元素用于配置数据源

对于数据源的配置,MyBatis框架提供了UNPOOLED、POOLED和JNDI三种数据源类型:

数据源类型描述
UNPOOLED配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择
POOLED此数据源利用“池”的概念将JDBC连接对象组织起来,避免在创建新的连接实例时需要初始化和认证的时间。这种方式使得并发Web应用可以快速地响应请求,是当前流行的处理方式
JNDI此数据源可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用
<mappers >元素

<mappers>元素用于指定MyBatis映射文件的位置,通常可以使用以下4种方法引入映射器文件:

<!--使用类路径引入-->
<mappers>
	<mapper resource="com/neu/mapper/UserMapper.xml"/>
</mappers>
<!--使用本地文件路径引入-->
<mappers>
	<mapper url=“D:/com/neu/mapper/UserMapper.xml”/>
</mappers>
<!--使用接口类引入-->
<mappers>
	<mapper class="com.neu.mapper.UserMapper"/>
</mappers>
<!--使用包名引入-->
<mappers>
	<package name="com.neu.mapper"/>
</mappers>
映射文件

如果使用的数据库不支持主键自动增长(如Oracle),或者支持增长的数据库取消了主键自增的规则,就可以使用MyBatis提供的另一种方式来自定义生成主键,具体配置如下:

<insert id="insertUser" parameterType="com.neu.po.User">
	<selectKey keyProperty="id" resultType="Interger" order="BEFORE">
	select if(max(id) is null,1,max(id)+1) as newid from t_user
	</select>
	insert into t_user(id,username,jobs,phone) values(#{id},#{username},#{jobs},#{phone})
</insert>

<sql>元素的作用是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段:

<sql id="user Columns">id,username,jobs,phone</sql>
<select id="findUserById" parameterType="Interger" resultType="com.neu.po.User">
	select <include refid="user Columns"> from t_user where id=#{id}
</select>

SQL片段:使用<include>元素的refid属性引用了自定义的代码片段,refid属性值为自定义代码片段的id。

<resultMap>元素

<resultMap>元素表示结果映射集,主要作用是定义映射规则、级联更新以及定义类型转化器等。

<resultMap type="com.neu.po.User" id="resultMap">
	<id property="id" column="t_id"/>
	<result property="name" column="t_username"/>
	<result property="age" column="t_age"/>
</resultMap>
<select id="findAllUser" resultMap="resultMap">
	select * from t_user
</select>

上述代码中,<id>和<result>的property属性表示User类的属性名,column属性表示数据表t_user的列名;<id>用于表示哪个列是主键,<result>用于表示POJO和数据表中普通列的映射关系。
(此外,还可以通过<resultMap>元素中的<association>和<collection>处理多表时的关联关系。

动态SQL

MyBatis中的动态SQL提供对SQL语句动态组装的功能,解决了开发人员在使用JDBC进行数据库开发时手动拼装SQL的工作。

标签描述
<if>判断语句,用于单条件分支判断
<choose>(<when>、<otherwise>)用于多条件分支判断
<where ><trim><set>辅助元素,用于处理一些SQL拼装、特殊字符问题
<foreach>循环语句,常用于in语句等列举条件中
<bind>从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的SQL中

举例如下:修改映射文件UserMapper.xml,在映射文件中使用<if>元素编写根据用户姓名和职业组合条件查询用户信息列表的动态SQL。

<select id="findUserByNameAndJobs" parameterType="com.neu.po.User">
	select * from t_user where 1=1
	<if test="username !=null and username !=''">
	and username like concat('%',#{username},'%')
	</if>
	<if test="jobs != null and jobs !=''">
		and jobs=#{jobs}
	</if>
</select>

在这里插入图片描述

在某些情况下,使用<if>元素是不合适的,可以使用<choose>、<when>、<otherwise>元素进行处理,类似于在Java语言中使用switch…case…default语句。

在这里插入图片描述
上述代码首先查看第一个<when>元素中的条件是否满足,若第一个条件为真,则只动态组装第一个<when>元素内的SQL片段;否则继续向下判断第二个<when>元素中的条件是否为真,以此类推;若前面所有when元素中的条件都不为真,则只组装<otherwise>元素内的SQL片段。

<where>元素:可以取代上述代码中的"where 1=1"
在这里插入图片描述使用<where>元素对"where 1=1"条件进行了替换,<where>元素会自动判断组合条件下拼装的SQL语句,只有<where>元素内的条件成立时,才会在拼接SQL中加入where关键字,否则将不会添加;即使where之后的内容有多余的“AND”或“OR”,<where>元素也会自动将它们去除。(<where>可搭配<trim>元素使用)

<set>元素主要用于更新操作,主要作用是在动态包含的SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。
在这里插入图片描述
注:在映射文件中使用<set>和<if>元素组合进行update语句动态SQL组装时,如果<set>元素内包含的内容都为空,就会出现SQL语法错误。所以在使用<set>元素进行字段信息更新时,要确保传入的更新字段不能都为空。

<foreach>元素:
在这里插入图片描述findUserByIds_MyBatisTest.java:
在这里插入图片描述

<bind>元素:

在进行模糊查询编写SQL语句的时候,若使用“${}”进行字符串拼接,则无法防止SQL注入问题;若使用concat函数进行拼接,则只针对 MySQL数据库有效;若使用的是Oracle数据库,则要使用连接符号“||”。这样,映射文件中的SQL就要根据不同的情况提供不同形式的实现,显然是比较麻烦的,且不利于项目的移植。为此,MyBatis提供了<bind>元素来解决这一问题。我们完全不必使用数据库语言,只要使用 MyBatis的语言即可与所需参数连接。
在这里插入图片描述findUserByName_MyBatisTest.java:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Despacito1006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值