目录
MyBatis入门案例
MyBatis的前身是apache的一个开源项目iBatis,2010年迁移到google code,改名为Mybatis,2013年又从google code 迁移到github。
MyBatis是一个ORM框架,是国内常用的两个ORM框架之一。
下面通过一个案例,学习Mybatis的执行流程。
一、需求
-
根据ID查询客户信息
-
根据客户名模糊查找客户列表
-
添加客户
-
修改客户
-
删除客户
二、工程搭建
需求完成后的项目结构和数据表结构如下图所示。
1.导入依赖jar
2.配置核心配置文件
该文件名字符合规范就行,我这里取名为:mybatis-config.xml ,放在资源文件夹config下,也是类路径下
<?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"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/zdxh/mybatis/mapper/CustomerMapper.xml"/>
</mappers>
</configuration>
3.配置log4j.properties
希望在控制台打印sql语句等,需要配置该文件
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.cn.zdxh=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
4.编写pojo
入门案例以Customer为例
package cn.zdxh.mybatis.po;
/**
*客户持久化类
*/
public class Customer {
private Integer id; // 主键
private String username; // 客户名称
private String jobs; // 职业
private String phone; // 电话
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer [id=" + id + ", username=" + username +
", jobs=" + jobs + ", phone=" + phone + "]";
}
}
5. 配置sql映射文件
该文件里的sql语句是使用sqlyog粘贴来的。该文件是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">
<!-- namespace:命名空间,用来隔离sql语句,后续会有重要作用
#{} :占位符,相当于jdbc的?
${} :字符串拼接指令,如果是基本数据类型,花括号里面必须是value,如果是pojo,就是pojo
-->
<mapper namespace="cn.zdxh.mybatis.po.Customer">
<!-- id:sql id ,sql语句的唯一标示
parameterType:入参的数据类型
resultType:返回结果的数据类型
-->
<!-- 根据客户ID查询客户信息 -->
<select id="getCustomerById" parameterType="Integer" resultType="cn.zdxh.mybatis.po.Customer">
SELECT
`id`,
`username`,
`jobs`,
`phone`
FROM
`t_customer`
WHERE id=#{id}
</select>
<!-- 根据客户名模糊查找客户列表 -->
<!-- resultType:如果要返回数据集合,只需设定为每一个元素的数据类型 -->
<select id="getCustomerByName" parameterType="string" resultType="cn.zdxh.mybatis.po.Customer">
SELECT
`id`,
`username`,
`jobs`,
`phone`
FROM
`t_customer`
<!-- WHERE username like #{name} -->
WHERE username like '%${value}%'
</select>
<!-- 添加客户 -->
<insert id="addCustomer" parameterType="cn.zdxh.mybatis.po.Customer">
INSERT INTO `t_customer` (`id`, `username`, `jobs`, `phone`)
VALUES
(NULL, #{username}, #{jobs}, #{phone}) ;
</insert>
<!-- 修改客户 -->
<update id="updateCustomer" parameterType="cn.zdxh.mybatis.po.Customer">
UPDATE
`mybatis`.`t_customer`
SET
`username` = #{username},
`jobs` = #{jobs},
`phone` = #{phone}
WHERE `id` = #{id}
</update>
<!-- 根据Id删除客户 -->
<delete id="deleteCustomerById" parameterType="int">
DELETE
FROM
`t_customer`
WHERE `id` = #{id} ;
</delete>
</mapper>
6. 在mybatis核心配置文件中加载映射文件
<mappers>
<mapper resource="cn/zdxh/mybatis/mapper/CustomerMapper.xml"/>
</mappers>
7.抽取公共代码,编写公共类
因为在8.测试中,所有测试方法中都出现相同代码,而且,根据官网文档,SqlSessionFactory建议使用单例,我们抽取了一个工具类SqlSessionFactoryUtils.java,内容如下:
package cn.zdxh.mybatis.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//1. 创建SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//2. 创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//3. 通过输入流创建 SqlSessionFactory 对象
sqlSessionFactory = ssfb.build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
8.测试类
package cn.zdxh.mybatis.test;
import static org.junit.jupiter.api.Assertions.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.jupiter.api.Test;
import cn.zdxh.mybatis.po.Customer;
import cn.zdxh.mybatis.utils.SqlSessionFactoryUtils;
class MybatisTest {
@Test
void testGetCustomerById() throws IOException {
//1. 创建SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//2. 创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//3. 通过输入流创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = ssfb.build(inputStream);
//4. 创建SqlSession对象,包含了jdbc的CRUD所有方法
SqlSession sqlSession = sqlSessionFactory.openSession();
//5. 执行查询 :参数1 :sql id ;参数2 :入参,入参要与xml文件的入参一一对应
Customer customer = sqlSession.selectOne("cn.zdxh.mybatis.po.Customer.getCustomerById", 18);
//6. 处理
System.out.println(customer);
//7. 释放资源
sqlSession.close();
}
@Test
void testGetCustomerByName() throws IOException {
//1. 创建SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//2. 创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//3. 通过输入流创建 对象
SqlSessionFactory sqlSessionFactory = ssfb.build(inputStream);
//4. 创建SqlSession对象,包含了jdbc的CRUD所有方法
SqlSession sqlSession = sqlSessionFactory.openSession();
//5. 执行查询 :参数1 :sql id ;参数2 :入参,入参要与xml文件的入参一一对应
// List<Customer> list = sqlSession.selectList("cn.zdxh.mybatis.po.Customer.getCustomerByName", "%刘%");
List<Customer> list = sqlSession.selectList("cn.zdxh.mybatis.po.Customer.getCustomerByName", "刘");
//6. 处理
for (Customer customer : list) {
System.out.println(customer);
}
//7. 释放资源
sqlSession.close();
}
@Test
void testAddCustomer() throws IOException {
//调用工具类的静态方法得到sqlSessionFactory
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//4. 创建SqlSession对象,包含了jdbc的CRUD所有方法
SqlSession sqlSession = sqlSessionFactory.openSession();
System.out.println(111);
//5. 执行插入 :参数1 :sql id ;参数2 :入参,入参要与xml文件的入参一一对应
Customer customer = new Customer();
customer.setUsername("刘胡兰5");
customer.setJobs("网红4");
customer.setPhone("13888888888");
int row=sqlSession.insert("cn.zdxh.mybatis.po.Customer.addCustomer", customer);
System.out.println(row);
// 提交事务
sqlSession.commit();
//7. 释放资源
sqlSession.close();
}
@Test
void testUpdateCustomer() throws IOException {
//调用工具类的静态方法得到sqlSessionFactory
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//4. 创建SqlSession对象,包含了jdbc的CRUD所有方法
SqlSession sqlSession = sqlSessionFactory.openSession();
//5. 执行插入 :参数1 :sql id ;参数2 :入参,入参要与xml文件的入参一一对应
Customer customer = new Customer();
customer.setId(20);
customer.setUsername("刘老师1");
customer.setJobs("大学老师");
customer.setPhone("13888888888");
int row=sqlSession.update("cn.zdxh.mybatis.po.Customer.updateCustomer", customer);
System.out.println(row);
// 提交事务
sqlSession.commit();
//7. 释放资源
sqlSession.close();
}
@Test
void testDeleteCustomerById() throws IOException {
//调用工具类的静态方法得到sqlSessionFactory
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//4. 创建SqlSession对象,包含了jdbc的CRUD所有方法
SqlSession sqlSession = sqlSessionFactory.openSession();
//5. 执行插入 :参数1 :sql id ;参数2 :入参,入参要与xml文件的入参一一对应
int row=sqlSession.delete("cn.zdxh.mybatis.po.Customer.deleteCustomerById", 20);
System.out.println(row);
// 提交事务
sqlSession.commit();
//7. 释放资源
sqlSession.close();
}
}
测试结果,特别是删除和修改,大家自行运行。
总结:本文只是一个使用mybatis入门的案例,细节配置,后续文中再详细说明。