1.mybatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
官方文档连接
2.mybatis的优点
1、MyBatis是最简单的持久化框架,小巧并且简单易学。
2、MyBatis灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
3、提供XML标签,支持编写动态SQL语句(XML中使用if, else)。
4、提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
3.mybatis的缺点
对SQL语句依赖程度很高,导致数据库移植性差。比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。
4.myatis入门demo
1.首先创建一个maven项目
- 将下面的 dependency 代码置于 pom.xml 文件中
4.0.0
com.frank
mybatis-studying
1.0-SNAPSHOT
war
org.mybatis
mybatis
3.4.5
mysql
mysql-connector-java
5.1.6
log4j
log4j
1.2.7
org.slf4j
slf4j-api
1.7.5
org.slf4j
slf4j-log4j12
1.7.5
test
junit
junit
4.12
src/main/java
**/*.properties
**/*.xml
true
- 3.创建数据库和表信息
database structure for mybatis_test
CREATE DATABASE IF NOT EXISTS `mybatis_test` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;
USE `mybatis_test`;
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
INSERT INTO `user` (`id`, `username`, `birthday`, `sex`, `address`) VALUES
(1, '王五', NULL, '2', NULL),
(10, '张三', '2014-07-10', '1', '北京市'),
(16, '张小明', NULL, '1', '河南郑州'),
(22, '陈小明', NULL, '1', '河南郑州'),
(24, '张三丰', NULL, '1', '河南郑州'),
(25, '陈小明', NULL, '1', '河南郑州'),
(26, '王五', NULL, NULL, NULL),
(27, 'gyf05', '2019-08-15', '2', '广州');
- 4.创建jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
- 5.创建xml映射配置文件:sqlMapconfig.xml
- 6.创建sql映射文件
select LAST_INSERT_ID()
insert into user (username,birthday,address,sex)
values (#{username},#{birthday},#{address},#{sex})
UPDATE user
SET username = #{username}, sex = #{sex}, birthday = #{birthday}, address = #{address}
WHERE id = #{id}
DELETE FROM user
WHERE id = #{id}
- 开始测试
package com.frank.test;
import com.frank.dao.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @author :frank
* @date :2019-08-13 16:57
* @description : 测试
*/
public class MapperTest {
private SqlSession session;
@Before
public void before() throws IOException {
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//读取配置文件的配置信息,利用SqlSessionFactoryBuilder创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过SqlSessionFactory创建SqlSession。
session = sessionFactory.openSession();
}
@After
public void after() {
System.out.println("after.....关闭session");
// 关闭SqlSession。
session.close();
}
/**
* 查询:一条记录和多条记录
*
* @throws IOException
*/
@Test
public void findUser() throws IOException {
//查询一条结果
User user = session.selectOne("findUserById", 10);
System.out.println(user);
//查询多条结果
List users = session.selectList("findUserByUsername", "小明");
System.out.println(users);
}
//删除用户
@Test
public void deleteUserById() throws IOException {
int affectRow = session.delete("deleteUserById", 27);
session.commit();//事务
System.out.println("受影响的行数:" + affectRow);
}
/**
* 插入后,往模型里设置id
*/
@Test
public void insertUser() throws IOException {
User user = new User("gyf05", "2", new Date(), "广州");
int affectRow = session.insert("insertUser", user);
session.commit();//事务
System.out.println("受影响的行数:" + affectRow);
System.out.println("用户的ID:" + user.getId());
}
}
5.工程结构
代码全部测试通过!