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,实质上 ...
随机推荐
- 【Error】2003 - Can't connect to MySQL server on 'localhost' (10038)
此错误主要是连接MySQL地址的地址搞错了. 可以看下 MySQL 的配置文件 /etc/mysql/my.cnf, 其中绑定的本地地址如下: bind-address=127.0.0.1 将其注释掉 ...
- [转载]java实现word转pdf
最近遇到一个项目需要把word 转成pdf,百度了一下网上的方案有很多,比如虚拟打印.给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这 ...
- [Web UI]对比Angular/jQueryUI/Extjs:没有一个框架是万能的
Angular不能做什么?对比Angular/jQueryUI/Extjs 框架就好比兵器,你得明白你手里拿的是屠龙刀还是倚天剑,刀法主要是砍,剑法主要是刺.对于那些职业喷子和脑残粉,小僧送你们两个字 ...
- 【2018多校第一场】hdu6308-Time Zone(日期)
Problem Description Chiaki often participates in international competitive programming contests. The ...
- 十三、dbms_flashback(用于激活或禁止会话的flashback特征)
1.概述 作用:用于激活或禁止会话的flashback特征,为了使得普通用户可以使用该包,必须要将执行该包的权限授予这些用户,grant execute on dbms_flashback to sc ...
- vue 自定义拖拽指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- APUE学习笔记——7main()函数启动与退出
程序的启动与退出过程 先上图,了解进程运行的机制. 内核首先调用exec,运行C启动进程,C启动进程会调用main()函数. 其他所有函数都是由main函数直接或间接调用的. ...
- 2017-2018-2 20165202 实验四《Android程序设计》实验报告
一.实验报告封面 二.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握Android中事件处理机制. ...
- ASP.NET MVC 中使用用户控件——转
讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件, 我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C ...
- obj-y,obj-m 区别
obj-y:把由foo.c 或者 foo.s 文件编译得到foo.o 并连接进内核.obj-m: 则表示该文件作为模块编译.除了y.m以外的obj-x 形式的目标都不会被编译. 除了obj-形式的目标 ...