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,实质上 ...
随机推荐
- JAVA运行war包
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m java %JAVA_OPTS% ...
- MyCat入门指南
入门篇 1. 安装 1.1从https://github.com/MyCATApache/Mycat-download下载压缩包 1.2解压缩后复制到相应目录下面,比如/usr/local ...
- 12.18 分布式系统下的session
广义的session: 会话控制,可以理解成为一种保存key-value的机制 从key的方面来看:sessionId和token sessionId: 服务端请求客户端的时候,服务端通过setcoo ...
- SpringInAction--面向切片的Spring以及如何使用注解创建切面
什么叫做切片..什么叫做AOP... 与大多数技术一样,AOP已经形成了自己的术语.描述切面的常用术语有通知(advice).切点(pointcut)和连接点(join point). (一大串书上的 ...
- Redis数据库的学习及与python的交互
1. 数据库简介: 当前主要使用两种类型的数据库:关系型数据库(RDBMS).非关系型数据库(NoSQL); (1). 关系型数据库RDBMS: 是建立在关系模型基础上的数据库,借助于集合代数等数学概 ...
- Linux下的软件的安装
一.yum相关介绍及命令 [1] 用来管理软件的一个命令.通过该命令完成对软件的下载.卸载等操作. [2] 命令:(必须在yum搭建成功后才能正常运行) yum clean all 清楚 ...
- Java对多线程的支持
Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行. 在Java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程 ...
- poscms基于list标签实现的查询分页功能
poscms系统本身有一个在查询页(search页面)实现的查询分页功能,基于系统封装的php函数dr_search_url() 但是今天的需求除了导航栏.列表页.详情页都实现查询功能外,关键是有两个 ...
- String.prototype.getParm
String.prototype.getParms=function(name){ var reg = new RegExp('(^|&)' + name + '=([^&]*)(&a ...
- libcurl使用认证证书 https认证
在server.xml中增加下面的内容: ciphers="SSL_RSA_WITH_RC4_128_SHA" 下面是libcurl 的测试代码: #include <std ...