小白第十八篇 MyBatis实现CRUD操作

MyBatis案例实现

运行环境
Eclipse
MySQL 8.0
MyBatis 3.4.6

建立在MyBatis环境下对于基本数据表实现增删改查CRUD的操作。

  1. 项目结构展示
    小白第十八篇 MyBatis实现CRUD操作_第1张图片
  2. 配置文件
    日志配置文件 log4j.properties
log4j.rootLogger=DEBUG , stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

MyBatis配置文件 mybatis-config.xml





	
	
		
	
	
	
		
			
			
				
				
				
				
				
			
		
	
	
	
		
		
	

  1. 数据库部分设计 此处以User(id,name.note)表为例
    为这个案例自行插入一条数据(TestName,TestNote)
create table t_user(
	id int(20) auto_increment,
	name varchar(60) not null,
	note varchar(255) not null,
	primary key(id)
);

小白第十八篇 MyBatis实现CRUD操作_第2张图片

  1. 根据数据库表t_user设计POJO类 User.java
/**
 * POJO  t_user
 * @author WW
 */
public class User {
	private Long id;
	private String name;
	private String note;
	/*getter 与  setter 方法省略 需要提供每个字段对应的get与set*/
}

  1. 采用XML的方式创建映射器
    PS:也可以通过注解的方式创建映射器,但是相对来说XML比较简洁以及容易后期更新等。
    首先需要创建XML映射器文件 UserMapper.xml



	
	
	
	
		insert into t_user(name,note)
		values(#{name},#{note})
	
	
		delete from t_user
		where id = #{id}
	
	
		update t_user
		set name=#{name},note=#{note}
		where id = #{id}
	

通过各种标签定义的各种CRUD方式 创建一个对应的Mapper接口 UserMapper.java

/**
 * 	映射器接口
 * 		映射器的主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中
 * 	开发中的映射器仅仅是一个接口,而不是一个实现类
 * 	MyBatis使用了动态代理技术使得这个接口能够运行起来
 * 		MyBatis会为这个接口生成一个代理对象,代理对象会去处理相关的逻辑。	
 * @author WW
 */
import java.util.List;
import com.ww.pojo.User;
public interface UserMapper {
	// 增删改查 操作
	public int insertUser(User user);
	public int deleteUser(Long id);
	public int updateUser(User user);
	public User getUserById(Long id);
	public List getUsersByName(String name);
}
  1. 构建SqlSessionFactory使得可以创建SqlSession 也就是文件 SSFactoryUtils.java
/**
 *  SqlSessionFactoryBuilder来构建SqlSessionFactory
 *  其中 SqlSessionFactory应该采用单例模式
 * @author WW
 */
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SSFactoryUtils {
	//对象锁  防止多线程中多次实例化对象保证唯一性
	private final static Class LOCK = SSFactoryUtils.class;
	//单例模式 懒汉式
	private static SqlSessionFactory sqlSessionFactory = null;
	private SSFactoryUtils() {
	}
	public static SqlSessionFactory getSqlSessionFactory() {
		synchronized (LOCK) {
			if (sqlSessionFactory != null) {
				return sqlSessionFactory;
			}
			String src = "mybatis-config.xml";
			InputStream inputStream;
			try {
				inputStream = Resources.getResourceAsStream(src);
				sqlSessionFactory = 
						new SqlSessionFactoryBuilder().build(inputStream);
			} catch (IOException e) {
				e.printStackTrace();
				return null;
			}
			return sqlSessionFactory;
		}
	}
	//通过SqlSessionFactory对象获得SqlSession对象
	public static SqlSession openSqlSession() {
		if (sqlSessionFactory == null) {
			getSqlSessionFactory();
		}
		return sqlSessionFactory.openSession();
	}
}
  1. 测试类编写
    此处以通过Id查找的方法为例子 其余的方法的使用都是差不多的!
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import com.ww.mapper.UserMapper;
import com.ww.pojo.User;
import com.ww.sql.SSFactoryUtils;
/**
 * 	测试类
 * @author WW
 */
public class Test {
	public static void main(String[] args) {
		//Log4j 日志
		Logger logger = Logger.getLogger(Test.class);
		SqlSession sqlSession = null;
		try {
			sqlSession = SSFactoryUtils.openSqlSession();
			UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
			//通过id查找对应的数据并返回成一个POJO对象
			User user = userMapper.getUserById(1L);
			logger.info(user.getName());
			//涉及到更新数据库内容时 需要将数据写回数据库
			//sqlSession.commit();
		} finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}
}

PS:当需要使用其他的方法进行操作的时候,除了查找不会更新数据库外增删改都会更新数据库,这个时候需要在自己编写的逻辑完成后添加 sqlSession.commit()进行事务的提交操作,否则是不会写回数据库的,需要注意一下这个位置!
8. 测试结果

....
DEBUG 2019-04-17 16:15:38,502 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>  
	Preparing: select id,name,note from t_user where id = ? 
DEBUG 2019-04-17 16:15:38,538 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==>
	Parameters: 1(Long)
DEBUG 2019-04-17 16:15:38,573 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <==      
	Total: 1
 INFO 2019-04-17 16:15:38,575 com.ww.test.Test: 
 	TestName
....

通过INFO语句 可以查看到我们需要查找的数据以及成功的查找了出来,并且通过日志的打印我们可以清晰的看到对应的数据库SQL操作以及操作的过程!

  1. 遇到的的异常以及解决方式

mybatis-config.xml中最先笔者在default属性中定义的 是development但是确会报错



		
		

小白第十八篇 MyBatis实现CRUD操作_第3张图片
这个异常的报错 可能是mybatis-config.xml文件的配置问题或者说Mapper文件的配置问题,于是笔者将development改为了常用的dataSource再次运行的时候就可以成功,于是笔者又将dataSource改回了develoment再次运行,显示的还是成功,笔者以为是缓存的问题于是将eclipse关掉再开再次运行的时候发现还是没有问题了…很神奇的事情是吧 !哈哈!

第二个异常就是XML Mapper文件中SQL语句有问题
小白第十八篇 MyBatis实现CRUD操作_第4张图片
这个异常的位置就是 XXMapper.xml文件的位置了 无效的字段或者其他的SQL语句错误吗,这个时候需要去检查自己的XML文件的编写。

第三个异常就是MySQL数据库配置url后面的时区问题 同样修改的位置在mybatis-config.xml文件中,但是如果使用的是代码设置的那就再对应的java类中修改


				
				
				
				

小白第十八篇 MyBatis实现CRUD操作_第5张图片
这个时候只需要吧?serverTimezone=GMT%2B8加上就可以了 这个位置的%2B 是 + 的转义
完成!!!!!!

你可能感兴趣的:(小白第十八篇 MyBatis实现CRUD操作)