Mybatis框架
一、基础详解
mybatis 是一个持久层框架,用java编写
封装了jdbc操作的细节,开发者只需关注sql语句本身,而无需关注注册驱动,创建连接池等
使用了ORM思想实现了结果集的封装
ORM:
Object Relational Mappging 对象关系映射
java中的实体类和数据库中的表的映射关系
实体类 表
属性 字段
成员变量和属性的区别:
一般情况下,成员变量和属性名一致
成员变量:定义在成员位置的变量
属性:setter和getter方法去掉set或者get,将首字母变小写
二、环境的搭建
1. 创建数据库,创建表,添加数据
2. 创建项目
3. 引入jar包< 在pom.xml文件中编写>
< packaging> jar</ packaging>
< dependencies>
< dependency>
< groupId> org.mybatis</ groupId>
< artifactId> mybatis</ artifactId>
< version> 3.4.5</ version>
</ dependency>
< dependency>
< groupId> mysql</ groupId>
< artifactId> mysql-connector-java</ artifactId>
< version> 5.1.6</ version>
</ dependency>
< dependency>
< groupId> log4j</ groupId>
< artifactId> log4j</ artifactId>
< version> 1.2.12</ version>
</ dependency>
</ dependencies>
4. 创建实体类
注意:属性名和表中字段名保持一致
5. 编写dao接口
6. 创建Mybatis的主配置文件< SqlMapConfig.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>
< environments default = " mysql" >
< environment id = " mysql" >
< transactionManager type = " JDBC" > </ transactionManager>
< dataSource type = " POOLED" >
< property name = " driver" value = " com.mysql.jdbc.Driver" />
< property name = " url" value = " jdbc:mysql://localhost:3306/eesy_mybatis" />
< property name = " username" value = " root" />
< property name = " password" value = " 1234" />
</ dataSource>
</ environment>
</ environments>
< mappers>
< mapper resource = " com/corn/dao/UserDao.xml" />
</ mappers>
</ configuration>
7. 创建映射配置文件(和接口一样的路径包)< UserDao.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper namespace = " com.corn.dao.IUserDao" >
< select id = " findAll" resultType = " com.corn.domain.User" >
select * from user
</ select>
</ mapper>
三、SqlMapConfig.xml 中配置的内容和顺序
1. properties(属性)
-- property
2. settings(全局配置参数)
-- setting
3. typeAliases(类型别名)
-- typeAliase
-- package
4. typeHandlers(类型处理器)
5. objectFactory(对象工厂)
6. plugins(插件)
7. environments(环境集合属性对象)
-- environment(环境子属性对象)
--- transactionManager(事务管理)
--- dataSource(数据源)
8. mappers(映射器)
-- mapper
-- package
1. properties:定义在核心配置文件中
1. 可以从外部引入配置文件
< properties resource = " 类路径" > </ properties>
2. 另一属性:url
1. 遵循以下规则:协议://ip地址:端口号/URI
1. 协议:http ftp hdfs file ...
代码如下:
< properties url = " file:///绝对路径" > </ properties>
3. 将dataSource标签改变为引用上面的配置(修改value中的内容)
2. typeAliases:定义在核心配置文件
1. 作用:给实体类起别名(当指定了别名就再区分大小写)
2. type属性指定的是实体类全限定类名。alias属性指定别名
1.(单个别名定义)
< typeAliases>
< typeAlias type = " com.corn.domain.User" alias = " user" > </ typeAlias>
</ typeAliases>
3. 用于指定要配置别名的包+
,当指定之后该包下的实体类都会注册别名,并且类名就是别名,不区分大小写
1. (批量定义别名,扫描整个包下的类,别名为类名)
< typeAliases>
<package name ="com.corn.domain"></ package>
</ typeAliases>
4. 使用:在映射文件中不管是parameterType resultType resultMap都可以使用别名
3.mapper(映射器)
1. < mapper resource = " " /> 使用相对于类路径的资源
2. < mapper class = " " /> 使用mapper接口类路径
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
3. < package name = " " /> 注册指定包下的所有mapper接口
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
四、环境搭建注意事项
1. mybatis的映射配置文件位置必须和dao接口的包结构相同
2. 映射配置文件的Mapper标签namespace属性的值必须是dao接口的全限定类名
3. 映射配置文件的操作配置(select),ud属性的取值必须是dao接口的方法名
遵循了以上三点,我们在开发中无需再写dao 的实现类
五、增删改查操作
1. 操作步骤:
1. 在dao接口中写入方法
2. 修改映射配置为文件
2. 属性:
1. parameterType:设置参数的类型
2. resultType:设置查询到的结果封装的类型
3. statmentType:设置使用的sql语句执行对象
1. 取值:
1. PREPARED :使用PreparedStatment
2. statment:使用Statment
3. 占位符的使用:
1. #{}:
1. 如果参数是基本数据类型或者基本数据类型的包装类型,String类型,#{}中的内容可以随便写
2. 如果参数是对象,#{}中使用的是对象的属性名
2. ${value}:(开发中不会使用)如果使用这种方式的话,字段类型是varchar类型或者date类型等,需要添加引号
4. 使用的标签:
1. 添加数据,使用insert标签
2. 更新数据,使用update标签
3. 删除数据,使用delete标签
4. 查询数据,使用select标签
5. 实体类中属性名和表中字段名不一致的请求:
1. 在sql中起别名
2. 在映射配置文件中添加resultMap标签,配置实体类中的属性和表中字段的关系:
1. 代码如下:
< resultMap id = " userMap" type = " com.corn.domain.User" >
< result property = " userName" colimn = " username" > </ result>
< result property = " userAddress" colimn = " address" > </ result>
< result property = " userSex" colimn = " sex" > </ result>
< result property = " userBirthday" colimn = " birthday" > </ result>
</ resultMap>
2. 同时将属性resultType更换为resultMap并将参数换为resultMap的id
1.查询所有数据
< select id = " findAll" resultType = " 全限定类名" >
SELECT * FROM user;
</ select>
2.添加数据
1. selectkey的属性:
1. keyProperty:实体类属性的名称
2. keyColumn:表中字段的名称
3. orderr="AFTER":表明在insert语句后执行
2.代码如下
< insert id = " inserta" parameterType = " 全限定类名" >
< selectKey keyProperty = " id"
keyColumn = " id"
order = " AFTER"
resultType = " int" >
SELECT last_insert_id();
</ selectKey>
INSERT into USER(username,..)VALUES (#{username},...);
</ insert>
3.修改数据
< update id = " updatea" parameterType = " 全限定类名" >
UPDATE user SET username=#{username},address=#{address},sex=#{sex},birthday=#{birthday}where id=#{id}
</ update>
4.删除数据
< delete id = " deleta" parameterType = " Integer" >
DELETE from USER WHERE id=#{uid};
</ delete>
5.单个查询
< select id = " selectx" parameterType = " Int" resultType = " com.corn.daomain.User" >
SELECT *FROM USER where id=#{uid};
</ select>
6.模糊查询
< select id = " selectv" parameterType = " String" resultType = " com.corn.daomain.User" >
SELECT * FROM USER WHERE username like #{name}
</ select>
7.总数查询
< select id = " selectCount" resultType = " int" >
SELECT COUNT(id) from user;
</ select>
ognl表达式:
1. ognl是Apache提供的一种表达式语言,在struts2中也有应用
2. 全写为:Object Graphic Navigation Language 对象图导航语言
3. 语法格式:使用#{对象.对象}的方式
1. #{user.username}他会先去找user对象,然后在user对象中找到username属性,并把值取出来
六、事务的管理
1. 设置自动提交事务
openSession(boolean flag) -- > 如果将flag设置为true
2. 设置手动提交事务
openSession()
七、mybatis的连接池
1. < dataSource type= "设置数据源类型" > < / dataSource>
数据类型的取值:
POOLED:实现了DataSource接口,使用了池的思想
UNPOOLED:实现了DataSource接口,每次获取连接都会创建一个新的连接
JNDI:使用 JNDI 实现的数据源
2. mybatis继承第三方的连接池
1. 定义一个类C3p0DataSourceFactory继承UnPooledDataSourceFactory类
public C3p0DataSourceFactory ( ) {
this . dataSource = new COmboPooledDataSource ( ) ;
}
2. 使用自定义类,type写入全限定类名,根据配置文件写入所有的name
注意:在使用c3p0的时候必须引入c3p0的jar包的坐标
八、动态sql语句
1. if 标签:判断
属性:test
2. where 标签:替代sql 语句中where 关键字
如果有条件,添加where 关键字,没有条件,则不会添加where 关键字
3. foreach标签:遍历传递的容器
属性:
collection:集合的名称
open :起始的sql 语句
close :结束时要拼接的sql 语句
item:集合中元素的名称
separator:分隔符
九、多表关联查询
1. 一对一
1. 修改映射配置文件(未在核心配置文件中设置实体类的别名)
< resultMap id = " 起方法名" type = " 所关联类的全限定类名" >
< id property = " id" column = " 表中名字" />
< result property = " 实体类参数名称" column = " 表中名字" />
...
< association property = " 实体类中user属性名" javaType = " 所关联类的全限定类名" >
< id property = " id" column = " 表中名字" />
< result property = " 实体类参数名称" column = " 表中名字" />
...
</ association>
</ resultMap>
2. 修改实体类
2. 一对多
1. 修改实体类
2. 修改配置文件(未在核心配置文件中设置实体类的别名)
< resultMap id = " 起名" type = " 所关联类的全限定类名" >
< id property = " id" column = " 表中名字" />
< result property = " 实体类参数名称" column = " 表中名字" />
...
< collection property = " 实体类中user属性名" ofType = " 指集合中元素类型的全限定类名" >
< id property = " id" column = " 表中名字" />
< result property = " 实体类参数名称" column = " 表中名字" />
...
</ collection>
</ resultMap>
十、延时查询
1. 开启延时查询,在核心配置文件中
< settings>
< setting name = " lazyLoadingEnabled" value = " true" />
< setting name = " aggressiveLazyLoading" value = " flase" />
</ settings>
2. 修改映射配置文件
说明:多表查询的sql语句,不能实现延时加载
1. 在xml配置文件中添加:
< association property = " 实体类中属性名" column = " 关联的字段" javaType = " 所关联类的全限定类名" select = " 调用指定的id对应的sql语句进行数据的操作" > </ association>
十一、缓存
1. 一级缓存
属于sqlsession级别的
不需要进行任何的设置可以直接使用的
2. 清空一级缓存的情况
增删改操作
close()
clearCache()
3. 二级缓存
1. 在核心配置文件中(此设置可以不进行配置,默认值就是true)
< settings>
< setting name = " cacheEnabled" value = " true" />
</ settings>
2. 在映射配置文件中进行配置
< cache/>
< select> 上添加属性userCache="true"
十二、mybatis基于注解的使用
1. 作用:替代了映射配置文件
2. 包含:
1. @Select
2. @Insert
3. @Update
4. @Delete
3. 使用方法:
1. 把UserDao. xml移除,在dao接口的方法上使用注解,并且指定SQL语句,
2. 需要将SqlMapConfig. xml中的mappers配置时,使用class 属性指定dao接口的全限定类名
4. 配置实体类中的属性名和表中的字段的对应关系,使用的注解是@Results
@Results (id= "别名" , value= {
@Result ( id= true , property= "id" , column= "表中名字" ) ,
@Result ( property= "实体类参数名称" , column= "表中名称" ) ,
. . .
} )
5. 引用关联:@ResultMap ( "已有的别名" )
6. 配置多表关系:( 配置加载的时机:fetchType)
1. 一对一:使用@One 注解,替代了association标签
@Result ( property= "实体类中属性名" , column= "表中名称" , one= @One ( select= "调用指定的id对应的sql语句进行数据的操作" , fetchType= FetchType. EAGER) )
2. 一对多:使用@Many 注解,替代了collection标签
@Result ( property= "实体类中属性名" , column= "表中名称" , many= @Many ( select= "调用指定的id对应的sql语句进行数据的操作" , fetchType= FetchType. LAZY) )