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 ...
随机推荐
- Ubuntu 13.10下安装ns2 2.35遇到的小问题
前面下载安装的环节我就不多说了,网上已经有很多的例子,最全的是一个新浪网友写的博客:http://blog.sina.com.cn/s/blog_785a23ae0100xraq.html.他使用的是 ...
- Java程序员必须掌握的常用Linux命令。
Java程序员也是半个运维了,在日常开发中经常会接触到Linux环境操作.小公司的开发人员甚至是兼了全运维的工作,下面整理了一些常用的Linux操作命令. Linux常用指令 ls 显示文件或目录 - ...
- XyTalk企业即时通讯IM开始开源
网址: https://gitee.com/475660/xyTalk-pc https://github.com/xy-Group/xyTalk-pc Xy.Platform是一个高性能.可扩展的企 ...
- Python函数——命名空间与闭包
前言 执行以下代码 def my_test(): x = 1 y = x+1 print(x) >> Traceback (most recent call last): File &qu ...
- 启动elasticsearch报错
could not find java; set JAVA_HOME or ensure java is in PATH 首先需要安装java 1.yum list installed |grep j ...
- C语言第八讲,指针*
C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型. 为什么这样说. 假设有两个变量,如下 ...
- 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化
在本节中,我们将学习如何利用DataParallel使用多个GPU. 在PyTorch中使用多个GPU非常容易,你可以使用下面代码将模型放在GPU上: model.gpu() 然后,你可以将所有张 ...
- 自定义Fiddler插件一
上个月自定义了一个Fiddler的插件,可以根据请求生成接口自动化测试的RF和Python代码,这样测试人员只需要手动操作页面用Fiddler抓取报文,就可以直接生成RF.Python代码,然后只需要 ...
- 简要描述 JavaScript 中定义函数的几种方式
JavaScript 中,有三种定义函数的方式: 1.函数语句:即使用 function 关键字显式定义函数.如: function f(x){ return x+1; } 2.函数定义表达式:也称 ...
- LeetCode子域名访问计数-Python3.7<五>
上一篇:LeetCode 键盘行<四> 题目:https://leetcode-cn.com/problems/subdomain-visit-count/description/ 一个网 ...