本篇对mybatis学习做一个应用总结,使用开发工具IDEA操作数据库Mysql8撸一个入门级的demo,具有增删改查的功能。采用两种方式实现:①采用XML配置方式实现;②采用注解方式实现。且学习到一些关于Junit单元测试的使用。
一、创建项目
1、创建一个maven项目,添加框架需要的jar包依赖,对应使用pom文件引入依赖。
<dependencies>
<!--MyBatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql8数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!--Junit单元测试工具-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
上面的<scope>标签设定为test表示只参与测试阶段的相关工作,不会被打包出去。关于maven中的<scope>标签详解请看这里。
引入依赖下载的对应架包就在此处可以看到了。
2、接下来新建一个mybatis-cfg.xml配置文件,可从官网文档中直接复制模板过来,然后对应修改属性参数的值,可采用①直接写死在value中或者②引入jdbc.properties文件的方式(建议第二种)。
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3、使用IDEA快速创建POJO类,实现与数据库的映射,附骚操作。
4、新建一个mapper文件夹,然后在里面编写对应的mapper映射文件,也可从官网文档中复制,命名规则通常为
实体类名+Mapper
,如userMapper
<?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="xiaojiang.mybatisdemo.mapper.userMapper">
<select id="selectUserById" resultType="xiaojiang.mybatisdemo.entity.User">
select id,name,sex from user where id = #{id};
</select>
<select id="selectUserByName" parameterType="string" resultType="xiaojiang.mybatisdemo.entity.User">
select * from user where name like '%${value}%';
</select>
<insert id="insertUser" parameterType="xiaojiang.mybatisdemo.entity.User">
insert into User(id,name,sex) values(#{id},#{name},'${sex}');
</insert>
<update id="updateUser" parameterType="xiaojiang.mybatisdemo.entity.User">
update User set name=#{name} where id = #{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from User where id = #{id};
</delete>
</mapper>
5、创建UserDao对应的单元测试UserDaoTest,可通过IDEA快速创建单元测试,具体操作为:对应类源文件界面然后右键,选择GO TO>去开始创建Junit单元测试。以下是单元测试的具体编写:
package xiaojiang.mybatisdemo.dao;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import xiaojiang.mybatisdemo.entity.User;
import java.util.List;
public class UserDaoTest {
UserDao userDao;
@Before
public void setUp() throws Exception {
userDao = new UserDao();
}
@After
public void tearDown() throws Exception {
}
@Test
public void selectUserById() throws Exception{
User user = userDao.selectUserById(2);
System.out.println(user);
Assert.assertNotNull(user);
}
@Test
public void selectUserByName() throws Exception{
List<User> users = userDao.selectUserByName("江");
System.out.println(users);
Assert.assertNotNull(users);
}
@Test
public void insertUser() throws Exception {
User user = new User();
user.setId(5);
user.setName("小郑");
user.setSex("女");
Assert.assertEquals(1,userDao.insertUser(user));
}
@Test
public void updateUser() throws Exception {
User user = userDao.selectUserById(5);
user.setName("大郑");
Assert.assertEquals(1,userDao.updateUser(user));
}
@Test
public void deleteUser() throws Exception {
Assert.assertEquals(1,userDao.deleteUser(5));
}
}
6、运行单元测试即可查看结果(增删改查
)
测试查找多个用户操作:
测试插入用户操作:
测试修改用户操作:
测试删除用户操作:
小Demo我已经放在我的码云上,有需要看源码的小伙伴可直接点击跳转到这里mybatisDemo代码传送门。
附:
1、期间使用IDEApush到码云上出现的project reject报错解决方案
2、git的使用学习看我这篇
来个漂漂亮亮的分割线~~~~~~~~~~~
以上已经实现了一个完整的基于XML配置的方式的小例子,下面还有通过注解的方式来实现,代码就不push到码云了,直接贴出来方便查看吧,总结:采用注解的方式方便,采用XML配置的方式强大,不过有个小看法,当采用注解的话,sql语句还是耦合在代码中,采用XML配置的方式就把sql语句与代码分离了出来,还是推荐第二种采用XML配置的方式。 注:所有代码都贴于下方。
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiaojiang.mybatisDemo01</groupId>
<artifactId>mybatisDemo01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--MyBatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!--Junit单元测试工具-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
SqlSessionFactoryUtil工具类
/**
* FileName: SqlSessionFactoryUtil
* Author: 小江
* Date: 2019/2/12 20:45
* History:
*/
package utils;
import dao.UserDao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 22:59
*Description 抽取出来的工具类
*/
public class SqlSessionFactoryUtil {
public static SqlSessionFactory getFactory(){
InputStream inputStream = null;
SqlSessionFactory sqlSessionFactory = null;
try{
inputStream = UserDao.class.getClassLoader().getResourceAsStream("mybatis-cfg.xml");
//根据配置的输入流构造一个SQL会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}finally {
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sqlSessionFactory;
}
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 23:00
*Description 获得SQL会话,自动提交
*/
public static SqlSession openSession(boolean isAutoCommit){
return getFactory().openSession(isAutoCommit);
}
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 23:00
*Description 关闭SQL会话
*/
public static void closeSession(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
UserMapper接口(用于使用注解注入sql语句)
/**
* FileName: UserMapper
* Author: 小江
* Date: 2019/2/12 21:22
* History:
*/
package dao;
import entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface UserMapper {
@Select("select * from user where id = #{id}")
User selectUserById(int id);
@Select("select * from user where name like '%${value}%'")
List<User> selectUserByName(String name);
@Insert("insert into user(id,name,sex) values(#{id},#{name},#{sex})")
int insertUser(User user);
@Update("update user set name=#{name} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUser(int id);
}
mybatis-cfg.xml配置文件(注:采用XML方式和采用注解方式的区别在于此处的mapper标签
)
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://数据库:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="dao.UserMapper"/>
</mappers>
</configuration>
UserDao类
/**
* FileName: UserDao
* Author: 小江
* Date: 2019/2/12 21:21
* History:
*/
package dao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import utils.SqlSessionFactoryUtil;
import java.util.List;
public class UserDao implements UserMapper {
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 22:56
*Description 根据id查找对象
*/
public User selectUserById(int id) {
User user = null;
//打开一个会话
SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
//获得一个映射器
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//查询单个对象,指定参数
user = userMapper.selectUserById(id);
//关闭会话
SqlSessionFactoryUtil.closeSession(sqlSession);
return user;
}
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 22:56
*Description 根据用户名查找对象
*/
public List<User> selectUserByName(String name) {
List<User> users = null;
SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
users = userMapper.selectUserByName(name);
SqlSessionFactoryUtil.closeSession(sqlSession);
return users;
}
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 22:56
*Description 插入用户对象
*/
public int insertUser(User user) {
int rows = 0;
SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
rows = userMapper.insertUser(user);
SqlSessionFactoryUtil.closeSession(sqlSession);
return rows;
}
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 22:57
*Description 根据id来修改用户对象
*/
public int updateUser(User user) {
int rows = 0;
SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
rows = userMapper.updateUser(user);
SqlSessionFactoryUtil.closeSession(sqlSession);
return rows;
}
/**
*@Author 小江 [com.zhbit]
*@Date 2019/2/12 22:57
*Description 根据id来删除用户对象
*/
public int deleteUser(int id) {
int rows = 0;
SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
rows = userMapper.deleteUser(id);
SqlSessionFactoryUtil.closeSession(sqlSession);
return rows;
}
}
UserDaoTest单元测试类
package dao;
import entity.User;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
UserMapper userDao; //面向接口编程
@Before
public void setUp() throws Exception {
userDao = new UserDao();
}
@After
public void tearDown() throws Exception {
}
@Test
public void selectUserById() {
User user = userDao.selectUserById(2);
System.out.println(user);
Assert.assertNotNull(user);
}
@Test
public void selectUserByName() {
List<User> users = userDao.selectUserByName("江");
System.out.println(users);
Assert.assertNotNull(users);
}
@Test
public void insertUser() {
User user = new User();
user.setId(5);
user.setName("小琼");
user.setSex("女");
userDao.insertUser(user);
Assert.assertEquals(1,userDao.insertUser(user));
}
@Test
public void updateUser() {
User user = userDao.selectUserById(3);
user.setName("小李");
Assert.assertEquals(1,userDao.updateUser(user));
}
@Test
public void deleteUser() {
Assert.assertEquals(1,userDao.deleteUser(3));
}
}