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 文件的路径)
- 用classPath下资源引用
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操作, 可以考虑使用
:传值传入的数据直接显示生成在sql中,无法防止sql注入表名、选取的列是动态的,orderby和in操作,可以考虑使用
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,
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>
如何运行配置文件
- 使用maven plugin
添加插件
org.mybatis.generator
mybatis-generator-maven-plugin
使用命令 mybatis-generator:generate - java 程序, 使用xml 文件
- 从命令提示符, 使用xml 配置文件
java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml