3.MyBatis学习之CRUD操作

目录

1.MyBatis 使用步骤总结

2.完整的CRUD操作

2.1  创建UserDao接口

2.2  创建UserDaoImpl接口实现

2.3  编写UserDao对应的UserDaoMapper.xml

2.4  在mybatis-config.xml中添加配置(注意:必须要添加  不要忘记)

2.5  添加UserDao的测试用例

2.5.1  pom.xml文件中添加TestNG依赖

2.5.2  编写UserDao的测试用例

2.5.3  执行结果

2.5.4  思考上述CRUD中的问题

3.  使用动态代理改造CRUD

3.1 修改测试类:UserDaoTest 

3.2  修改UserDaoMapper.xml文件:将xml配置文件中的id修改为Dao层的方法名称;

3.3  动态代理总结:


1.MyBatis 使用步骤总结

1)配置mybatis-config.xml 全局的配置文件(1.数据源,2.外部的Mapper)

2)创建SqlSessionFactory会话工厂

3)通过SqlSessionFactory 创建SqlSession(会话) 实例

4)通过SqlSession操作数据库CRUD

5)调用session.commit()提交事务

6)调用session.close()关闭会话

 

2.完整的CRUD操作

2.1  创建UserDao接口

package com.junjun.mybatis.dao;

import java.util.List;

import com.mybatis.test.User;

public interface UserDao {
	
	/**
	 * 根据id查询
	 * @param id
	 * @return
	 */
	public User queryUserById(String id);
	
	/**
	 * 查询所有用户数据
	 * @return
	 */
	public List<User> queryUserAll();
	
	/**
	 * 新增用户
	 * @param user
	 */
	public void insertUser(User user);
	
	/**
	 * 更新用户信息
	 * @param user
	 */
	public void updateUser(User user);
	
	/**
	 * 根据id删除用户信息
	 * @param id
	 */
	public void  deleteUser(String id);

}

 

2.2  创建UserDaoImpl接口实现

package com.junjun.mybatis.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.junjun.mybatis.dao.UserDao;
import com.mybatis.test.User;

public class UserDaoImpl implements UserDao {

	public SqlSession sqlSession;
	public UserDaoImpl(SqlSession sqlSession){
		this.sqlSession = sqlSession;
	}
	
	public User queryUserById(String id) {
		return this.sqlSession.selectOne("com.junjun.mybatis.dao.UserDao.queryUserById",id);
	}

	public List<User> queryUserAll() {
		return this.sqlSession.selectList("com.junjun.mybatis.dao.UserDao.queryUserAll");
	}

	public void insertUser(User user) {
		this.sqlSession.insert("com.junjun.mybatis.dao.UserDao.insertUser", user);
		this.sqlSession.commit();
	}

	public void updateUser(User user) {
		this.sqlSession.update("com.junjun.mybatis.dao.UserDao.updateUser", user);
		this.sqlSession.commit();
	}

	public void deleteUser(String id) {
		this.sqlSession.delete("com.junjun.mybatis.dao.UserDao.deleteUser", id);
		this.sqlSession.commit();
	}

}

 

2.3  编写UserDao对应的UserDaoMapper.xml

<?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:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.junjun.mybatis.dao.UserDao">
	<!-- 
	statement  内容:sql语句。 id:唯一标识符,随便些,但是在同一个命名空间下保持唯一,
	resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表;
	 -->

	<select id="queryUserById" resultType ="com.mybatis.test.User">
		<!-- select * from tb_user where id = #{=id}   -->
		
		select 
		id,
		user_name as userName,
		password,
		name,
		age,
		birthday,
		sex,
		created,
		updated
		from 
		tb_user 
		where id =#{id};
	</select>
	
	<select id="queryUserAll" resultType ="com.mybatis.test.User">
		select *from tb_user;
	</select>
	
	<insert id="insertUser" parameterType="com.mybatis.test.User">
		INSERT INTO tb_user (id,user_name,password,name,age,birthday,sex,created,updated) VALUES(#{id},#{userName},#{password},#{name},#{age},#{birthday},#{sex},#{created},#{updated});
	</insert>
	
	<update id="updateUser" parameterType ="com.mybatis.test.User">
		UPDATE tb_user
		<trim prefix="set" suffixOverrides=",">
			<if test="userName != null">user_name= #{userName},</if>
			<if test="password != null">password= #{password},</if>
			<if test="name != null">name= #{name},</if>
			<if test="age != null">age= #{age},</if>
			<if test="sex != null">sex= #{sex},</if>
			<if test="birthday != null">birthday= #{birthday},</if>
			updated= now(),
		</trim>
		WHERE
		id = #{id};
	</update>
	
	<delete id="deleteUser" parameterType = "java.lang.String">
		delete from tb_user where id = #{id};
	</delete>
	
</mapper>

 

2.4  在mybatis-config.xml中添加配置(注意:必须要添加  不要忘记)

<mappers>
    <mapper resource="mappers/MyMapper.xml"></mapper>
    <mapper resource="mappers/UserDaoMapper.xml"></mapper>
</mappers>

 

2.5  添加UserDao的测试用例

2.5.1  pom.xml文件中添加TestNG依赖

 <dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.14.3</version>
    <scope>test</scope>
</dependency>

 

2.5.2  编写UserDao的测试用例

package com.test.junjun.demo;

import org.testng.annotations.Test;

import com.junjun.mybatis.dao.UserDao;
import com.junjun.mybatis.dao.impl.UserDaoImpl;
import com.mybatis.test.User;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

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.apache.poi.util.SystemOutLogger;
import org.testng.annotations.BeforeTest;

public class UserDaoTest {
	public UserDao userDao;
	public SqlSession sqlSession;

	@BeforeTest
	public void beforeTest() throws IOException {
		System.out.println("buforeTest 测试方法········");
		String resource = "mybatis-config.xml";
		InputStream input = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
		sqlSession = sqlSessionFactory.openSession();

		this.userDao = new UserDaoImpl(sqlSession);
	}

	
	@Test
	public void testQuaryUserById() {
		System.out.println("testQuaryUserById");
		System.out.println(this.userDao.queryUserById("1"));
		
		
	}

	@Test()
	public void testQueryUserAll() {
		System.out.println("testQueryUserAll");
		System.out.println(this.userDao.queryUserAll());
	}

	@Test
	public void testInstartUser() {
		System.out.println("testInstartUser");
		User user = new User();
		user.setId("7");
		user.setUserName("zhangsan66");
		user.setPassword("12345666");
		user.setName("张三6");
		user.setAge(20);
		user.setSex(1);
		user.setBirthday(new Date("2020/09/12"));
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		user.setCreated(df.format(new Date()));
		user.setUpdated(df.format(new Date()));
		this.userDao.insertUser(user);
		System.out.println(user.getId());
	}

	@Test
	public void testUpdate() {
		System.out.println("testUpdate");
		User user = new User();
		user.setId("3");
		user.setUserName("zhangsan3");
		user.setPassword("12345678903");
		user.setName("张三3");
		this.userDao.updateUser(user); 
	}

	@Test
	public void testDelete() {
		System.out.println("testDelete");
		this.userDao.deleteUser("5");

	}

}


2.5.3  执行结果

开始的数据库表:

执行sql语句后的数据库表:

 

2.5.4  思考上述CRUD中的问题

1.接口->实现->mapper.xml

2.实现类中,使用MyBatis的方式非常类似;

思考:能否只写接口,不写实现类,只编写接口和Mapper.xml即可?

在dao(mapper)的实现类中对sqlsession的使用方式很类似,因此mybatis提供了接口的动态代理。

3.xml中的sql statement 硬编码到了java代码中;

思考:减少代码中出现硬编码;

3.  使用动态代理改造CRUD

3.1 修改测试类:UserDaoTest 

1)将this.userDao = new UserDaoImpl(sqlSession);

改为:this.userDao = sqlSession.getMapper(UserDao.class);

 

2)在有事务提交的方法(testInstartUser,testUpdate,testDelete)

中加入  this.sqlSession.commit();

代码:

package com.test.junjun.demo;

import org.testng.annotations.Test;

import com.junjun.mybatis.dao.UserDao;
import com.junjun.mybatis.dao.impl.UserDaoImpl;
import com.mybatis.test.User;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

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.apache.poi.util.SystemOutLogger;
import org.testng.annotations.BeforeTest;

public class UserDaoTest {
	public UserDao userDao;
	public SqlSession sqlSession;

	@BeforeTest
	public void beforeTest() throws IOException {
		System.out.println("buforeTest 测试方法········");
		String resource = "mybatis-config.xml";
		InputStream input = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
		sqlSession = sqlSessionFactory.openSession();

//		this.userDao = new UserDaoImpl(sqlSession);
		this.userDao = sqlSession.getMapper(UserDao.class);
	}

	
	@Test
	public void testQuaryUserById() {
		System.out.println("testQuaryUserById");
		System.out.println(this.userDao.queryUserById("1"));
		
		
	}

	@Test()
	public void testQueryUserAll() {
		System.out.println("testQueryUserAll");
		System.out.println(this.userDao.queryUserAll());
	}

	@Test
	public void testInstartUser() {
		System.out.println("testInstartUser");
		User user = new User();
		user.setId("7");
		user.setUserName("zhangsan66");
		user.setPassword("12345666");
		user.setName("张三6");
		user.setAge(20);
		user.setSex(1);
		user.setBirthday(new Date("2020/09/12"));
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		user.setCreated(df.format(new Date()));
		user.setUpdated(df.format(new Date()));
		this.userDao.insertUser(user);
		System.out.println(user.getId());
		this.sqlSession.commit();
	}

	@Test
	public void testUpdate() {
		System.out.println("testUpdate");
		User user = new User();
		user.setId("3");
		user.setUserName("zhangsan3");
		user.setPassword("12345678903");
		user.setName("张三3");
		this.userDao.updateUser(user); 
		this.sqlSession.commit();
	}

	@Test
	public void testDelete() {
		System.out.println("testDelete");
		this.userDao.deleteUser("5");
		this.sqlSession.commit();

	}

}


 

3.2  修改UserDaoMapper.xml文件:将xml配置文件中的id修改为Dao层的方法名称;

修改完成,成功实现动态代理;

 

3.3  动态代理总结:

使用mapper接口不用写接口实现类即可完成数据库操作,使用非常简单

但需要满足以下配置:

1)Mapper.xml文件中的namespace必须和mapper接口的全路径一致

2)Mapper接口的方法名必须和sql定义的id一致

3)Mapper接口中方法的输入参数类型和sql定义的parameterType可一致也可不一致;

4)Mapper接口中方法的输出参数类型必须和sql定义的resultType一致

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值