Mybatis 概述与进阶

1. 传统的jdbc 连接数据库
1.1 导入sql 相关的包
1.2 注册Mysql 驱动(com.mysql.jdbc.Driver)
1.3 获得一个数据库连接
1.4 创建一个sql 语句
1.5 从resultset 中获取数据库数据并装成bean
1.6 关闭连接
缺点: 工作量大, 业务代码和技术代码耦合, 连接资源手动关闭, 带来了隐患
Mybatis 连接数据库过程
1. 读取mybatis 配置文件创建SqlsessionFactory
2. 获取sqlSession
3. 获取对应的mapper
4. 执行sql语句并返回结果

2. ORM:(Object Relational Mapping)

ORM 模型就是数据库的表, 与简单的JAVA 对象(pojo)的映射模型, 它主要解决数据库和POJO 对象相互的映射

3. Mybatis 配置

Properties :定义配置,配置的属性可以在整个配置文件中其他位置进行引用(db.properties)配置数据库连接池的时候可以直接饮用配置文件里面的信息
settings:设置,用于指定MyBatis的一些全局配置属性,这些属性非常重要,它们会改变MyBatis的运行时行为(比如:mapUnderscoreToCamelcase value=true 设置下划线转驼峰命名。 比如:mapUnderscoreToCamelcase value=true设置驼峰命名,cacheEnabled缓存的全局开关。lazyLoadingEnabled延迟加载的全局开关。aggressiveLazyLoading 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载)
在这里插入图片描述
typeAliases:别名的定义 为Java类型设置一个短的名字,映射时方便使用;分为系统定义别名和自定义别名;配置package name=“要扫描的entities 的包”, 在xml 里面的resulttype =“可以直接使用类名, 不需要使用全路径了”
typeHandlers:用于jdbcType与javaType之间的转换, 数据库类型和java 里面的类型进行转换, 基础类型已经封装好了, 比如像要将枚举类型转换成数据库类型, 需要用到这个配置, 不常用。
ObjectFactory:MyBatis每次创建结果对象的新实例时,它都会使用对象工厂(ObjectFactory)去构建POJO
plugins:插件,MyBatis允许你在已映射的语句执行过程中的某一点进行拦截调用;(分页)
environments:用于配置多个数据源,每个数据源分为数据库源和事务的配置
 属性id是它的唯一标识
 transactionManager 元素配置数据库事务,其中type属性有三种配置方式
 jdbc,采用jdbc的方式管理事务;
 managed,采用容器的方式管理事务,在JNDI数据源中使用;
 自定义,自定义数据库事务管理办法;
 dataSource 元素配置数据源连接信息,type属性是连接数据库的方式配置,有四种配置方式
 UNPOOLED 非连接池方式连接
 POOLED 使用连接池连接
 JNDI 使用JNDI数据源
 自定义数据源

databaseIdProvider:MyBatis可以根据不同的数据库厂商执行不同的语句,用于一个系统内多厂商数据源支持。
Mappers:配置引入映射器的方法。可以使用相对于类路径的资源引用、或完全限定资源定位符(包括file:///的URL),或类名和包名等等(mapper 文件的路径)

  1. 用classPath下资源引用
 2. 用类注册方式引用(类和xml 文件要在同一包下) <!—通过类扫描mapper文件 ,--> (自动搜索同一包下的名字完全相同的xml 文件)

4. Mapper 的配置(mapper.xml 文件包括sql 语句, 和映射规则)

1 resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来
resultMap 子元素
constructor - 用于在实例化类时,注入结果到构造方法中
一个pojo不存在没有参数的构造方法,就需要使用constructor;
为了通过名称来引用构造方法参数,你可以添加 @Param 注解,指定参数名称的前提 下,以任意顺序编写 arg 元素

 <constructor>
	<idArg column="id" javaType="int" />
	<arg column="user_name" javaType="String" />
</constructor>

idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
arg - 将被注入到构造方法的一个普通结果
id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result – 注入到字段或 JavaBean 属性的普通结果

在这里插入图片描述
association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以指定为一个 resultMap 元素,或者引用一个
collection – 一个复杂类型的集合
嵌套结果映射 – 集合可以指定为一个 resultMap 元素,或者引用一个
discriminator – 使用结果值来决定使用哪个 resultMap
case – 基于某些值的结果映射
嵌套结果映射 – 一个 case 也是一个映射它本身的结果,因此可以包含很多相 同的元素,或者它可以参照一个外部的 resultMap

2.sql – 可被其他语句引用的可重用语句块。
3. select – 映射查询语句
在这里插入图片描述

自动映射前提:
SQL列名和JavaBean的属性是一致的;
自动映射等级autoMappingBehavior设置为PARTIAL,需要谨慎使用FULL;
使resultType;
如果列名和JavaBean不一致,但列名符合单词下划线分割,Java是驼峰命名法,则mapUnderscoreToCamelCase可设置为true;

传递多个查询入参
使用map传递参数;可读性差,导致可维护性和可扩展性差,杜绝使用;
使用注解传递参数(@Param(“email”)String email,@Param(“age”)Int age,);此时不指定parameterType 不指定参数的类型, 因为类型不一样了。直观明了,当参数较少一般小于5个的时候,建议使用;
使用Java Bean的方式传递参数;当参数大于5个的时候,建议使用;

resultType:数据库属性名自动映射到实体类的属性名, 名字相同映射(自动映射)
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。自定义数据库字段名字和实体类名字的转换规则, 指定数据库的列对应到实体类哪1个属性(非自动映射)

4.insert – 映射插入语句
5.update – 映射更新语句
6.delete – 映射删除语句
在这里插入图片描述

7.cache给定命名空间的缓存配置
8.cache-ref其他命名空间缓存配置的引用

5.#{}与${}

#{}: 预编译 将传入的数据都当成一个字符串,会对自动传入的数据加一个单引号,能够很大程度防止sql注入;
: 传 值 传 入 的 数 据 直 接 显 示 生 成 在 s q l 中 , 无 法 防 止 s q l 注 入 表 名 、 选 取 的 列 是 动 态 的 , o r d e r b y 和 i n 操 作 , 可 以 考 虑 使 用 {}:传值 传入的数据直接显示生成在sql中,无法防止sql注入 表名、选取的列是动态的,order by和in操作, 可以考虑使用 sqlsqlorderbyin使

6. 动态SQL

where 自动把第一个and 去掉

<if test=“userid !=null and userid!=’’ ”>
and userid=#{userid}

<if test=“b!=null and b!=’’ ”>
and b=#{b}

set 可以自动去掉最后一个逗号

<if test=“userid !=null and userid!=’’ ”>
userid=#{userid},

<if test=“b!=null and b!=’’ ”>
b=#{b},

insert 通过trim , 前面加一个括号, 后面加一个括号, 并把最后面的豆好去掉

insert into user


id,


user,

#(id,jabcType=INTEGER), #(user,jabcType=VARCHAR),

choose when otherwise 相当于java 的 case when , 多条件分支判断, 很少用

foreach :

select * from t_user where user_name in

#{userName}

collection, 遍历的数组, 或者list , map
separator,遍历之后的分割符

7.代码生成器MBG

MyBatis Generator

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE generatorConfiguration PUBLIC   
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"  
 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>


	<!-- 加载数据库驱动 -->
	<classPathEntry location="mysql-connector-java-5.1.18.jar" />
	
	<!-- context:生成一组对象的环境 
			id:必选,上下文id,用于在生成错误时提示 
			defaultModelType:指定生成对象的样式 
				 1,conditional:类似hierarchical;
				 2,flat:所有内容(主键,blob)等全部生成在一个对象中,推荐使用; 
		  		 3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class) 
		  	targetRuntime: 
		  		 1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample; 
		         2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample; 
     -->
	<context id="context1" targetRuntime="MyBatis3"	defaultModelType="flat">
	
	    <!-- 生成的Java文件的编码 -->
    	<property name="javaFileEncoding" value="UTF-8"/>
	
	
		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是 : false:否 -->
			<property name="suppressAllComments" value="false" />
			<!-- 阻止注释中包含时间戳 true:是 : false:否 -->
			<property name="suppressDate" value="true" />
			<!--  注释是否包含数据库表的注释信息  true:是 : false:否 -->
			<property name="addRemarkComments" value="true" />
		</commentGenerator>
		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="lixun033" />


        <!-- java模型创建器,是必须要的元素   负责:1,key类(见context的defaultModelType);2,java类;3,查询类
        	targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
        	targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
     	-->
		<javaModelGenerator targetPackage="com.enjoylearning.mybatis.entity" targetProject="src/main/java">
			<!-- 设置一个根对象,
	                      如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项
	                      注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括:
	                1,属性名相同,类型相同,有相同的getter/setter方法;
	         -->
			<property name="rootClass" value="com.enjoylearning.mybatis.entity.BaseEntity" />
		</javaModelGenerator>


		<!-- 生成SQL map的XML文件生成器,
            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
        	targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
         -->
		<sqlMapGenerator targetPackage="." targetProject="src/main/resources/sqlmapper">
		</sqlMapGenerator>
		
		
		 <!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口 
		        type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
		            1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
		            2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
		            3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
		        注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
		    -->		
    	<javaClientGenerator targetPackage="com.enjoylearning.mybatis.mapper"	targetProject="src/main/java" type="XMLMAPPER" />




		<!-- shema 数据库 tableName表明 -->
		<table schema="${jdbc_username}" tableName="%"   enableCountByExample="false"
			enableUpdateByExample="false" enableDeleteByExample="false"
			enableSelectByExample="false" selectByExampleQueryId="false">
			<generatedKey column="id" sqlStatement="MySql"/>
		</table>


	</context>
</generatorConfiguration>

如何运行配置文件

  1. 使用maven plugin
    添加插件
    org.mybatis.generator
    mybatis-generator-maven-plugin
    使用命令 mybatis-generator:generate
  2. java 程序, 使用xml 文件
  3. 从命令提示符, 使用xml 配置文件
    java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值