mybatis技术全攻略指南(新增json类型转换器)

本文详细介绍了mybatis的使用,从mybatis历史、核心文件到动态SQL、高级查询、缓存、日志、懒加载,再到与MySQL5.7的JSON数据类型配合,特别是自定义JSON类型转换器的实现,旨在提供全面的mybatis操作指南。
摘要由CSDN通过智能技术生成

第一章 mybatis简介

1.1 mybatis的历史

1. mybatis在2010年前叫ibatis是apache内部的一个项目,名字来源于internet+ibatis 是一个基于Java的持久层框架
2. 2010年以后从apache内部迁移到google code上,并且改名为mybatis
3. 2013年迁移到github上

1.2 mybatis是什么

1. 是一款优秀的持久层框架
2. 支持定制化sql,存储过程以及高级映射
3. 可以避免几乎所有的JDBC代码手动设置参数以及获取结果集
4. 可以使用简单的 XML 或注解来配置和映射原生信息
5. 用接口将Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

1.3 mybatis的优势

1. 相比于JDBC没有侵入性可以达到很好的解耦效果
2. 相比于hibernate他有着高性能,可以满足当下绝大多数移动互联网时代的需求
3. sql代码分类放置在不同的sql map中易维护

1.4 mybatis的核心文件编写

1. POJO映射数据库表的Java对象
2. data access objects(DAOS)映射器接口类,用于操作数据库
3. sql maps : SQL映射配置文件,用于注册DAOs接口,使其接口有操作数据库的能力
4. mybatis配置文件,初始化一些基本的配置信息,用于生成SqlSessionFactory

第二章 入门HelloWorld

  • 数据库表创建
//创建数据库
CREATE DATABASE mybatis DEFAULT CHARACTER SET UTF8;
//创建数据库表
CREATE TABLE user(
    `user_id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    `user_name` VARCHAR(100) NOT NULL COMMENT '用户名',
    `create_time` DATETIME DEFAULT NULL comment '创建时间'
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=UTF8 COMMENT="用户表";
  • 入门HelloWorld代码的编写
①创建项目,添加jar包
    mybatis-3.4.6.jar
    mysql-connector-java-5.1.7-bin.jar
②根据官网的步骤一步步进行环境搭建.
③使用junit测试进行接口的测试.
    • 步骤

第1步 创建映射数据库表的实体类

/**
 * 映射数据库表的接口类
 * @author hu shuang
 * @email hd1611756908@163.com
 */
import java.util.Date;

public class User {
	//用户ID
	private Integer userId;
	//用户名
	private String userName;
	//创建时间
	private Date createTime;

	public User() {
	}
	public User(Integer userId, String userName, Date createTime) {
		this.userId = userId;
		this.userName = userName;
		this.createTime = createTime;
	}
}

第2步 创建操作数据库表的接口类

/**
 * 操作数据库表的接口
 * @author hu shuang
 * @email hd1611756908@163.com
 */
public interface UserMapper {
	/*
	 * 添加用户
	 */
	void addUser(User user);
	/*
	 * 删除用户
	 */
	void deleteUser(Integer userId);
	/*
	 * 更新用户
	 */
	void updateUser(User user);
	/*
	 * 通过用户ID获取用户信息
	 */
	User getUser(Integer userId);
	/*
	 * 获取用户列表
	 */
	List<User> getUsers();
	
	/*
	 * 根据名字模糊查询获取用户列表
	 */
	List<User> getUsersLikeByUserName(@Param("userName") String userName);
}

第3步 创建注册操作数据库接口类的映射文件

操作数据库只能用SQL语句,但是mybatis提供了使用接口操作数据库,一般情况接口是没有操作数据库的能力的,但是 mybatis可以通过这个配置文件来注册接口,让接口有操作数据库的能力
<?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="com.im.mapper.UserMapper">
	<!-- 
		此配置文件用来注册UserMapper这个接口以及此接口中定义的方法
		namespace: 被注册接口的全类名
		insert: 插入数据的标签,还有其他三个标签 查询select、更新update、删除delete
		id: 接口里面定义的方法名字
		parameterType: 方法的入参类型(全类名)
		#{xxx}: 表达式  :  取方法的参数值
				如果方法的入参是基本数据类型那么xxx为形参名
				如果方法的入参为对象类型那么xxx为对象类型里面的属性名
		resultType:方法的返回值类型
		useGeneratedKeys: 让 myabtis 框架使用JDBC 通过 getGeneratedKeys 获取数据库主键.
		keyProperty: 映射通过getGeneratedKeys获取的键值
	 -->
	 <insert id="addUser" parameterType="com.im.entity.User" useGeneratedKeys="true" keyProperty="userId">
	 	INSERT INTO user(user_name,create_time) VALUES(#{userName},#{createTime})
	 </insert>
	 
	 <delete id="deleteUser" parameterType="Integer">
	 	DELETE FROM user WHERE user_id=#{userId}
	 </delete>
	 
	 <update id="updateUser" parameterType="com.im.entity.User">
	 	UPDATE user SET user_name=#{userName},create_time=#{createTime} WHERE user_id=#{userId}
	 </update>
	 
	 <select id="getUser" parameterType="Integer" resultType="com.im.entity.User">
	 	SELECT user_id as userId,user_name as userName,create_time as createTime FROM user WHERE user_id=#{userId}
	 </select>
	 
	 <select id="getUsers" resultType="com.im.entity.User">
	 	SELECT user_id as userId,user_name as userName,create_time as createTime FROM user
	 </select>
	 <!-- 
	  	构建LIKE参数
	  	方式一: CONCAT('参数1','参数2','参数3') 
	  	方式二: 在传参数时构建成 %李雷%
	  	方式三: 使用bind标签创建元素,放到上下文中
	  -->
	 <select id="getUsersLikeByUserName" resultType="com.sc.entity.User">
	  	SELECT user_id as userId,user_name as userName,create_time as createTime FROM user WHERE user_name like CONCAT('%',#{userName},'%')
	 </select>
	 <select id="getUsersLikeByUserName" resultType="com.sc.entity.User">
	  	SELECT user_id as userId,user_name as userName,create_time as createTime FROM user WHERE user_name like #{userName}
	 </select>
	 
	 <select id="getUsersLikeByUserName" resultType="com.sc.entity.User">
	  	<bind name="pattern" value="'%' + _parameter.userName + '%'" />
	  	SELECT user_id as userId,user_name as userName,create_time as createTime FROM user WHERE user_name like #{pattern}
	 </select>
</mapper>

第4步 创建mybatis核心配置文件 mybatis-config.xml,用于生成mybatis核心对象

<?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="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
      	<!-- 数据库驱动 -->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <!-- mysql数据库地址 -->
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
        <!-- 数据库用户名 -->
        <property name="username" value="root"/>
        <!-- 数据库密码 -->
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
  	<!-- 将注册接口的配置文件注册到mybatis的核心配置文件中,这是jar包版本,如果是maven项目,要放在resources文件夹下 -->
    <mapper resource="com/im/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

第5步 通过单元测试类调用接口测试(mybatis原生API版调用)

public class UserMapperTest1 {

	/*
	 * 添加用户
	 */
	@Test
	public void testAddUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//创建statement
		String statement = "com.im.mapper.UserMapper.addUser";
		//构建入参
		User user = new User();
		user.setUserName("Tom");
		user.setCreateTime(new Date());
		int row = session.insert(statement, user);
		System.out.println("row:"+row);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 删除用户
	 */
	@Test
	public void testDeleteUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//创建statement
		String statement = "com.im.mapper.UserMapper.deleteUser";
		//调用mybatis的删除数据的API 
		int row = session.delete(statement, 1);
		System.out.println("row:"+row);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 更新用户
	 */
	@Test
	public void testUpdateUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//创建statement
		String statement = "com.im.mapper.UserMapper.updateUser";
		//调用mybatis的更新数据的API 
		//构建更新入参
		User user = new User(2, "polly", new Date());
		int row = session.update(statement, user);
		System.out.println("row:"+row);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 根据ID获取用户
	 */
	@Test
	public void testGetUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//创建statement
		String statement = "com.im.mapper.UserMapper.getUser";
		//调用mybatis的查询单个数据的API 
		User user = session.selectOne(statement, 2);
		System.out.println("user:"+user);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 获取用户列表
	 */
	@Test
	public void testGetUsers() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//创建statement
		String statement = "com.im.mapper.UserMapper.getUsers";
		//调用mybatis的查询列表数据的API 
		List<User> list = session.selectList(statement);
		System.out.println("users:"+list);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
}

第6步 通过单元测试类调用接口测试(mybatis映射器版调用)

public class UserMapperTest2 {
	/*
	 * 添加用户
	 */
	@Test
	public void testAddUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//获取映射器类的对象实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//构建入参
		User user = new User();
		user.setUserName("张三");
		user.setCreateTime(new Date());
		//调用添加用户方法
		userMapper.addUser(user);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 删除用户
	 */
	@Test
	public void testDeleteUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//获取映射器类的对象实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//调用删除方法
		userMapper.deleteUser(2);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 更新用户
	 */
	@Test
	public void testUpdateUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//获取映射器类的对象实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//构建更新入参
		User user = new User(2, "polly", new Date());
		//调用更新方法
		userMapper.updateUser(user);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 根据ID获取用户
	 */
	@Test
	public void testGetUser() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//获取映射器类的对象实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//调用查询方法
		User user = userMapper.getUser(3);
		System.out.println("user:"+user);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
	/*
	 * 获取用户列表
	 */
	@Test
	public void testGetUsers() throws IOException {
		//加载外部属性资源文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//创建SqlSessionFactory
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
		//创建SqlSession
		SqlSession session = sessionFactory.openSession();
		//获取映射器类的对象实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//调用查询全部方法
		List<User> users = userMapper.getUsers();
		System.out.println("users:"+users);
		//提交
		session.commit();
		//关闭会话
		session.close();
	}
}

第三章 mybatis常用属性配置

  • properties:导入外部属性资源文件,解决数据库配置信息写到Java代码中的问题
<properties resource="db.properties"></properties>
<environments default="development">
	<environment id="development">
		<transactionManager type="JDBC" />
		<dataSource type="POOLED">
			<!-- 数据库驱动 -->
			<property name="driver" value="${jdbc_driver}" />
			<!-- mysql数据库地址 -->
			<property name="url" value="${jdbc_url}" />
			<!-- 数据库用户名 -->
			<property name="username" value="${user}" />
			<!-- 数据库密码 -->
			<property name="password" value="${password}" />
		</dataSource>
	</environment>
</environments>
  • typeAliases: 解决别名的问题
在mybatis-config.xml配置文件中配置别名

<!-- 别名设置 -->
<typeAliases>
	<!-- 将全类名 com.im.entity.User 映射成别名 u
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值