Mybatis学习(二) ----入门案例

目录

MyBatis入门案例

一、需求

二、工程搭建

1.导入依赖jar

         2.配置核心配置文件

 3.配置log4j.properties

4.编写pojo

5. 配置sql映射文件

6. 在mybatis核心配置文件中加载映射文件

7.抽取公共代码,编写公共类

8.测试类


MyBatis入门案例

MyBatis的前身是apache的一个开源项目iBatis,2010年迁移到google code,改名为Mybatis,2013年又从google code 迁移到github。

MyBatis是一个ORM框架,是国内常用的两个ORM框架之一。

下面通过一个案例,学习Mybatis的执行流程。

一、需求

  1. 根据ID查询客户信息

  2. 根据客户名模糊查找客户列表

  3. 添加客户

  4. 修改客户

  5. 删除客户

二、工程搭建

需求完成后的项目结构和数据表结构如下图所示。

                                  

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&amp;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入门的案例,细节配置,后续文中再详细说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值