MyBatis基本使用
MyBatis是轻量级的数据库访问API,封装了JDBC操作,可以实现对实体对象的CRUD操作。
MyBatis体系结构主要组成部分:
配置文件:SqlMapConfig.xml 主配置文件
声明了数据库连接参数,引用了映射文件
映射文件: 每个实体一个映射文件
映射文件与 Mapper接口对应。
映射文件中:
每个Mapper接口中的方法,对应映射文件中的SQL语句。
使用步骤:
使用MyBatis
1 导入包
2 创建配置文件
3 创建实体和Mapper接口,已经映射文件
4 使用 工厂创建SqlSession
5 创建Mapper接口对象,执行接口方法
下面来详细介绍。
1),加载配置
两钟形式,一种是XML配置文件,另一种是JAVA代码的注解。
MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句,结果映射配置),并将其存储在内存中。
A)SqlMapConfig.xml
只有一个,用于配置数据库连接参数和框架参数。
Java代码
- <?xml version="1.0" encoding="UTF-8" ?>
- <!--这段代码不能掉,否则出现异常-->
- <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
- "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
- <configuration>
- <!--配置数据库连接 -->
- <environments default="environment">
- <environment id="environment">
- <transactionManager type="JDBC" />
- <dataSource type="POOLED">
- <property name="driver"
- value="oracle.jdbc.OracleDriver" />
- <property name="url"
- value="jdbc:oracle:thin:@localhost:1521:XE" />
- <property name="username" value="root" />
- <property name="password" value="root" />
- </dataSource>
- </environment>
- </environments>
- <!-- 引入 Dept.xml 配置 -->
- <mappers>
- <mapper resource="com/lydia/entity/Dept.xml"/>
- </mappers>
- </configuration>
B) 实体类对应的映射文件
Dept.xml ,该配置文件是映射Dept.java实体类的
Java代码
- <!-- Dept.xml 在com.lydia.entity 包中 -->
- <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
- "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
- <!-- namespace 的值是 DeptMapper 接口
- 每个Mapper 接口对应一个配置文件 -->
- <mapper
- namespace="com.lydia.entity.DeptMapper"> <!--此处的DeptMapper是我们封装的接口-->
- <insert id="addDept"
- parameterType="com.lydia.entity.Dept">
- <selectKey keyProperty="deptno"
- order="BEFORE"
- resultType="int">
- select SEQ_T_DEPT.nextval
- from DUAL
- </selectKey>
- insert into T_DEPT (deptno, dname,
- loc) values
- (#{deptno}, #{dname}, #{loc})
- </insert>
- <delete id="deleteDept"
- parameterType="com.lydia.entity.Dept">
- delete from T_DEPT
- where deptno = #{deptno}
- </delete>
- <select id="findDeptById"
- parameterType="java.lang.Integer"
- resultType="com.lydia.entity.Dept">
- select deptno,dname,loc
- from T_DEPT where deptno=#{deptno}
- </select>
- <update id="updateDept"
- parameterType="com.lydia.entity.Dept">
- <!-- #{deptno} 读取参数的Bean属性 -->
- update T_DEPT set dname=#{dname},
- loc = #{loc} where deptno=#{deptno}
- </update>
- <!-- 注意resultType 的值是List中元素类型
- 结果集行映射的数据类型-->
- <select id="findAllDept"
- resultType="com.lydia.entity.Dept">
- select deptno, dname, loc
- from T_DEPT
- </select>
- <select id="findDeptByLoc"
- parameterType="java.lang.String"
- resultType="com.lydia.entity.Dept">
- select deptno, dname, loc
- from T_DEPT where loc=#{loc}
- </select>
- <select id="findAllDname"
- parameterType="java.lang.String"
- resultType="java.util.Map">
- select dname from T_DEPT
- where loc=#{loc}
- </select>
- </mapper>
注意:这里特别要注意主键ID的处理。
本案例中使用Oracle,那么要先创建序列 CREATE SEQUENCE SEQ_T_DEPT; 然后使用<select-key>..
如果是MySQL 或者 DB2,主键ID是自动增长的,可以如下设置:
Java代码
- <!-- 自增类型(MySql SqlServer DB2 Derby)-->
- <insert id="addDept" useGeneratedKeys="true"
- keyProperty="deptno"
- parameterType="com.tarean.entity.Dept">
- insert into T_DEPT(dname, loc)
- values (#{dname},#{loc})
- </insert>
2),SQL解析
当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map,JavaBean,基本数据类型))。MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析。解析后可以得到最终要执行的SQL和参数。
3),结果映射
将操作数据库的结果按照映射的配置进行转换。可以转换成HashMap,JavaBean或者基本数据类型,并最终将结果返回。
创建DeptMapper.java接口,该接口中封装了Dept.xml中指定的SQL方法。
Java代码
- /**
- * Mapper接口,类似于Dao,但是语法有限定
- * 不能有重载
- * Mapper 定义实体Dept对象的CRUD操作
- *该类中的方法名必须和Dept.xml中SQL的id一致
- */
Java代码
- public interface DeptMapper {
- void addDept(Dept dept);
- void deleteDept(Dept dept);
- void updateDept(Dept dept);
- Dept findDeptById(Integer deptno);
- List<Dept> findAllDept();
- List<Dept> findDeptByLoc(String loc);
- List<Map<String, Object>> findAllDname(
- String loc);
- }
MyBatis框架中设计到的几个API
SqlSessionFactoryBuilder
--该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
SqlSessionFactory
--每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。
SqlSession
--该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句
TestCass.java类负责调用MyBatis中的基本API来操作数据库。
Java代码
- package com.lydia.test;
- import java.io.Reader;
- import java.sql.Connection;
- import java.util.List;
- import java.util.Map;
- 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 com.lydia.entity.Dept;
- import com.lydia.entity.DeptMapper;
- public class TestCase {
- // @Test
- public void testSqlSession() throws Exception {
- String cfg = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(cfg);
- //创建builder对象
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- SqlSessionFactory factory = builder.build(reader);
- //创建session
- SqlSession session = factory.openSession();
- Connection conn = session.getConnection();
- System.out.println(conn);
- System.out.println(conn.getMetaData().getDatabaseProductName());
- conn.close();
- session.close();
- }
- @Test
- public void testAddDept() throws Exception {
- String cfg = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(cfg);
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- SqlSessionFactory factory = builder.build(reader);
- SqlSession session = factory.openSession();
- // +++++++++++++++++++++++++++++++++++++++
- // 通过Mapper映射器去执行SQL
- // DeptMapper mapper =
- // session.getMapper(DeptMapper.class);
- // Dept dept = new Dept("C++","武汉");
- // mapper.addDept(dept);
- // System.out.println(dept);
- // +++++++++++++++++++++++++++++++++++++++
- // 通过session去执行SQL
- Dept dept = new Dept("C++", "武汉");
- session.insert("addDept", dept);
- // +++++++++++++++++++++++++++++++++++++++
- session.commit();
- session.close();
- }
- // @Test
- public void testDelete() throws Exception {
- String cfg = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(cfg);
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- SqlSessionFactory factory = builder.build(reader);
- SqlSession session = factory.openSession();
- DeptMapper mapper = session.getMapper(DeptMapper.class);
- Dept dept = mapper.findDeptById(2);
- mapper.deleteDept(dept);
- System.out.println(dept);
- Dept d = mapper.findDeptById(2);
- System.out.println(d);
- session.commit();
- session.close();
- }
- @Test
- public void testFindAll() throws Exception {
- String cfg = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(cfg);
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- SqlSessionFactory factory = builder.build(reader);
- SqlSession session = factory.openSession();
- DeptMapper mapper = session.getMapper(DeptMapper.class);
- List<Dept> list = mapper.findAllDept();
- for (Dept dept : list) {
- System.out.println(dept);
- }
- session.close();
- }
- // @Test
- public void testUpdate() throws Exception {
- String cfg = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(cfg);
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- SqlSessionFactory factory = builder.build(reader);
- SqlSession session = factory.openSession();
- DeptMapper mapper = session.getMapper(DeptMapper.class);
- Dept d = mapper.findDeptById(4);
- d.setDname("PHP");
- d.setLoc("苏州桥");
- mapper.updateDept(d);
- List<Dept> list = mapper.findAllDept();
- for (Dept dept : list) {
- System.out.println(dept);
- }
- session.commit();
- session.close();
- }
- // @Test
- public void testMap() throws Exception {
- String cfg = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(cfg);
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- SqlSessionFactory factory = builder.build(reader);
- SqlSession session = factory.openSession();
- DeptMapper mapper = session.getMapper(DeptMapper.class);
- List<Map<String, Object>> list = mapper.findAllDname("苏州桥");
- System.out.println(list);
- session.close();
- }
- @Test
- public void testPage() throws Exception {
- String cfg = "SqlMapConfig.xml";
- SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
- Reader reader = Resources.getResourceAsReader(cfg);
- SqlSessionFactory factory = builder.build(reader);
- SqlSession session = factory.openSession();
- //+++++++++++++++++++++++++++++++++++++
- RowBounds bounds = new RowBounds(0, 2);
- //此处用的selectList(arg1,arg2,arg3); 中间arg2参数不要掉
- List<Dept> list = session.selectList("findAllDept",null, bounds);
- for (Dept dept : list) {
- System.out.println(dept);
- }
- session.commit();
- session.close();
- //+++++++++++++++++++++++++++++++++++++
- }
- }
注意:上面调用CRUD的操作方法也可以使用以下的代替
Java代码
- String cfg = "SqlMapConfig.xml";
- Reader reader =
- Resources.getResourceAsReader(cfg);
- SqlSessionFactoryBuilder builder=
- new SqlSessionFactoryBuilder();
- SqlSessionFactory factory =
- builder.build(reader);
- SqlSession session =
- factory.openSession();
- Dept dept = new Dept("C++","武汉");
- session.insert("addDept", dept);
- session.commit();
- session.close();
ResultMap映射定义:
在Dept.xml中定义<select>操作时,如果查询结果字段名和javaBean属性不一致,需要使用<resultMap>元素显示指定映射关系。例如Dept.java中的属性是 no,name,loc,那么应该如下配置:
Java代码
- <select id ="findAll2" resultMap="deptMap">
- select DEPTNO,DNAME,LOC from DEPT
- </select>
- <resultMap id = "deptMap" type="com.lydia.Dept">
- <result property="no" column="deptno"/>
- <result property="name" column="dname"/>
- <result property="loc" column="loc"/>
- </resultMap>
MyBatis基本使用的更多相关文章
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...
- mybatis plugins实现项目【全局】读写分离
在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...
- MyBatis基础入门--知识点总结
对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- MyBatis源码分析(一)开篇
源码学习的好处不用多说,Mybatis源码量少.逻辑简单,将写个系列文章来学习. SqlSession Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSes ...
- (整理)MyBatis入门教程(一)
本文转载: http://www.cnblogs.com/hellokitty1/p/5216025.html#3591383 本人文笔不行,根据上面博客内容引导,自己整理了一些东西 首先给大家推荐几 ...
- MyBatis6:MyBatis集成Spring事物管理(下篇)
前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基 ...
随机推荐
- Mac 桌面软件开发基础问答
1> Mac OS X平台下的桌面软件是由什么编程语言处理 答: 由Objective-C, swift编程语言处理 2> Mac OS X平台下的桌面软件是由什么框架构建 答: 由Coc ...
- Spring Boot整合邮件发送
概述 Spring Boot下面整合了邮件服务器,使用Spring Boot能够轻松实现邮件发送:整理下最近使用Spring Boot发送邮件和注意事项: Maven包依赖 <dependenc ...
- pandas设置值-【老鱼学pandas】
本节主要讲述如何根据上篇博客中选择出相应的数据之后,对其中的数据进行修改. 对某个值进行修改 例如,我们想对数据集中第2行第2列的数据进行修改: import pandas as pd import ...
- Scala模式匹配| 隐式转换
1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...
- JDK 5~8的特性对比
原文请参考:https://bbs.csdn.net/topics/392062347 jdk5新特性 1.自动装箱和拆箱2.枚举3.静态导入4.可变参数5.內省 是Java语言对Bean类属性. ...
- 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结
20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
- hwy题目选讲
\[ f(n) = n/5 + f(n/5)\\ g(n) = (n\mod10)! * g(n/5)\mod 5\\ ans = f(n)*inv(2^g(n))\\ \]
- 使用 Java 将多个文件压缩成一个压缩文件
使用 Java 将多个文件压缩成一个压缩文件 一.内容 ①使用 Java 将多个文件打包压缩成一个压缩文件: ②主要使用 java.io 下的类 二.源代码:ZipMultiFile.java pac ...
- CF444E. DZY Loves Planting
题目链接 CF444E. DZY Loves Planting 题解 可以..二分网络流 可是 考虑边从小到大排序 考虑每条边能否成为答案 用并查集维护节点之间的联通性 对于一条边来说,如果这条边可以 ...
- Torch功能点记录
1. Numpy矩阵转换Tensor: tensor_num = torch.from_numpy(numpy_arr)