MyBatis的学习(一)——MyBatis介绍及实现CRUD操作

一、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?"成功":"失败");
    }
}

 

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/83751044