Unit07: MyBatis框架简介 、 MyBatis基本应用
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基本应用的更多相关文章
- JavaWeb_(Mybatis框架)使用Mybatis对表进行增、删、改、查操作_二
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- MyBatis框架之mybatis逆向工程自动生成代码
http://www.jb51.net/article/82062.htm Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们 ...
- MyBatis框架简介
1.下载地址:下载地址:https://github.com/mybatis/mybatis-3/releases 2.MyBatis是什么? MyBatis 本是apache的一个开源项目iBati ...
- mybatis框架(1)---mybatis入门
mybatis入门 MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...
- Mybatis框架(8)---Mybatis插件原理
Mybatis插件原理 在实际开发过程中,我们经常使用的Mybaits插件就是分页插件了,通过分页插件我们可以在不用写count语句和limit的情况下就可以获取分页后的数据,给我们开发带来很大 的便 ...
- Mybatis框架(9)---Mybatis自定义插件生成雪花ID做为表主键项目
Mybatis自定义插件生成雪花ID做为主键项目 先附上项目项目GitHub地址 spring-boot-mybatis-interceptor 有关Mybatis雪花ID主键插件前面写了两篇博客作为 ...
- mybatis框架(7)---mybatis逆向工程
mybatis逆向工程 逆向工程的目的就是缩减了我们的开发时间.所谓mybatis逆向工程,就是mybatis会根据我们设计好的数据表,自动生成pojo.mapper以及mapper.xml. 接 ...
- Mybaits 源码解析 (一)----- 搭建一个mybatis框架(MyBatis HelloWorld)
源码分析之前先搭一个mybatis的demo,这个在看源码的时候能起到了很大的作用,因为在看源码的时候,会恍然大悟,为什么要这么配置,为什么要这么写.(老鸟可以跳过这篇) 开发环境的准备 创建mave ...
- Mybatis笔记 - Mybatis框架简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上 ...
随机推荐
- 【Python】测算代码运行时间
整理自这里和这里 timeit模块 timeit模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句 ...
- Python中面向对象的一些关于私有变量和继承的理解
成员可见性,变量和方法的可见性.使用“__”开头的变量和方法为私有变量和方法 class Student(): def __init__(self, name, age): # 构造函数 # 初始化变 ...
- DNSmasq搭建DNS服务器
原文地址:http://jirry.me/2016/04/19/dnsmasq-on-aliyun/ DNSmasq 是一个小巧且方便地用于配置 DNS 和 DHCP 的工具,适用于小型网络,它提供了 ...
- 从userAgent判断浏览器是什么(chorme ie 火狐)浏览器类型检测、浏览器检测
一.正确的方法: 通过navigator对象的userAgent属性来判断, 主要是判断userAgent 的信息里是否含有以下字段信息: js代码(非完整版) /************ navig ...
- django中如何将多个app归到一个目录下。
1.当startapps 生成多个app后,为了便于管理,可新建一个apps目录,把应用全部剪切进apps. 如果是在pycharm中,会提示是否自动更新路径,这里要全部选择取消. QQ群交流:697 ...
- 如何自定义FileZilla编辑文件的默认打开方式
看一下设置: 原来是人家默默认不给我们提示 改一下: 还是不行,还是跳到网页去了 还是不行 这样就好了...
- webpack 事件触发 按需加载
比较易懂, 方法简单 var util_sync = require('./util-sync.js') alert(util_sync.data) document.getElementById(& ...
- JFinal源码详解
JFinal的框架我24号的一篇博文写到过,它优秀的地方在精简代码上,那么有两处源码是我觉得是值得我们要好好解析一下,一处是初始化加载—servlet跳转,另一处是DB+ActiveRecord的映射 ...
- Android程序员学WEB前端(5)-HTML(5)-框架集-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76576279 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 框架集: index7. ...
- Unity3D 屏幕空间雪场景Shader渲染
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...