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. Ubuntu 13.10下安装ns2 2.35遇到的小问题

    前面下载安装的环节我就不多说了,网上已经有很多的例子,最全的是一个新浪网友写的博客:http://blog.sina.com.cn/s/blog_785a23ae0100xraq.html.他使用的是 ...

  2. Java程序员必须掌握的常用Linux命令。

    Java程序员也是半个运维了,在日常开发中经常会接触到Linux环境操作.小公司的开发人员甚至是兼了全运维的工作,下面整理了一些常用的Linux操作命令. Linux常用指令 ls 显示文件或目录 - ...

  3. XyTalk企业即时通讯IM开始开源

    网址: https://gitee.com/475660/xyTalk-pc https://github.com/xy-Group/xyTalk-pc Xy.Platform是一个高性能.可扩展的企 ...

  4. Python函数——命名空间与闭包

    前言 执行以下代码 def my_test(): x = 1 y = x+1 print(x) >> Traceback (most recent call last): File &qu ...

  5. 启动elasticsearch报错

    could not find java; set JAVA_HOME or ensure java is in PATH 首先需要安装java 1.yum list installed |grep j ...

  6. C语言第八讲,指针*

    C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型. 为什么这样说. 假设有两个变量,如下 ...

  7. 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化

      在本节中,我们将学习如何利用DataParallel使用多个GPU. 在PyTorch中使用多个GPU非常容易,你可以使用下面代码将模型放在GPU上: model.gpu() 然后,你可以将所有张 ...

  8. 自定义Fiddler插件一

    上个月自定义了一个Fiddler的插件,可以根据请求生成接口自动化测试的RF和Python代码,这样测试人员只需要手动操作页面用Fiddler抓取报文,就可以直接生成RF.Python代码,然后只需要 ...

  9. 简要描述 JavaScript 中定义函数的几种方式

    JavaScript 中,有三种定义函数的方式: 1.函数语句:即使用 function 关键字显式定义函数.如: function f(x){ return x+1; }  2.函数定义表达式:也称 ...

  10. LeetCode子域名访问计数-Python3.7<五>

    上一篇:LeetCode 键盘行<四> 题目:https://leetcode-cn.com/problems/subdomain-visit-count/description/ 一个网 ...