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

MyBatis案例实现

运行环境
Eclipse
MySQL 8.0
MyBatis 3.4.6

建立在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

<?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">
<!-- MyBatis 基本配置文件 -->
<configuration>
	<typeAliases>
	<!-- 别名 -->
		<typeAlias alias="user" type="com.ww.pojo.User"/>
	</typeAliases>
	<!-- 数据库环境配置 -->
	<environments default="dataSource">
		<environment id="dataSource">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" 
				value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8"/>
				<!-- ?serverTimezone=GMT%2B8 -->
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 映射文件 -->
	<mappers>
		<!-- XML文件创建映射器方式 -->
		<mapper resource="com/ww/mapper/UserMapper.xml"/>
	</mappers>
</configuration>
  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)
);

数据表

  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
<?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.ww.mapper.UserMapper">
	<!--
		parameterType属性描述传递给SQL的参数类型
		resultType属性表示返回的是一个user类型的返回值
		user 是在配置文件mybatis-config.xml中配置的别名 也就是com.ww.pojo.User
		#{id} 表示传递进去的id值
	 -->
	<select id="getUserById" parameterType="long" resultType="user">
		select id,name,note
		from t_user
		where id = #{id}
	</select>
	<select id="getUsersByName" parameterType="string" resultType="user">
		select id,name,note
		from t_user
		where name like concat('%',#{name},'%')
	</select>
	<insert id="insertUser" parameterType="user">
		insert into t_user(name,note)
		values(#{name},#{note})
	</insert>
	<delete id="deleteUser" parameterType="long">
		delete from t_user
		where id = #{id}
	</delete>
	<update id="updateUser" parameterType="user">
		update t_user
		set name=#{name},note=#{note}
		where id = #{id}
	</update>
</mapper>

通过各种标签定义的各种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<User> 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<SSFactoryUtils> 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但是确会报错

<!-- 数据库环境配置 -->
<environments default="dataSource">
		<environment id="dataSource">
		<!-- 
			<environments default="development">
			<environment id="devemlopment">
		 -->

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

第二个异常就是XML Mapper文件中SQL语句有问题
异常
这个异常的位置就是 XXMapper.xml文件的位置了 无效的字段或者其他的SQL语句错误吗,这个时候需要去检查自己的XML文件的编写。

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

<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" 
				value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8"/>
				<!-- ?serverTimezone=GMT%2B8 -->
				<property name="username" value="root"/>
				<property name="password" value="123456"/>

异常3
这个时候只需要吧?serverTimezone=GMT%2B8加上就可以了 这个位置的%2B 是 + 的转义
完成!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值