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学习系列一的更多相关文章

  1. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  2. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  3. MyBatis学习系列一之环境搭建

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ...

  4. mybatis学习系列一(mybatis简介/使用)

    1mybatis简介(1) 1.1工具:jbbc,jdbctemplate 功能简单,sql语句编写在java代码里面,硬编码高耦合的方式 1.2 框架:整体解决方案 1.2.1 Hibernate: ...

  5. mybatis学习系列五--插件及类型处理器

    2 插件编写(80-81) 单个插件编写 2.1实现interceptor接口(ibatis) invocation.proceed()方法执行必须要有,否则不会无法实现拦截作用 2.2 使用@int ...

  6. mybatis学习系列四--mybatis generator逆向工程

    采用命令行方式执行逆向工程 1.配置文件generatorConfig.xml 保存在目录:D:\E\workspace\eclipse\mybatis_generator <?xmlversi ...

  7. mybatis学习系列三(部分)

    1 forearch_oracle下批量保存(47) oracle批量插入 不支持values(),(),()方式 1.多个insert放在begin-end里面 begin insert into ...

  8. mybatis学习系列二

    1 参数处理(封装map过程)(23) 1.1)F5进入断点:Employee employee1=mapper.selectEmployeeByMap(map); 1.2)进入MapperProxy ...

  9. Mybatis学习系列(七)缓存机制

    Mybatis缓存介绍 MyBatis提供一级缓存和二级缓存机制. 一级缓存是Sqlsession级别的缓存,Sqlsession类的实例对象中有一个hashmap用于缓存数据.不同的Sqlsessi ...

随机推荐

  1. 【2019北京集训测试赛(十三)】数据(sj) 冷静分析

    题目大意:给你一个代表区间$[1,n]$的线段树,问你随机访问区间$[1,n]$中的一个子区间,覆盖到的线段树节点个数的期望(需要乘上$\frac{n(n-1)}{2}$后输出). 数据范围:$n≤1 ...

  2. java使用google开源工具实现图片压缩

    前言 作为靠谱的java服务端程序员,图片这个事情一直是个头疼的事情. 现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也是相当的高,当然占用的存储空 ...

  3. Kafka实战-入门

    1.概述 经过一个多月的时间观察,业务上在集成Kafka后,各方面还算稳定,这里打算抽时间给大家分享一下Kafka在实际场景中的一些使用心得.本篇博客打算先给大家入个门,让大家对Kafka有个初步的了 ...

  4. Zuul过滤器

    1.Zuul过滤器生命周期Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期.a.pre: 这种过滤器在请求被路由之前调用.可利用这种 ...

  5. 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, ...

  6. 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乱写文章,误导别人!!我今天看了很多关于这个错误的中文文章,结果都没能 ...

  7. [转]在Node.js中使用RabbitMQ系列一 Hello world

    本文转自:https://www.cnblogs.com/cpselvis/p/6288330.html 在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队 ...

  8. 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

    错误提示:可能会导致循环或多重级联路径.请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束. 原因:自表连接(同一张表 ...

  9. ES6+ 开发 React 组件

    在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣. 类 迄今为止,最能体现我们使用 ES6+ 来编写 React 组件的就是 ...

  10. [android] 图片的缩放

    界面布局,线性布局,竖直排列,两个ImageView 获取到两个ImageView对象 调用BitmapFactory.decodeResource(res,id)方法,获取Bitmap对象 参数:r ...