Unit07: MyBatis框架简介 、 MyBatis基本应用  

1. myBatis

(1)myBatis是什么?

是一个开源的持久层框架。
注:myBatis底层仍然是jdbc。

(2)编程步骤

step1. 导包。
mybatis,ojdbc,junit。
step2. 添加配置文件。
注:配置文件主要包含连接池的配置和映射文件的位置。
step3. 写实体类。
注:属性名必须跟表的字段名一样(大小写不区分)。
step4. 写映射文件。
注:映射文件主要包含的是sql语句。
step5. 使用SqlSession提供的方法来访问数据库。

(3)基本原理

(4)返回Map类型的结果

myBatis会将查询到的记录放到一个Map对象里面(会以字段名为key, 字段值作为value),然后再将Map对象里面的数据放到实体对象里面。

(5)解决表的字段名与实体类的属性名不一致的情况

方式一:使用别名来解决。
方式二: 使用ResultMap来解决。

(6)Mapper映射器

Mapper映射器是什么?

是符合映射文件要求的接口。
注:myBatis会依据该接口的要求生成一个相应的实例。

具体要求:

a. 方法的名称必须与sql的id一样。
b. 方法的返回值类型必须与sql的resultType一样。
c. 方法的参数类型必须怀sql的parameterType一样。

d. 映射文件的namespace必须等于该接口的完整的名称。

如何使用?

step1. 先按照映射文件要求写好相应的接口,比如EmployeDAO。

step2. 调用SqlSession的方法获得符合映射器要求的对象。

代码示例:

src/main/java

dao (Mapper映射器的接口类)

package dao;

import java.util.List;
import java.util.Map; import entity.Employee;
import entity.Employee2; /**
* Mapper映射器
*
*/
public interface EmployeeDAO {
public void save(Employee e);
public List<Employee> findAll();
public Employee findById(int id);
public void modify(Employee e);
public void delete(int id);
public Map findById2(int id);
public Employee2 findById3(int id);
}

EmployeeDAO.java

entity

  Employee2.java类,测试表里字段名,和数据库中的字段名不一致时情况。

package entity;

public class Employee {
private Integer id;
private String name;
private Integer age; @Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
} }

Employee.java

package entity;

public class Employee2 {
private Integer empNo;
private String ename;
private Integer age; @Override
public String toString() {
return "Employee2 [empNo=" + empNo + ", ename=" + ename + ", age=" + age + "]";
} public void setEmpNo(Integer empNo) {
this.empNo = empNo;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setAge(Integer age) {
this.age = age;
} }

Employee2.java

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="dao.EmployeeDAO">
<!--
id:要求唯一
parameterType:参数类型,要写类的完整的名称。
-->
<insert id="save"
parameterType="entity.Employee">
INSERT INTO emp_czh
VALUES(emp_czh_seq.nextval,#{name},#{age})
</insert> <!--
resultType:返回类型,要写类的完整的名称。
-->
<select id="findAll"
resultType="entity.Employee">
SELECT * FROM emp_czh
</select> <select id="findById"
parameterType="int"
resultType="entity.Employee">
SELECT * FROM emp_czh
WHERE id = #{id1}
</select> <update id="modify"
parameterType="entity.Employee">
UPDATE emp_czh SET name = #{name},
age = #{age} WHERE id = #{id}
</update> <delete id="delete" parameterType="int">
DELETE FROM emp_czh WHERE id = #{id1}
</delete> <!-- 返回Map类型的结果 -->
<!--
map是java.util.Map的简写形式
-->
<select id="findById2" parameterType="int"
resultType="map">
SELECT * FROM emp_czh WHERE id = #{id1}
</select> <!--
resultMap告诉mybatis表的字段名
与实体类的属性名的对应关系。
(如果表的字段名与属性名相同,则不用写了)
-->
<resultMap type="entity.Employee2"
id="empResultMap">
<result property="empNo" column="id"/>
<result property="ename" column="name"/>
</resultMap> <select id="findById3" parameterType="int"
resultMap="empResultMap">
SELECT * FROM emp_czh WHERE id = #{id1}
</select>
</mapper>

EmpMapper.xml

src/main/resources

<?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" />
<!-- mybatis自带的连接池 -->
<dataSource type="POOLED">
<property name="driver"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@192.168.201.227:1521:orcl" />
<property name="username" value="openlab" />
<property name="password" value="open123" />
</dataSource>
</environment>
</environments>
<!-- 告诉mybatis,映射文件的位置 -->
<mappers>
<mapper resource="entity/EmpMapper.xml" />
</mappers> </configuration>

SqlMapConfig.xml

src/test/java

test

  TestCase2.java测试使用映射器的情况。

package test;

import java.util.List;
import java.util.Map; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import entity.Employee;
import entity.Employee2; public class TestCase {
private SqlSession session;
@Before
//执行测试方法(比如test1方法)之前,
//@Before方法会先执行。
public void init(){
/*
* 先要获得SqlSession,然后再调用
* SqlSession提供的方法来访问数据库。
*/
//step1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb =
new SqlSessionFactoryBuilder();
//step2. 创建SqlSessionFactory对象
SqlSessionFactory ssf =
ssfb.build(
TestCase.class.getClassLoader()
.getResourceAsStream("SqlMapConfig.xml"));
//step3. 创建SqlSession对象
session =
ssf.openSession();
} @Test
public void test1(){
//step4. 调用SqlSession提供的方法访问数据库
Employee e = new Employee();
e.setName("Tom");
e.setAge(22);
session.insert("test.save", e);
//step5. 提交事务
//session.commit();
//step6.关闭session
session.close();
} @Test
public void test2(){
List<Employee> employees =
session.selectList("test.findAll");
System.out.println(employees);
session.close();
} @Test
public void test3(){
Employee e =
session.selectOne(
"test.findById", 5);
System.out.println(e);
session.close();
} @Test
public void test4(){
Employee e =
session.selectOne(
"test.findById", 5);
e.setAge(e.getAge() + 20);
session.update("test.modify",
e);
session.commit();
session.close();
} @Test
public void test5(){
session.delete("test.delete", 5);
session.commit();
session.close();
} @Test
//测试 返回Map类型的结果
public void test6(){
Map data =
session.selectOne(
"test.findById2", 6);
/*
* oracle数据库中,表的字段名都是大写的。
*/
System.out.println(data.get("NAME"));
session.close();
} @Test
//测试 解决实体类属性与表的字段名不一致的情况
public void test7(){
Employee2 e =
session.selectOne(
"test.findById3",6);
System.out.println(e);
session.close();
}
}

TestCase.java

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import dao.EmployeeDAO;
import entity.Employee; public class TestCase2 {
private SqlSession session;
@Before
//执行测试方法(比如test1方法)之前,
//@Before方法会先执行。
public void init(){
/*
* 先要获得SqlSession,然后再调用
* SqlSession提供的方法来访问数据库。
*/
//step1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb =
new SqlSessionFactoryBuilder();
//step2. 创建SqlSessionFactory对象
SqlSessionFactory ssf =
ssfb.build(
TestCase.class.getClassLoader()
.getResourceAsStream("SqlMapConfig.xml"));
//step3. 创建SqlSession对象
session =
ssf.openSession();
}
@Test
public void test1(){
//获得符合映射器(接口)要求的对象
EmployeeDAO dao =
session.getMapper(
EmployeeDAO.class);
Employee e = new Employee();
e.setName("Eric");
e.setAge(23);
dao.save(e);
//仍然需要提交事务
session.commit();
session.close();
} @Test
public void test2(){
EmployeeDAO dao =
session.getMapper(
EmployeeDAO.class);
List<Employee> employees =
dao.findAll();
System.out.println(employees);
session.close();
} @Test
public void test3(){
EmployeeDAO dao =
session.getMapper(EmployeeDAO.class);
Employee e = dao.findById(6);
System.out.println(e);
session.close();
}
}

TestCase2.java

  <dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>

pom.xml

Unit07: MyBatis框架简介 、 MyBatis基本应用的更多相关文章

  1. JavaWeb_(Mybatis框架)使用Mybatis对表进行增、删、改、查操作_二

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  2. MyBatis框架之mybatis逆向工程自动生成代码

    http://www.jb51.net/article/82062.htm Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们 ...

  3. MyBatis框架简介

    1.下载地址:下载地址:https://github.com/mybatis/mybatis-3/releases 2.MyBatis是什么? MyBatis 本是apache的一个开源项目iBati ...

  4. mybatis框架(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  5. Mybatis框架(8)---Mybatis插件原理

    Mybatis插件原理 在实际开发过程中,我们经常使用的Mybaits插件就是分页插件了,通过分页插件我们可以在不用写count语句和limit的情况下就可以获取分页后的数据,给我们开发带来很大 的便 ...

  6. Mybatis框架(9)---Mybatis自定义插件生成雪花ID做为表主键项目

    Mybatis自定义插件生成雪花ID做为主键项目 先附上项目项目GitHub地址 spring-boot-mybatis-interceptor 有关Mybatis雪花ID主键插件前面写了两篇博客作为 ...

  7. mybatis框架(7)---mybatis逆向工程

    mybatis逆向工程 ​ 逆向工程的目的就是缩减了我们的开发时间.所谓mybatis逆向工程,就是mybatis会根据我们设计好的数据表,自动生成pojo.mapper以及mapper.xml. 接 ...

  8. Mybaits 源码解析 (一)----- 搭建一个mybatis框架(MyBatis HelloWorld)

    源码分析之前先搭一个mybatis的demo,这个在看源码的时候能起到了很大的作用,因为在看源码的时候,会恍然大悟,为什么要这么配置,为什么要这么写.(老鸟可以跳过这篇) 开发环境的准备 创建mave ...

  9. Mybatis笔记 - Mybatis框架简介

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上 ...

随机推荐

  1. 【Error】2003 - Can't connect to MySQL server on 'localhost' (10038)

    此错误主要是连接MySQL地址的地址搞错了. 可以看下 MySQL 的配置文件 /etc/mysql/my.cnf, 其中绑定的本地地址如下: bind-address=127.0.0.1 将其注释掉 ...

  2. [转载]java实现word转pdf

    最近遇到一个项目需要把word 转成pdf,百度了一下网上的方案有很多,比如虚拟打印.给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这 ...

  3. [Web UI]对比Angular/jQueryUI/Extjs:没有一个框架是万能的

    Angular不能做什么?对比Angular/jQueryUI/Extjs 框架就好比兵器,你得明白你手里拿的是屠龙刀还是倚天剑,刀法主要是砍,剑法主要是刺.对于那些职业喷子和脑残粉,小僧送你们两个字 ...

  4. 【2018多校第一场】hdu6308-Time Zone(日期)

    Problem Description Chiaki often participates in international competitive programming contests. The ...

  5. 十三、dbms_flashback(用于激活或禁止会话的flashback特征)

    1.概述 作用:用于激活或禁止会话的flashback特征,为了使得普通用户可以使用该包,必须要将执行该包的权限授予这些用户,grant execute on dbms_flashback to sc ...

  6. vue 自定义拖拽指令

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. APUE学习笔记——7main()函数启动与退出

    程序的启动与退出过程 先上图,了解进程运行的机制.     内核首先调用exec,运行C启动进程,C启动进程会调用main()函数.     其他所有函数都是由main函数直接或间接调用的.     ...

  8. 2017-2018-2 20165202 实验四《Android程序设计》实验报告

    一.实验报告封面 二.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握Android中事件处理机制. ...

  9. ASP.NET MVC 中使用用户控件——转

    讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件,   我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C ...

  10. obj-y,obj-m 区别

    obj-y:把由foo.c 或者 foo.s 文件编译得到foo.o 并连接进内核.obj-m: 则表示该文件作为模块编译.除了y.m以外的obj-x 形式的目标都不会被编译. 除了obj-形式的目标 ...