一、MyBatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
IBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
mybatis提供一种“半自动化”的ORM实现。MyBatis需要手动写SQL,后期可以逆向工程!
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。
二、MyBatis特点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql(SQL动态拼接)
性能: JDBC > MyBatis(半自动) > Hibernate(全自动)
三、MyBatis使用流程
- 1) 创建SqlSessionFactory
- 2) 通过SqlSessionFactory创建SqlSession对象
- 3) 通过SqlSession操作数据库
- 4) 调用session.commit()提交事务
- 5) 调用session.close()关闭会话
四、搭建MyBatis环境
①下载MyBatis的jar包
这里通过maven管理
②准备数据库
这里建立一个user表:
③创建主配置文件:mybatis-config.xml
<?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>
<!-- 引入外部配置文件 外部的数据库连接信息 -->
<properties resource="jdbc.properties" />
<!--设置entity包下的别名-->
<typeAliases>
<package name="com.little.entity"/>
</typeAliases>
<!-- 环境 environment 元素体中包含对事 务管理和连接池的环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 映射 -->
<mappers>
<package name="com.little.mapper"/>
</mappers>
</configuration>
④jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis1102?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=1234
到这里,准备工作完成,接下来可以进行查询测试
五、查询测试
①新建实体类User
package com.little.entity;
import java.util.Date;
public class User {
private Integer id;
private String name;
private Date time;
private String address;
public User() {
super();
}
public User(Integer id, String name, Date time, String address) {
this.id = id;
this.name = name;
this.time = time;
this.address = address;
}
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 Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", time=" + time +
", address='" + address + '\'' +
'}';
}
}
②建立工具类加载xml文件以及管理事务
package com.little.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 工具类
* @author Administrator
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream;
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return sqlSessionFactory.openSession(true); //自动提交事务
}
public static void close(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
sqlSession = null;
}
}
}
③建立UserMapper接口
package com.little.mapper;
import com.little.entity.User;
import java.util.List;
public interface UserMapper {
//全查
public List<User> getUsers();
//条件查
List<User> getUser(User user);
//增加
Integer addUser(User user);
//修改
Integer updateUser(User user);
//删除
Integer deleteUser(Integer id);
}
④建立UserMapper文件
<?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">
<!--suppress ALL -->
<mapper namespace="com.little.mapper.UserMapper">
<!--为了防止实体类属性和数据库列名不匹配,匹配就不用-->
<resultMap type="User" id="UserMap">
<!-- 主键 -->
<id column="ID" property="id"/>
<!-- 普通属性 -->
<result column="name" property="name"/>
<result column="time" property="time"/>
<result column="address" property="address"/>
</resultMap>
<!-- 配置查询语句 查询用select标签 -->
<select id="getUsers" resultType="User">
SELECT * FROM USER
</select>
<select id="getUser" resultType="User">
select * from user
<where>
<if test="null != name and ''!= name">
and name like '%' #{name} '%'
</if>
<if test="null != address and '' != address">
and address like '%' #{address} '%'
</if>
</where>
</select>
<!-- 新增 Insert标签 增删改 默认返回数据库受影响的行数 不用配置
parameterType 传入的参数 ,可以省略 框架自动推断
#{} 之中是对象的属性
-->
<insert id="addUser">
insert into user values (null,#{name},#{time},#{address})
</insert>
<update id="updateUser">
update user set name=#{name},time =#{time},address=#{address}
where id=#{id}
</update>
<delete id="deleteUser">
delete from user where id=#{id}
</delete>
</mapper>
博主这里使用的编译工具是idea工具,所以需要在pom.xml中设置读取UserMapper.xml的位置
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
⑤测试
package com.little.testMybatis;
import com.little.entity.User;
import com.little.mapper.UserMapper;
import com.little.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class Test01 {
SqlSession session=null;
UserMapper um=null; //Dao层的对象 自动生成DAO层对象
@Before
public void init(){
session = MyBatisUtils.getSession();
um = session.getMapper(UserMapper.class);//使用底层代理 自动生成Dan层对象
}
@Test
public void test1(){
List<User> users = um.getUsers();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void test2(){
User u = new User();
u.setName("a");
u.setAddress("1");
List<User> users = um.getUser(u);
for (User user : users) {
System.out.println(user);
}
}
@Test
public void test3(){
User user = new User();
user.setName("张三");
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
user.setTime(date);
user.setAddress("成都");
Integer integer = um.addUser(user);
System.out.println(integer==1?"成功":"失败");
}
@Test
public void test4(){
User user = new User();
user.setId(5);
user.setName("王五");
user.setTime(new Date());
user.setAddress("郑州");
Integer integer = um.updateUser(user);
System.out.println(integer==1?"成功":"失败");
}
@Test
public void test5(){
Integer integer = um.deleteUser(3);
System.out.println(integer==1?"成功":"失败");
}
}