建立在MyBatis环境下对于基本数据表实现增删改查CRUD的操作。
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
create table t_user(
id int(20) auto_increment,
name varchar(60) not null,
note varchar(255) not null,
primary key(id)
);
/**
* POJO t_user
* @author WW
*/
public class User {
private Long id;
private String name;
private String note;
/*getter 与 setter 方法省略 需要提供每个字段对应的get与set*/
}
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);
}
/**
* 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();
}
}
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操作以及操作的过程!
mybatis-config.xml中最先笔者在default属性中定义的 是development但是确会报错
这个异常的报错 可能是mybatis-config.xml文件的配置问题或者说Mapper文件的配置问题,于是笔者将development改为了常用的dataSource再次运行的时候就可以成功,于是笔者又将dataSource改回了develoment再次运行,显示的还是成功,笔者以为是缓存的问题于是将eclipse关掉再开再次运行的时候发现还是没有问题了…很神奇的事情是吧 !哈哈!
第二个异常就是XML Mapper文件中SQL语句有问题
这个异常的位置就是 XXMapper.xml文件的位置了 无效的字段或者其他的SQL语句错误吗,这个时候需要去检查自己的XML文件的编写。
第三个异常就是MySQL数据库配置url后面的时区问题 同样修改的位置在mybatis-config.xml文件中,但是如果使用的是代码设置的那就再对应的java类中修改
这个时候只需要吧?serverTimezone=GMT%2B8加上就可以了 这个位置的%2B 是 + 的转义
完成!!!!!!