Mybatis中输入参数说明及其他配置

Mybatis入门实例理论回顾及代码

Mybatis的其他设置(示例conf.xml)

conf.xml中

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<properties  resource="db.properties"/>

	<!-- 设置Mybatis全局参数
	<settings>
			<setting name="cacheEnabled" value="false"  />
			<setting name="lazyLoadingEnabled" value="false"  />
	</settings>
 	-->

 	<!-- 设置单个/多个别名 -->
	<typeAliases>
		<!-- 单个别名(别名可以忽略大小写) 
		 <typeAlias type="org.koma.entity.Student" alias="student"/> -->
		<!-- 批量定义别名 (别名可以忽略大小写),以下会自动将该包中的所有类 批量定义别名: 别名就是类名(不带包名,忽略大小写)-->
		<package name="org.koma.entity"/>
	</typeAliases>
	
	<!--配置自定义Mybatis类型处理器 -->
	<typeHandlers>
		<typeHandler handler="org.koma.converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER" />
	</typeHandlers>

	<!-- 通过environments的default值 和  environment的 id 来指定 MyBatis运行时的数据库环境-->
	<environments default="development">
		<!-- 开发环境(自己的计算机) -->
		<environment id="development">
			<!-- 事务提交方式:
				JDBC:利用JDBC方式处理事务(commit  rollback  close)
				MANAGED:将事务交由 其他组件去托管(spring ,jobss),默认 会关闭连接。
			
			<transactionManager type="MANAGED"/>
				<property name="closeConnection" value="false"/>
			 -->
			   <transactionManager type="JDBC" />
				<!-- 数据源类型:
						UNPOOLED:传统的JDBC模式(每次访问数据库,均需要 打开、关闭等数据库操作,但是 打开、关闭数据库是比较消耗性能的)
						POOLED:使用数据库连接池
						JNDI:从tomcat中获取一个内置的数据库连接池 (数据库连接池-数据源  )
				 -->
				 
				<dataSource type="POOLED">
					
					<!-- 配置数据库信息 -->
					<property name="driver" value="${driver}"/>
					<property name="url" value="${url}"/>
					<property name="username" value="${username}"/>
					<property name="password" value="${password}"/>
				</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 加载映射文件 -->
		<mapper resource="org/koma/mapper/studentMapper.xml"/>
	</mappers>
</configuration>

Mybatis内置的类型处理器

在这里插入图片描述

自定义Mybatis类型处理器

例如:(boolean -> number )

实体类Student数据库表student
字段 boolean stuSex字段 number stuSex
true:男,false:女1:男,0:女

分俩步:

一、创建转换器:需要实现TypeHandler接口TypeHandler接口有一个实现类 BaseTypeHandler ,实现转换器有2种选择:

  1. 实现接口TypeHandler接口
  2. 继承BaseTypeHandler

二、配置conf.xml

package org.koma.converter;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

//BaseTypeHandler<java类型>
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean>{

	//java中(boolean)->数据库中(number)
	/*
	 * ps:PreparedStatement对象
	 * i:PreparedStatement对象操作参数的位置
	 * parameter:java值
	 * jdbcType:jdbc操作的数据库类型
	 */
	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType)
			throws SQLException {
			if(parameter) {
				//true变1
				ps.setInt(i, 1); 
			}else {
				//false变0
				ps.setInt(i, 0); 
			}
	}

	//数据库中(number)->java中(boolean)
	@Override
	public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
		int sexNum = rs.getInt(columnName) ;//rs.getInt("stuno") ;
		return sexNum == 1?true:false ;
	}

	@Override
	public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		int sexNum = rs.getInt(columnIndex) ;//rs.getInt(1)
		return sexNum == 1?true:false ;
	}

	@Override
	public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		int sexNum = cs.getInt(columnIndex) ;//rs.getInt(1)
		return sexNum == 1?true:false ;
	}	
}

studengtMapper.xml 需要稍加修改:

	...
		<!-- 查询:使用了类型转换器
		1、如果 类中属性 和表中的字段 类型能够合理识别 (String-varchar2),则可以使用resultType;否则(boolean-number) 使用resultMap
		2、如果 类中属性名 和表中的字段名能够合理识别 (stuNo -stuno)则可以使用resultType;否则(id-stuno) 使用resultMap
	 	-->
		<select id="queryStudentByStunoWithConverter" 	parameterType="int"  resultMap="studentResult" >
			select * from student where stuno = #{stuno}
		</select>
	
		<!--resultMap可以实现2个功能:1.类型转换。 2.属性-字段的映射关系 -->
		<resultMap type="student" id="studentResult">
				<!-- 分为主键id 和 非主键 result-->
				<id property="stuNo"  column="stuno"  />
				<result property="stuName"  column="stuname" />
				<result property="stuAge"  column="stuage" />
				<!-- stuSex使用类型转换-->
				<result property="stuSex"  column="stusex"  javaType="boolean" jdbcType="INTEGER"/>
		</resultMap>
	...

		<!-- 带转换器的增加 -->
		<insert id="addStudentWithConverter" parameterType="student" >
			insert into student(stuno,stuname,stuage,graname,stusex) values(#{stuNo},#{stuName},#{stuAge},#{graName} ,#{stuSex ,javaType=boolean ,jdbcType=INTEGER } ) 
		</insert>
		...

Mybatis内置别名

在这里插入图片描述

Mybatis输入参数说明

parameterType类型为 简单类型(8个基本类型+String):#{任意值} 或者
${value} ,其中的标识符只能是value。

	<select id="queryStudentByStuno" 	parameterType="int"  	resultMap="studentMapping" >
		select * from student where stuno = ${value}或者写#{任意值}
	</select>

parameterType类型为 对象类型,#{属性值}${属性值} ,其中的标识符只能是属性值。

	<select id="queryStudentBystuageOrstuName" 	parameterType="student"	resultType="student" > 
		select stuno,stuname,stuage  from student where stuage= #{stuAge}  or stuname like '%${stuName}%' 
	</select>

注:#{ } 会自动给String类型加上’’ "(自动类型转换), ${ } 原样输出,但是适合于动态排序(动态字段)。

注:#{ } 可以防止SQL注入,${ }不防止SQL注入。

适合于动态排序例子:
	<select id="queryStudentOrderBy" 	parameterType="string"	resultType="student" >
		select stuno,stuname,stuage  from student  order by ${value} asc
	</select>
模糊查询写法:
	<select id="queryStudentBystuAgeOrstuName" 	parameterType="student"	resultType="student" > 
		select stuno,stuname,stuage  from student where stuage= #{stuAge}  or stuname like '%${stuName}%' 
	</select>
输入参数为级联属性(例子):

在这里插入图片描述

@Data
public class Address {
	private String homeAddress;
	private String schoolAddress;
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
	private int stuNo ;
	private String stuName ;
	private int stuAge ;
	private String graName ;
	private boolean stuSex ;
	private Address address;//家庭、学校(嵌套属性)
	<!-- 输入参数为 级联属性(根据地址查学生) -->
	<select id="queryStudentByaddress" 	parameterType="student"	resultType="student" > 
		select stuno,stuname,stuage  from student where homeaddress = #{address.homeAddress}  or schooladdress = '${address.schoolAddress}'
	</select>
输入参数为HashMap(例子):
	<select id="queryStudentBystuageOrstuNameWithHashMap" 	parameterType="HashMap"	resultType="student" > 
		select stuno,stuname,stuage  from student  where stuage= #{stuAge}  or stuname like '%${stuName}%' 
	</select>
	<!--用map中key的值 匹配 占位符#{stuAge},如果匹配成功 就用map的value替换占位符-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Koma_zhe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值