Mybatis - 1
-
一、了解
更加简化jdbc 代码,简化持久层,sql 语句从代码中分离,利用反射,将表中数据与java bean 属性一一映射即ORM
-
二、mybatis环境搭建
1. 新建maven项目,添加依赖坐标
2. log4j.properties添加
3. mybatis.xml配置文件添加
4. UserMapper.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">
<!--
1.命名空间配置 全局唯一 包名+文件名
2.配置Mapped Statement
3. statement配置
id 值声明statement编号 同一命名空间(同一文件)下不可重复
parameterType 输入参数即占位符的数据类型 类型可以是 基本数据类型,字符串,java bean ,map,list等
resultType 输出结果 类型可以是基本数据类型,字符串,java bean,map等
statement 描述 即待执行的sql
#{id} 占位符 变量名为id/value 均可 ${value} 变量名必须为value 字符串拼接形式 无法避免sql 注入
-->
<mapper namespace="com.lwx.mapper.UserMapper">
<select id="queryUserById" parameterType="int" resultType="com.lwx.po.User">
select id,user_name as userName,user_pwd as userPwd from user where id=#{id}
</select>
</mapper>
5. 修改pom 配置,设置资源文件夹路径
6. 测试
a)、读取mybatis 的配置文件
b)、加载配置文件创建SqlSessionFactory
c)、根据SqlSessionFactory 创建SqlSession
d)、通过sqlSession 操作数据库
e)、处理结果
f)、关闭session
package com.lwx;
import com.lwx.po.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* By:刘文旭 ~ https://blog.csdn.net/qq_40414738
* Date:2018/11/2 20:30 .
*/
public class MybatisTest {
@Test
public void test() throws IOException {
/**
a)、读取mybatis 的配置文件
b)、加载配置文件创建SqlSessionFactory
c)、根据SqlSessionFactory 创建SqlSession
d)、通过sqlSession 操作数据库
e)、处理结果
f)、关闭session
*/
/**
* 加载配置到内存
*/
InputStream is= Resources.getResourceAsStream("mybatis.xml");
/**
* 创建SqlSessionFactory 对象hibernate 也是如此必须先获取
SqlSessionFactory 实例化对象
*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
/**
* 获取session 以便操作数据库
* 参数一:指定UserMapper.xml 映射文件id 必须加入命名空间
* 参数二:指定输入参数
*/
SqlSession session = sqlSessionFactory.openSession();
User user = session.selectOne("com.lwx.mapper.UserMapper.queryUserById",1);
/**
* 将返回的结果输出
*/
System.out.println(user);
/**
* 操作完数据库关闭session
*/
session.close();
}
}
-
三、Mybatis 配置文件解释
1.properties
简化jdbc配置, 可以引用jdbc.properties文件
添加 .properties文件
加载数据库配置
<properties resource="jdbc.properties"></properties>
修改为动态配置的属性值
2.settings
MyBatis 修改操作运行过程细节的重要的步骤
1) cacheEnabled 缓存
全局配置
2) useGenerateKey 自动生成主键
允许JDBC生成主键
3.别名 typeAlias
减少类完全限定名的冗余
自定义
<typeAliases><typeAlias alias="User" type="com.shsxt.mybatis.vo.User" /></typeAliases>
包扫描
<package name="com.shsxt.mybatis.vo"/>
内置
_integer <- Int ...
4.对象工厂
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。
5.plugin插件
会讲分页插件 PageHelper
6.多数据源配置
有助于将SQL 映射应用于多种数据库之中,(SqlSessionFactory 实例)
尽管可以配置多个环境,每个SqlSessionFactory 实例只能选择其一。
7.事务管理
两种:type=”[JDBC|MANAGED]”
8.数据源
UNPOOLED
每次被请求时打开和关闭连接
POOLED
一种使得并发Web 应用快速响应请求的流行处理方式。(一般选用这种)
JNDI
9.mapper映射器4种配置
sqlmapper 配置文件路径
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
url 绝对路径形式
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
接口列表配置形式注解sql
<mapper class="org.mybatis.builder.AuthorMapper"/>
映射包下所有接口
<package name="org.mybatis.builder"/>
10. typeHandlers(类型处理器)
将获取的值以合适的方式转换成Java类型
-
四、mapper.xml详解
配置:
1. id 唯一表示
2. paramsType 参数类型
3. resultTyps 结果类型
4. resultMap描述如何从数据库结果集中来加载对象
1.select标签
1) 输入参数: int string Map JavaBean
2) 输出参数: 基本数据类型,字符串,JavaBean,Map,List等
2.insert标签
1) 普通添加
2) 添加返回主键
a. 通过添加xml(区分mysql和Oracle)
b. 通过属性useGeneratedKeys="true" keyProperty="id"
3) 批量添加
<foreach>
collection
根据传入参数不同
item
集合元素迭代时的别名
separator
迭代元素之间的分隔符
open/close
以什么开始/结束
3.update
1) 普通添加
2) 批量添加
4.delete
1) 单条更新
2) 批量更新
5.sql标签
可以重用的sql片段
1) 定义 <sql id=’’>.....</sql>
2) <include refid=’’/>
6.resultMap
1) 定义<resultMap></resultMap>
2) 使用 resultMap 定义sql返回类型
-
五、mapper 接口代理方式的crud 开发
不用写接口的实现类
-
六、动态SQL语句
根据参数不同,sql语句不同
1.<if>
<if test=”name!=null and name!=’’”>
sql语句
</if>
2.choose、when、otherwise
3.tirm where set
1) where 在合适的时候去除多余的and
2) set 在合适的时候去除 ,
3) trim 拥有where 和 set功能, 可以可以扩展
4.foreach
详情请查看 foreach元素的属性主要有 item,index,collection,open,separator,close。
-
七、Ognl 表达式
简化if 的test判断
1. 定义Ognl类,定义方法
2. @Ognl@isNotEmpty(userName)