MyBtis简介
环境说明
- jdk1.8
- MySQL 5.7
- idea
什么是MyBatis
- MyBtis是一款优秀的持久层框架
- MyBatis几乎避免了所有的JDBC代码和手动设置参数以及获取结果集的过程
- MyBatis可以使用简单的xml或者注解来配置映射信息,将接口和java实体类(pojo)映射成数据库中的数据
- MyBatis原是apache的ibatis,10年由apache转向google code,改名为MyBatis,13年将代码迁移到GitHub
- Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
- GitHub : https://github.com/mybatis/mybatis-3
持久化
持久化是将数据从持久状态和瞬间状态相互转移的一种机制
- JDBC就是一种持久化机制。文件IO也是一种持久化机制。
- 即把数据(内存中的对象)保存到存储设备中(硬盘)。即,将内存中的对象存到数据库、xml、磁盘文件中等等
- 由于内存存在断电数据丢失,并且价格昂贵,是必须要将数据持久化到外存的
持久层
什么是持久层?
- 简单来说就是完成持久化的代码块,对应java程序中的dao层(DAO (Data Access Object) 数据访问对象)
- 是专门用来,通过数据库完成持久化操作的,和其他功能代码有着明显严格的逻辑边界
为什么需要MyBatis
- MyBatis是优秀的持久层框架,帮助程序员对数据库中的数据进行CRUD操作
- 其功能与传统的JDBC相似,当传统的JDBC代码有大量重复代码,即便封装成JdbcUtils和BaseDao等都需要经过复杂的操作,并且在使用JDBC完成CRUD操作的时候会造成层级之间的耦合
- MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
- 使用MyBatis理由:
- 首先,不会对现有的程序或者数据库的设计产生影响,sql语句写在xml配置文件中,方便管理
- 解除了sql语句和程序代码之间的耦合:Dao层中业务逻辑和数据访问逻辑相互分离,系统设计更加清晰,提高了可维护性。(不用new UserService,UserDao了降低了代码之间的耦合)
- 提供xml标签,支持编写动态sql
HelloWorld
- 导包,添加log4j.properties
测试相关包junit_4.12.jar,org.hamcrest.core_1.3.0.jar
MyBatis依赖包mybatis-3.4.1.jar
mysql-connector-java-5.1.7-bin.jar
log4j.rootLogger=DEBUG,A1
log4j.logger.org.apache=DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
- 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">
<configuration>
<!-- 环境:说明可以配置多个,default:指定生效的环境 -->
<environments default="development">
<!-- id:环境的唯一标识 -->
<environment id="development">
<!-- 事务管理器,type:类型 -->
<transactionManager type="JDBC" />
<!-- 数据源:type-池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="1234" />
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="UserDaoMapper.xml" />
</mappers>
</configuration>
- 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="UserDaoMapper">
<select id="queryUserById" resultType="com.atguigu.mybatis.pojo.User">
select * from tb_user where id = #{id}
</select>
<select id="queryUserAll" resultType="com.atguigu.mybatis.pojo.User">
select * from tb_user
</select>
<insert id="insertUser" parameterType="com.atguigu.mybatis.pojo.User">
INSERT INTO tb_user (
user_name,
password,
name,
age,
sex,
birthday,
created,
updated
)
VALUES
(
#{userName},
#{password},
#{name},
#{age},
#{sex},
#{birthday},
NOW(),
NOW()
);
</insert>
<update id="updateUser" parameterType="com.atguigu.mybatis.pojo.User">
UPDATE tb_user
SET
user_name = #{userName},
password = #{password},
name = #{name},
age = #{age},
sex = #{sex},
birthday = #{birthday},
updated = NOW()
WHERE
(id = #{id});
</update>
<delete id="deleteUserById" parameterType="java.lang.Long">
delete from tb_user where id=#{id}
</delete>
</mapper>
- 创建实体类User(pojo包下)
public class User {
private Long id;
private String userName;
private String password;
private String name;
private Integer age;
private Integer sex;
private Date birthday;
private Date created;
private Date updated;
}
- 创建接口UserDao(dao包下)
public interface UserDao {
/**
* 根据id获取用户信息
* @param id
* @return
*/
public User queryUserById(long 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 deleteUserById(Long id);
}
- 创建UserDao接口实现类UserDaoImpl(dao包下)
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public User queryUserById(long id) {
return this.sqlSession.selectOne("UserDaoMapper.queryUserById",id);
}
@Override
public List<User> queryUserAll() {
return this.sqlSession.selectList("UserDaoMapper.queryUserAll");
}
@Override
public void insertUser(User user) {
this.sqlSession.insert("UserDaoMapper.insertUser",user);
//提交
this.sqlSession.commit();
}
@Override
public void updateUser(User user) {
this.sqlSession.update("UserDaoMapper.updateUser", user);
this.sqlSession.commit();
}
@Override
public void deleteUserById(Long id) {
this.sqlSession.delete("UserDaoMapper.deleteUserById", id);
this.sqlSession.commit();
}
}
- 编写测试类UserDaoTest
public class UserDaoTest {
private UserDao userDao;
@Before
public void setUp() throws Exception {
String resource = "mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
this.userDao = new UserDaoImpl(sqlSession);
}
@Test
public void queryUserById() {
System.out.println(userDao.queryUserById(1l));
}
@Test
public void queryUserAll() {
userDao.queryUserAll().forEach(System.out::println);
}
//仅展示前两个功能测试代码
}
- 成功运行,再也不用写JDBC了!
总结MyBatis使用步骤
- 配置mybatis-config.xml 全局的配置文件 (1、数据源,2、外部的mapper) 及映射文件(配置statement)
- 基于配置创建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession对象
- 通过SqlSession操作数据库 CRUD
- 调用sqlSession.commit()提交事务(增删改时,需要调用该方法提交事务)
- 调用sqlSession.close()关闭会话
参考第一篇博客
https://blog.csdn.net/Fang_1996/article/details/107122202
总结使用MyBatis的测试步骤
- 编写UserDao接口
- 编写UserDao的实现类UserDaoImpl及映射文件UserDaoMapper.xml
- 修改全局配置文件,引入UserDaoMapper.xml
- 编写UserDao的Junit Test Case测试用例