第8章 Mybatis概述

8.1 几个概念

  1. ORM

    Object-Relationship Mapping 对象关系映射,它是一种思想,它的实质是将数据库中的数据用对象的形式表现出来。

  2. JPA

    Java Persistence API 它是JavaEE关于ORM思想的标准接口,仅仅是一套规范和接口,它不是实现。

    Hibernate就是实现这一规范和接口的ORM组件(它是看不见SQL的)

    MyBatis是一个半ORM组件(基于SQL开发)

8.2 什么是MyBatis

Mybatis是一个实现了Java数据持久化的开源框架,简单的来说,它就是一个jdbc的封装组件。

Mybatis的前身是ibatis,ibatis 创建于2002年,最初始apache下面的一个开源项目,2010迁移到google code,并更名为Mybatis。

当前最新版本是3.4.x;本次课程讲版本3.3.1

Mybatis的优势:

  • 消除了大量的jdbc冗余代码(不用手动开关连接,创建statement,结果映射)
  • 简单易学,容易上手(基于sql的编程思想,提供了简单易用的api与数据库进行交互)
  • 很好的与各种数据库兼容(开发人员不需要考虑数据库间的差异性)
  • 提供了第三方很好的支持(分页插件、逆向工程、缓存组件)
  • 提供与Spring很好的集成支持。

8.3 Mybatis的开发环境搭建

1.新建Java项目,注意项目编码

2.引入mybatis的jar包:mybatis3.3.1.jar

3.引入mybatis依赖的jar包:

asm-3.3.jar (字节码生成器)

javassist-3.15.0.GA.jar (字节码生成器)

cglib-2.2.jar (cglib动态代理,字节码生成器)

commons-logging-1.1.1.jar (一个标准)

log4j-1.2.17.jar

4.引入Junit的包

junit-4.11.jar

hamcrest-core-1.3.jar

5.引入数据库的驱动包

mysql-connector-java-5.0.8-bin.jar

ojdbc14.jar

8.4 Mybatis的第一个Demo

8.4.1 测试数据准备

8.4.2 User实体类、Dao接口及实现类

1)User实体类

package com.steven.mybatis.sysmanage.entity;

import java.io.Serializable;
import java.sql.Timestamp; public class User implements Serializable{
private static final long serialVersionUID = -7800274451115044222L; private Long userId;
private String userName;
private String loginName;
private String password;
private Long deptId;
private Timestamp birthday;
private Timestamp tvUpdate; @Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", loginName=" + loginName + ", password="
+ password + ", deptId=" + deptId + ", birthday=" + birthday + ", tvUpdate=" + tvUpdate + "]";
} public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
public Timestamp getBirthday() {
return birthday;
}
public void setBirthday(Timestamp birthday) {
this.birthday = birthday;
}
public Timestamp getTvUpdate() {
return tvUpdate;
}
public void setTvUpdate(Timestamp tvUpdate) {
this.tvUpdate = tvUpdate;
} }

2)Dao接口

package com.steven.mybatis.sysmanage.dao;

import java.util.List;

import com.steven.mybatis.sysmanage.entity.User;

public interface IUserDao {
/**
* 根据用户id查询用户信息
* @param UserId
* @return
*/
public User getUserById(Long UserId); /**
* 查询所有用户信息
* @return
*/
public List<User> getUserList(); /**
* 增加用户对象
* @param user
* @return
*/
public boolean addUser(User user); /**
* 删除用户对象
* @param user
* @return
*/
public boolean delUser(User user); /**
* 修改用户对象
* @param user
* @return
*/
public boolean updateUser(User user);
}

3)Dao接口实现类

package com.steven.mybatis.sysmanage.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import com.steven.mybatis.sysmanage.dao.IUserDao;
import com.steven.mybatis.sysmanage.entity.User; public class UserDao implements IUserDao{
private SqlSessionFactory sqlSessionFactory; public UserDao(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory = sqlSessionFactory;
} @Override
public User getUserById(Long UserId) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("user.getUserById", 1L);
sqlSession.close();
return user;
} @Override
public List<User> getUserList() {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> userList = sqlSession.selectList("user.getUserList");
sqlSession.close();
return userList;
} @Override
public boolean addUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int rows = sqlSession.insert("user.addUser", user); boolean flag = false;
if(rows > 0){
flag = true;
}
//注意:在做增删改操作时,要记得提交
sqlSession.commit();
sqlSession.close();
return flag;
} @Override
public boolean delUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int rows = sqlSession.delete("user.delUser", user.getUserId());
boolean flag = false;
if(rows > 0){
flag = true;
}
sqlSession.commit();
sqlSession.close();
return flag;
} @Override
public boolean updateUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int rows = sqlSession.delete("user.updateUser", user); boolean flag = false;
if(rows > 0){
flag = true;
}
sqlSession.commit();
sqlSession.close();
return flag;
} }

8.4.3 引入Mybatis的主配置文件

mybatis-config.xml

1)默认引用那个数据库环境

2)加入所有的sql对象映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<!-- 默认引用那个数据库环境 -->
<environments default = "defaultEnv">
<environment id="defaultEnv">
<!-- 事务管理方法 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据库连接四要素 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_test"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments> <!-- 加入所有的映射文件 -->
<mappers>
<mapper resource="userMapper.xml"></mapper>
</mappers>
</configuration>

8.4.4 引入对象映射文件

userMapper.xml(我们在这个配置文件中编写增删改查语句)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace = "user">
<!--
1: id:表示一个sql句柄(相当于在jdbc的statement对象)
2: paremeterType :输入参数的类型 ,在sql语句中,通过占位符#{}来接收此参数
3: resultType: sql操作返回的结果类型
--> <select id="getUserById" parameterType="java.lang.Long"
resultType="com.steven.mybatis.sysmanage.entity.User">
SELECT USER_ID USERID,USER_NAME USERNAME,LOGIN_NAME LOGINNAME,
BIRTHDAY,TV_UPDATE TVUPDATE FROM M_USER WHERE USER_ID = #{userId}
</select> <!-- 查询所有用户的信息 -->
<select id="getUserList" resultType="com.steven.mybatis.sysmanage.entity.User">
SELECT USER_ID USERID,USER_NAME USERNAME,LOGIN_NAME LOGINNAME,
BIRTHDAY,TV_UPDATE TVUPDATE FROM M_USER
</select> <!-- 增加用户 -->
<insert id="addUser" parameterType="com.steven.mybatis.sysmanage.entity.User">
INSERT INTO M_USER(USER_NAME,LOGIN_NAME,BIRTHDAY,TV_UPDATE)
VALUES(#{userName},#{loginName},#{birthday},#{tvUpdate})
</insert> <!-- 删除用户 -->
<update id="delUser" parameterType="java.lang.Long">
DELETE FROM M_USER WHERE USER_ID = #{userId}
</update>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.steven.mybatis.sysmanage.entity.User">
UPDATE M_USER SET USER_NAME = #{userName},LOGIN_NAME=#{loginName},
BIRTHDAY=#{birthday} WHERE USER_ID = #{userId}
</update> </mapper>

8.4.5 测试

1)读取Mybatis的主配置文件

2)通过sqlSessionFactoryBuilder创建一个sqlSessionFactory

3)通过sqlSessionFactory创建sqlSession

4)调用sqlSession接口的方法来执行数据库的操作

5)打印测试

6)关闭sqlSession

package com.steven.mybatis.sysmanage.test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test; import com.steven.mybatis.sysmanage.dao.IUserDao;
import com.steven.mybatis.sysmanage.dao.impl.UserDao;
import com.steven.mybatis.sysmanage.entity.User; public class IbatisInterfaceTest {
static Logger log = Logger.getLogger(IbatisInterfaceTest.class); private SqlSessionFactory sqlSessionFactory; @Before
public void init() throws IOException{
//1.读取Mybatis的主配置文件
String configFile = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(configFile); //2.创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testGetUserById(){
IUserDao userDao = new UserDao(sqlSessionFactory);
log.info("根据用户id查询结果为:" + userDao.getUserById(1L));
} @Test
public void testGetUserList(){
IUserDao userDao = new UserDao(sqlSessionFactory);
log.info("查询所有用户记录行数为:" + userDao.getUserList().size());
} @Test
public void testAddUser(){
IUserDao userDao = new UserDao(sqlSessionFactory); User user = new User();
user.setUserName("zhangsan");
user.setLoginName("Mike");
user.setBirthday(new Timestamp(88,3,25,0,0,0,0));
log.info("增加用户操作是否成功:" + userDao.addUser(user));
} @Test
public void testUpdateUser(){
IUserDao userDao = new UserDao(sqlSessionFactory); User user = new User();
user.setUserId(2l);
user.setUserName("zhangsan");
user.setLoginName("Jerry");
log.info("更改用户操作是否成功:" + userDao.updateUser(user));
} @Test
public void testDelUser(){
IUserDao userDao = new UserDao(sqlSessionFactory); User user = new User();
user.setUserId(2l);
log.info("删除用户操作是否成功:" + userDao.delUser(user));
}
}

[Spring+SpringMVC+Mybatis]框架学习笔记(八):Mybatis概述的更多相关文章

  1. 03 Mybatis框架---学习笔记1--框架的概念及优势

    1.框架的概念 框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统.简单说就是使用别人搭好的舞台,你来做表演.而且,框架一般是成熟的,不断升级的软件.框架是我们软件开发中的一套解决方 ...

  2. 框架学习笔记之Mybatis(一)

    一.简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单 ...

  3. [Spring+SpringMVC+Mybatis]框架学习笔记(六):事务

    第7讲 事务 7.1 事务的概念 事务是一系列作为一个逻辑单元来执行的操作集合. 它是数据库维护数据一致性的单位,它讲数据库从一个一致状态,转变为新的另外一个一致状态.说的简单一点就是:如果一组处理步 ...

  4. Mybatis学习笔记(八) —— Mybatis整合spring

    一.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...

  5. 框架学习笔记之Mybatis(二)

    一.动态sql 通过mybatis提供的标签,实现sql语句的拼接. 1.where <select id="findUserList" parameterType=&quo ...

  6. Mybatis框架学习总结-优化Mybatis配置文件中的配置

    连接数据库的配置单独放在一个properties文件中 之前,是直接将数据库的连接配置信息卸载了Mybatis的conf.xml文件中,如下: <?xml version="1.0&q ...

  7. Mybatis框架学习总结-使用Mybatis对表执行CRUD操作

    使用MyBatis对表执行CRUD操作——基于XML的实现 1.创建(create)用户:在userMapper.xml文件中增加: <!-- 创建用户Create --> <ins ...

  8. SSM框架学习笔记_第1章_SpringIOC概述

    第1章 SpringIOC概述 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 1.1 控制反转IOC IOC(inversion of controller)是一种概念 ...

  9. j2ee开发之Spring2.5框架学习笔记

    Spring 2.5框架学习笔记 1.是一个开源的控制反转IOC和面向切面AOP的容器框架 2.IOC控制反转 public class PersonServiceBean { private Per ...

  10. Spring框架学习笔记(8)——spring boot+mybatis plus+mysql项目环境搭建

    之前写的那篇Spring框架学习笔记(5)--Spring Boot创建与使用,发现有多小细节没有提及,,正好现在又学习了mybatis plus这款框架,打算重新整理一遍,并将细节说清楚 1.通过I ...

随机推荐

  1. STL大全

    排序最速传说--sort 我们都学过一些排序的写法,比如冒泡排序,快速排序之类的东西,举个例子来说吧,这是快速排序的代码: #include<iostream> using namespa ...

  2. 第十四届蓝桥杯省赛C++ B组(个人经历 + 题解)

    参赛感受 这是我第一次参加蓝桥杯的省赛,虽然没什么参赛经验,但是自己做了很多前几届蓝桥杯的题,不得不说,这一届蓝桥杯省赛的难度相较于之前而言还是比较大的.之前很流行蓝桥杯就是暴力杯的说法,但是随着参赛 ...

  3. express服务器框架

    Express 为了提高开发效率,我们在开发过程中,都会尽量使用别人已经开发好的第三方模块,而我们想要快速实现服务器端的开发,推荐一个当下比较流行的框架:Express Express 作为开发框架, ...

  4. 从源码分析 Go 语言使用 cgo 导致的线程增长

    TDengine Go 连接器 https://github.com/taosdata/driver-go 使用 cgo 调用 taos.so 中的 API,使用过程中发现线程数不断增长,本文从一个 ...

  5. c# 如何将枚举以下拉数据源的形式返回给前端

    前言: 相信各位有碰到过与我类似的问题,当表中存一些状态的字段,无非以下几种形式1.直接写死 如: 正常:1,异常:2 ,还有一种则是写在字典中,再或者就是加在枚举上,前两者对于返回下拉数据源来说比较 ...

  6. JavaScript如何解决单线程缺陷——webWorker

    解决JavaScript单线程问题--webWorkers 参考文档 使用 Web Workers - Web API 接口参考 | MDN (mozilla.org) MDN的介绍为: Web Wo ...

  7. 一分钟学一个 Linux 命令 - tar

    前言 大家好,我是 god23bin.今天给大家带来的是 Linux 命令系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天,我们要介绍的是一个常用且强大的命令:tar. 什么是 tar ...

  8. CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(上篇)

    前言 考虑到 B+ 树较为复杂,CMU15-445 将 B+ 树实验拆成了两部分,这篇博客将介绍 Checkpoint#1 部分的实现过程,搭配教材 <DataBase System Conce ...

  9. 从源码级剖析Java类加载原理

    相信大多数熟悉Java的研发工程师,都知道Java类加载原理:Java中的类是由类加载器采用双亲委派机制进行加载.其中,Java核心库中实现了三种类型的类加载器,它们分别是:引导类加载器Bootstr ...

  10. 强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

    强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.强化学习核心概念 强化学习(reinforcement le ...