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. MySQLdb和PIL安装

    最近将个人博客部署到树莓派上海真是颇费周折,尤其是在MySQLdb和PIL的安装上 MySQLdb 先说Windows吧(比较简单) 直接pip安装即可或者下载编译版更方便:http://source ...

  2. redisAPI整理

    全局命令 1.查看所有键 keys * 2.键总数 dbsize 3.检查键是否存在 exists key 4.删除键 del key del key1 key2 key3 5.键过期 expire ...

  3. URAL 1203 Scientific Conference 简单dp 难度:0

    http://acm.timus.ru/problem.aspx?space=1&num=1203 按照结束时间为主,开始时间为辅排序,那么对于任意结束时间t,在此之前结束的任务都已经被处理, ...

  4. The main points of capacitive screen technology

  5. Linux系统中DHCP的配置

    DHCP为动态主机配置协议,负责IP地址的动态分配(当一个主机的IP为自动,则不需要自己写IP,他会在DHCP服务器的范围内自动获取) 在真机或虚拟机下配置DHCP服务时,需要先下载dhcp软件,使用 ...

  6. c# DataTable行转列

    /// <summary> /// datatable行转列 /// </summary> /// <param name="dtSrc">来源 ...

  7. Linux:join命令详解

    join 处理两个文件之间的数据,并且将两个文件中有相同的数据的那一行加在一起 语法 join(选项)(file1 file2) 选项 -a<1或2>:除了显示原来的输出内容之外,还显示指 ...

  8. Shell 命令行获取本机IP,grep的练习

    Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...

  9. [Linux] find文件查找和grep文件内容查找

    在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区别的: (1)find命令:根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时 ...

  10. [IC]Lithograph(1)光刻技术分析与展望

    文章主体转载自: 1.zol摩尔定律全靠它 CPU光刻技术分析与展望 2.wiki:Extreme ultraviolet lithography 3.ITRS 2012 1. 光刻技术组成和关键点 ...