mybatis学习系列一
1引入dtd约束(6)
Mybatis git地址:https://github.com/mybatis/mybatis-3/wiki/Maven
指导手册:http://www.mybatis.org/mybatis-3/zh/getting-started.html
1.1)Maven项目引入mybatis包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version></dependency>
1.2)找到下载的jar包,解压并找到D:\G--学习\软件学习\mybatis\视频学习\mybatis-3.4.1\org\apache\ibatis\builder\xml
下的文件将其拷贝到文件夹中(如
D:\E\worksoft\mybatis-dtd中)
1.3)eclipse中-->preferences-->搜索xml--》xml catalog--》key输入:mybatis-config.xml全局配置文件中的dtd链接:http://mybatis.org/dtd/mybatis-3-config.dtd
--》location选择拷贝的文件地址(D:\E\worksoft\mybatis-dtd\mybatis-3-mapper.dtd)
---》key type选择“URI”
-->ok--》关闭mybatis-config.xml文件再打开即可提示
2全局配置文件引入外部配置文件(7)
使用properties引入外部properties配置文件内容
<properties url=""></properties><!-- 引入网络路径或磁盘路径下资源 -->
<properties resource=""></properties><!-- 引入类路径下资源 -->
2.1)新建配置文件
dbconfig2.properties
内容:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=(Junli@2018*test)
2.2)修改mybatis-config.xml全局配置
<configuration>
<properties resource="dbconfig.properties"></properties><!-- 引入类路径下资源 -->
<!-- <properties url=""></properties> --><!-- 引入网络路径或磁盘路径下资源 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3setting运行时设置(8)
3.1)mapUnderscoreToCamelCase 映射下划线到驼峰规则,即数据库为下划线命名规则,java bean为驼峰命名规则。默认false,设置为true
<settings>
<!-- name:设置项名,value:设置项值 -->
<setting name="mapUnderscoreToCamelCase" value="true"/><!--映射数据库下划线-java bean驼峰命名规则 -->
</settings>
4typeAliases别名(9)
<!-- typeAliases别名处理器,可以为我们的java类型起别名 -->
<typeAliases>
<!-- typeAliases:为某个java类型起别名;type:指定要起别名的类型全类名,默认别名为类型小写,employee -->
<typeAlias type="com.mybatis.bean.Employee" alias="emp"/>
</typeAliases>
5typehandlers类型处理器(10)
Java数据类型和数据库数据类型转换
Mybatis3.4后已自动注册部分类型处理(如日期),无需手动注册。
6plugins插件(11)
允许插件拦截的方法:
Executor/parameterHandler/resultSetHandler/statementhandler。
7enviroments运行环境(12)
Enviroments:环境列表,可配置多个,通过default切换不同环境
Enviroment:配置具体的环境信息,id为环境唯一标识。
Enviroment必须有2个标签:
transactionManager:
Type:配置事务管理器类型,JDBC | MANAGED 和自定义事务管理器 ,后续通过spring管理
dataSource:数据源,POOLED | UNPOOLED | JNDI 和自定义连接池,后续通过spring管理
如:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
8databaseidprovider多数据库支持(13)
8.1)全局配置文件中配置多数据库支持
<!-- 多数数据库支持
DB_VENDOR:别名,作用得到数据库厂商标识(驱动自带),mybatis工具数据库厂商标识执行不同sql
MySQL,Oracle,SQL Server,***数据库厂商标识
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/><!-- 为不同的数据库厂商名起别名 -->
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
8.2)mapper映射文件中配置sql执行对应的数据库id(databaseId)
<select id="selectEmployee" resultType="com.mybatis.bean.Employee"
databaseId="mysql">
select * from myemployeee where id = #{id}
</select>
<select id="selectEmployee" resultType="com.mybatis.bean.Employee"
databaseId="oracle">
select employee_id id,last_name lastName,email email from employees where employee_id= #{id}
</select>
9mappers sql映射注册(14)
将sql映射注册到全局配置中
<!--mappers :将sql映射注册到全局配置中 -->
<mappers>
<!-- mapper:注册一个sql映射(单个注册)
resources:引入类路径下的sql映射文件
url:引用网络路径或磁盘路径下的sql映射文件
file://var/mappers/EmployeeMapper.xml
class:引用接口,一般用于接口注解方式
使用方式1:有sql映射文件,且与接口同名,与接口在同一层目录下
使用方式2:没有sql映射文件,所有sql通过注解写在接口上
推荐:重要复杂的,使用dao接口写sql映射文件
不重要,简单的dao接口可使用注解方式。
-->
<!-- <mapper resource="EmployeeMapper.xml"/>
<mapper url="d:/test/EmployeeMapper.xml"/> -->
<!-- <mapper class="com.mybatis.bean.EmployeeMapper"/> -->
<!-- package 批量注册,最好将mapper接口名和xml文件放在同一个包名下 -->
<package name="com.mybatis.bean"/>
</mappers>
注意:
public interface EmployeeMapper {
// @Select("select * from myemployeee where id = #{id}")
List<Employee> selectEmployee(Integer id);
}
如果EmployeeMapper 接口和EmployeeMapper.xml文件同名,采用注解方式时则相当于将EmployeeMapper.xml中的sql写在了EmployeeMapper 接口中,因此需要注释其中一种,否则会冲突。
为方便显示,可在conf文件夹下创建com.mybatis.dao文件夹,将.xml文件放在该目录下,接口类放在src/main/java的com.mybatis.dao文件夹中。因为:无论是src/main/java还是resources下的文件最终都会编译到classes(类路径下)。
创建的文件结构如下:
编译后的文件:
可以看到.xml和接口确实被编译到同一个文件夹下(即2个是一个包,只是eclipse视觉是2个):
需要调整的地方:
<mapper namespace="com.mybatis.dao.EmployeeMapper">
Employee employee = (Employee) session.selectOne("com.mybatis.dao.EmployeeMapper.selectEmployee", 1);
<package name="com.mybatis.dao"/>
10xml映射文件(16)
常用标签:
标签名 |
作用 |
备注 |
Cache |
命名空间二级缓存配置 |
|
Cache-ref |
其他命名空间缓存配置引用 |
|
Resultmap |
自定义结果集映射 |
|
parameterMap |
已废弃,老式风格参数映射 |
|
Sql |
抽取可重用语句块 |
|
Insert |
映射插入语句 |
|
Update |
映射修改语句 |
|
Delete |
映射删除语句 |
|
Select |
映射查询语句 |
测试
1)拷贝项目重命名为mybatistest2
2)项目结构如下:
3)EmployeeMapper.java
public interface EmployeeMapper {
//查询
List<Employee> selectEmployee(Integer id);
//增加
Integer addEmp(Employee employee);
//修改
Integer updateEmp(Integer id);
//删除
Integer deleteEmp(Integer id);
}
4)EmployeeMapper.xml
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<select id="selectEmployee" resultType="com.mybatis.bean.Employee"
databaseId="mysql">
select * from myemployeee where id = #{id}
</select>
<!-- <select id="selectEmployee" resultType="com.mybatis.bean.Employee"
databaseId="oracle">
select * from myemployeee where id = #{id}
</select> -->
<insert id="addEmp" parameterType="com.mybatis.bean.Employee">
insert into myemployeee(last_name,email,gender)
values(#{lastName,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR},#{gender,jdbcType=VARCHAR})
</insert>
<update id="updateEmp" parameterType="com.mybatis.bean.Employee">
update myemployeee mm
set mm.last_name=#{lastName,jdbcType=VARCHAR}
,mm.email=#{email,jdbcType=VARCHAR}
,mm.gender=#{gender,jdbcType=VARCHAR}
where mm.id=#{id,jdbcType=INTEGER}
</update>
<delete id="deleteEmp" >
delete mm from myemployeee mm where mm.id=#{id,jdbcType=INTEGER}
</delete>
</mapper>
注意:mysql的delete的语法有些特殊,delete 语句在用别名的时候要在delete后边多写一个别名。
5)mybatis-config.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="dbconfig.properties"></properties><!-- 引入类路径下资源 -->
<!-- setting 设置项 -->
<settings>
<!-- name:设置项名,value:设置项值 -->
<setting name="mapUnderscoreToCamelCase" value="true"/><!--映射数据库下划线-java bean驼峰命名规则 -->
</settings>
<!-- typeAliases别名处理器,可以为我们的java类型起别名 -->
<typeAliases>
<!-- typeAliases:为某个java类型起别名;type:指定要起别名的类型全类名,默认别名为类型小写,employee -->
<typeAlias type="com.mybatis.bean.Employee" alias="emp"/>
</typeAliases>
<!-- <properties url=""></properties> --><!-- 引入网络路径或磁盘路径下资源 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 多数数据库支持
DB_VENDOR:别名,作用得到数据库厂商标识(驱动自带),mybatis工具数据库厂商标识执行不同sql
MySQL,Oracle,SQL Server,***数据库厂商标识
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/><!-- 为不同的数据库厂商名起别名 -->
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
<!--mappers :将sql映射注册到全局配置中 -->
<mappers>
<!-- mapper:注册一个sql映射(单个注册)
resources:引入类路径下的sql映射文件
url:引用网络路径或磁盘路径下的sql映射文件
file://var/mappers/EmployeeMapper.xml
class:引用接口,一般用于接口注解方式
使用方式1:有sql映射文件,且与接口同名,与接口在同一层目录下
使用方式2:没有sql映射文件,所有sql通过注解写在接口上
推荐:重要复杂的,使用dao接口写sql映射文件
不重要,简单的dao接口可使用注解方式。
-->
<!-- <mapper resource="EmployeeMapper.xml"/>
<mapper url="d:/test/EmployeeMapper.xml"/> -->
<!-- <mapper class="com.mybatis.bean.EmployeeMapper"/> -->
<!-- package 批量注册,最好将mapper接口名和xml文件放在同一个包名下 -->
<package name="com.mybatis.dao"/>
</mappers>
</configuration>
6)dbconfig.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=(Junli@2018*test)
7)启动类:
Mytest.java
public class Mytest {
public static void main(String[] args) throws IOException {
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();//手动提交
// SqlSession session = sqlSessionFactory.openSession(true);//自动提交
try {
// Employee employee = (Employee) session.selectOne("com.mybatis.dao.EmployeeMapper.selectEmployee", 1);
EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);
Employee employee = new Employee(null,"test","test@com.cm","男");
//mapper为代理对象
mapper.addEmp(employee);
// System.out.println(employee);
//手动提交
session.commit();
} finally {
session.close();
}
}
//从xml文件中创建sqlsessionfactory
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";//类路径下直接写配置
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
11 insert获取自增主键的值(17)
插入sql中新增属性:
<!-- 获取自增主键的值 -->
<insert id="addEmp" parameterType="com.mybatis.bean.Employee"
useGeneratedKeys="true" keyProperty="id">
insert into myemployeee(last_name,email,gender)
values(#{lastName,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR},#{gender,jdbcType=VARCHAR})
</insert>
Test类中执行语句:
Employee employee = new Employee(null,"test3","test3@com.cm","男");
//mapper为代理对象
//添加
mapper.addEmp(employee);
System.out.println("新增主键:"+employee.getId());
12 oracle使用序列生成主键(18)
Oracle主键不能自增,需要通过序列模拟自增。每次插入时,先从序列获取下一个值。
1)查询当前存在序列:
Select * from user_sequences; //查询序列列表。
2)如存在employees_seq序列,先查询学列下一个值
Select employees_seq.nextval from dual;
--得到值221,
再查一次:
Select employees_seq.nextval from dual;
--得到222.
即每次查询就会自增
3)insert into employees values(223,’test’,’test@com.cn’,’男’);
其中223为先从序列获取的值,再自行赋值数据中的。
13获取非自增主键的值,selectkey(19)
<insert id="addEmp" parameterType="com.mybatis.bean.Employee"
useGeneratedKeys="true" keyProperty="id" databaseId="oracle">
<!-- 编写查询主键的sql序列
keyProperty:查出的值赋值给javabean的属性
order:执行顺序
BEFORE在之前;
先运行selectkey查询id的sql,查出id值封装给javabean的id属性
再运行插入的sql,可获取id属性对应的值
AFTER使用序列:
先运行插入的sql(从序列中取出新值作为id)
再运行selectkey查询id的sql,查出id值封装给javabean的id属性
insert into myemployeee(last_name,email,gender)
values(employees_seq,#{email,jdbcType=VARCHAR},#{gender,jdbcType=VARCHAR})
此时查询序列语句应该改为:
select employees_seqd.currval from dual
resultType:返回值类型
-->
<selectKey keyProperty="id" order="BEFORE" resultType="integer">
<!-- 编写查询主键的sql序列 -->
select employees_seqd.nextval from dual
</selectKey>
insert into myemployeee(last_name,email,gender)
values(#{id,jdbcType=integer},#{email,jdbcType=VARCHAR},#{gender,jdbcType=VARCHAR})
</insert>
14参数处理(20)
类型 |
处理方式 |
备注 |
单个参数 |
Mybatis不会特殊处理 #{参数名}:取出参数的值 |
|
多个参数(命名参数) |
多个参数会被封装成一个map 1)默认: Key: param1...paramN或者参数索引 Value:传入的参数值 #{param1},#{param2} 2)多个参数封装成map @Param(“id”) |
Employee selectEmployeeByIdAndLastName(Integer id,String lastName); 取值:#{id},#{lastName}会报错 1)默认方式: select * from myemployeee where id = #{param1} and last_name=#{param2} 2)封装成map方式: Employee selectEmployeeByIdAndLastName(@Param("id")Integer id,@Param("lastName")String lastName); select * from myemployeee where id = #{id} and last_name=#{lastName} |
POJO |
多个参数正好是业务数据模型,可直接传入pojo,#{属性名},取出传入pojo的属性值。 |
|
Map |
如果多个参数不是业务数据模型,没有对应的pojo,可直接传入map。 #{key}取出map中对应的值 |
<select id="selectEmployeeByMap" resultType="com.mybatis.bean.Employee"> select * from myemployeee where id = #{id} and last_name=#{lastName} </select> Employee selectEmployeeByMap(Map<String,Object> map); Map<String,Object> map=new HashMap<String,Object>(); map.put("id", 1); map.put("lastName","test"); Employee employee1=mapper.selectEmployeeByMap(map); |
TO |
多个参数不是业务模型中的数据,但经常使用,推荐编写一个TO(transfer object)数据传入对象,如 Page{ int index; int size;} |
案例分析:
1)selectEmployeeByIdAndLastName(@Param("id")Integer id,String lastName);
取值:id==>#{id/param1} lastName==>#{param2}
2)selectEmployeeByIdAndLastName(Integer id,Employee emp);
取值:id==>#{param1} lastName==>#{param2.lastName}
3)selectEmployeeByIdAndLastName(Integer id,@Param("e")Employee emp);
取值:id==>#{param1} lastName==>#{param2.lastName/e.lastName}
4)selectEmployeeByIdAndLastName(List<Integer> ids);
取值:取出第一个id值:#{list[0]}
集合collection(list/set)类型或数组,也会特殊处理,把传入的list或数组封装在map中,key,collection(collection);如果是list还可以使用key(list);数组(array)。
mybatis学习系列一的更多相关文章
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- MyBatis学习系列一之环境搭建
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ...
- mybatis学习系列一(mybatis简介/使用)
1mybatis简介(1) 1.1工具:jbbc,jdbctemplate 功能简单,sql语句编写在java代码里面,硬编码高耦合的方式 1.2 框架:整体解决方案 1.2.1 Hibernate: ...
- mybatis学习系列五--插件及类型处理器
2 插件编写(80-81) 单个插件编写 2.1实现interceptor接口(ibatis) invocation.proceed()方法执行必须要有,否则不会无法实现拦截作用 2.2 使用@int ...
- mybatis学习系列四--mybatis generator逆向工程
采用命令行方式执行逆向工程 1.配置文件generatorConfig.xml 保存在目录:D:\E\workspace\eclipse\mybatis_generator <?xmlversi ...
- mybatis学习系列三(部分)
1 forearch_oracle下批量保存(47) oracle批量插入 不支持values(),(),()方式 1.多个insert放在begin-end里面 begin insert into ...
- mybatis学习系列二
1 参数处理(封装map过程)(23) 1.1)F5进入断点:Employee employee1=mapper.selectEmployeeByMap(map); 1.2)进入MapperProxy ...
- Mybatis学习系列(七)缓存机制
Mybatis缓存介绍 MyBatis提供一级缓存和二级缓存机制. 一级缓存是Sqlsession级别的缓存,Sqlsession类的实例对象中有一个hashmap用于缓存数据.不同的Sqlsessi ...
随机推荐
- 【2019北京集训测试赛(十三)】数据(sj) 冷静分析
题目大意:给你一个代表区间$[1,n]$的线段树,问你随机访问区间$[1,n]$中的一个子区间,覆盖到的线段树节点个数的期望(需要乘上$\frac{n(n-1)}{2}$后输出). 数据范围:$n≤1 ...
- java使用google开源工具实现图片压缩
前言 作为靠谱的java服务端程序员,图片这个事情一直是个头疼的事情. 现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也是相当的高,当然占用的存储空 ...
- Kafka实战-入门
1.概述 经过一个多月的时间观察,业务上在集成Kafka后,各方面还算稳定,这里打算抽时间给大家分享一下Kafka在实际场景中的一些使用心得.本篇博客打算先给大家入个门,让大家对Kafka有个初步的了 ...
- Zuul过滤器
1.Zuul过滤器生命周期Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期.a.pre: 这种过滤器在请求被路由之前调用.可利用这种 ...
- The Mac App Store isn't working. How to fix?
Q. The Mac App Store isn't working. How to fix? First you must have built-in Ethernet at 'en0'. So, ...
- XCode - App installation failed (A valid provisioning profile for this executable was not found)
OSX:10.14 XCode:10.1 iPhone:iPhone 4S IOS9.3.5 我不得不骂那些SB们,不懂就别TMD乱写文章,误导别人!!我今天看了很多关于这个错误的中文文章,结果都没能 ...
- [转]在Node.js中使用RabbitMQ系列一 Hello world
本文转自:https://www.cnblogs.com/cpselvis/p/6288330.html 在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队 ...
- 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
错误提示:可能会导致循环或多重级联路径.请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束. 原因:自表连接(同一张表 ...
- ES6+ 开发 React 组件
在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣. 类 迄今为止,最能体现我们使用 ES6+ 来编写 React 组件的就是 ...
- [android] 图片的缩放
界面布局,线性布局,竖直排列,两个ImageView 获取到两个ImageView对象 调用BitmapFactory.decodeResource(res,id)方法,获取Bitmap对象 参数:r ...