第一章 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