第一个MyBatis项目,MyBatis简单实战
在学习MyBatis之前,建议先学习一下maven,因为MyBatis涉及到很多jar包,如果自己一个个去找去下载是很麻烦的,而maven的强大之处就在于可以导入一个jar还有它所有所依赖的jar包.
创建一个maven项目
填写好GAV之后下一步就选好项目存储路径可以了
项目的目录结构
刚开始的项目结构可能看上去很多不知道什么东西的文件,很不舒服,但是删除又怕出问题
我们就可以把这些“无关紧要”的文件隐藏掉,第四步中填写的文字:
;*.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;target;vssver.scc;vssver2.scc;
这时候项目结构简洁得多
然后接下来一步,我们看看src中的项目结构
main文件夹下主要一个java目录,一个resources目录,但是需要注意这两个文件夹的标:java文件夹是个蓝色的,resources文件夹标的右下角有一叠金币一样的东西,如果没有特殊标请看下图
或者:
然后就可以开始我们的下一步了,如果是我们之前普通的JavaWeb项目,目录结构是这样的
而现在作为MyBatis项目,也需要符合MyBatis的项目结构习惯,如下:
了解了项目结构,我们就差不多开始这篇文章最关键的地方:
也就是resources文件夹,里面也有一个mapper文件夹,而java文件夹的mapper包却缺少了impl这个dao层实现类的包
MyBatis用通俗的话来概括就是基于ORM(对象/关系映射)的对JDBC操作进行简化的框架
而resources文件夹的mapper包下的xml文件和java文件夹中的mapper包的接口所对应,也是对接口的实现
代码演示
具体的实现细节,我们上代码:
我们将图片中关键的文件(java文件和xml文件)的代码附上:
首先是数据库(数据库的sql,我这这个表在“mybatis”数据库中):
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`age` int NULL DEFAULT NULL COMMENT '年龄',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jon', 32, 'test1@baomidou.com');
INSERT INTO `user` VALUES (2, 'Jack', 20, 'test2@baomidou.com');
INSERT INTO `user` VALUES (3, 'Tom', 28, 'test3@baomidou.com');
INSERT INTO `user` VALUES (4, 'Sandy', 21, 'test4@baomidou.com');
INSERT INTO `user` VALUES (5, 'Billie', 24, 'test5@baomidou.com');
SET FOREIGN_KEY_CHECKS = 1;
pom.xml文件的依赖
<!--依赖-->
<dependencies>
<!--maven是有一个本地仓库的,下载好的jar包就存在本地-->
<!-- 现在就是代表已经导入了一个java连接mysql的jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--ctrl+x删除一整行 ctrl+D-->
<!--引入mybatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--这是做单元测试的jar包,单元测试如果不懂,你就直接理解:导入一个jar包,然后利用@Test注解就可以注解多个方法,这些注解的方法都可以看作一个main()方法,重点是这些方法都可以写在一个类中-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<!--需要提前安装lombok插件,不知道如何安装的自行百度,很简单。(小辣椒),自动封装实体类的插件所需的jar包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
</dependencies>
entity包下User.java类的代码:
package entity;
import lombok.Data;
@Data//这时候就是发挥lombok插件的作用了
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
mapper包下UserDao.java接口的代码:
package mapper;
import entity.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有的学生信息
* @return
*/
List<User> findUsers();
/**
* 添加用户信息
* @param user
* @return
*/
int addUser(User user);
/**
* 根据id删除用户信息
* @param id
* @return
*/
int deleteUser(Long id);
/**
* 更新用户
* @param user
* @return
*/
int updateUser(User user);
}
resource文件夹下mybatis-config.xml(MyBatis的全局配置文件):
<?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>
<!--运行环境,可以配置多个运行环境,但是我们这里就需要一个,并且要与其中的一个环境的id对应上-->
<environments default="development">
<!--id可以自己命名-->
<environment id="development">
<!--事物管理器 默认使用JDBC进行事物管理-->
<transactionManager type="JDBC"/>
<!--配置数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&useUnicode=true&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--对应的mybatis的xml文件-->
<mapper resource="mapper/UserDao.xml"/>
</mappers>
</configuration>
java文件夹util包下MyBatisUtil.java工具类(为了简化测试类中的代码):
package util;
import org.apache.ibatis.io.Resources;
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;
public class MyBatisUtil {
static SqlSession sqlSession=null;
//说在前面
//基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例(为了获取SqlSession对象)为核心的
//SqlSessionFactory :factory是工厂的意思
//SqlSessionFactoryBuilder :builder是工人的意思
//所以下面的代码为了方便理解:SqlSessionFactoryBuilder工人产生SqlSessionFactory工厂,然后SqlSessionFactory工厂生产(openSession打开)SqlSession产品
/**
* 获取SqlSession对象
*/
public static SqlSession getSqlSession(){
String resouce= "mybatis-config.xml";
InputStream inputStream=null;
try {
inputStream = Resources.getResourceAsStream(resouce);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//builder工人创建工场factory
sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 关闭sqlSession
*/
public static void closeSqlSession(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
}
}
}
resource文件夹的mapper包下UserDao.xml(一个接口对应一个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">
<!--namespace:对应接口文件的路径-->
<mapper namespace="mapper.UserDao">
<!--每一种slq语句对应每一种标签-->
<!--id对应方法名,那么我们这里也就是实现了Dao接口的四个方法,同时id不可以重名,所以在MyBatis中不支持方法的重载,resultType为返回值类型,需要全路径-->
<select id="findUsers" resultType="entity.User">
select * from user
</select>
<!--parameterType为参数类型,增删改方法都可以不指定参数类型,但是便于理解,这里就指定了-->
<insert id="addUser" parameterType="entity.User">
--因为id是自增长列,所以values中id的值可以为null,也可以填写0,让其实现自增长
INSERT INTO `mybatis`.`user`(`id`, `name`, `age`, `email`) VALUES (null, #{name}, #{age}, #{email});
</insert>
<delete id="deleteUser" parameterType="java.lang.Long">
delete from user where id=#{id};
</delete>
<update id="updateUser" parameterType="entity.User">
UPDATE `mybatis`.`user` SET `name` = #{name}, `age` = #{age} WHERE `id` = #{id};
</update>
</mapper>
java文件夹text包下的MyBatis.java测试类
package text;
import entity.User;
import mapper.UserDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import util.MyBatisUtil;
import java.util.List;
public class MyBatisTest {
@Test
public void findUsers(){
//
//创建SqlSession对象
SqlSession sqlSession= MyBatisUtil.getSqlSession();
try {
List<User> users = sqlSession.selectList("mapper.UserDao.findUsers");
for (User user : users
) {
System.out.println(user.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//每次用完记得关闭连接对象
MyBatisUtil.closeSqlSession(sqlSession);
}
}
@Test
public void addUser(){
SqlSession sqlSession= MyBatisUtil.getSqlSession();
try {
User user=new User();
user.setName("李伟伟");
user.setAge(32);
user.setEmail("3322@qq.com");
int i = sqlSession.insert("mapper.UserDao.addUser",user);
//手动提交事物
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//每次用完记得关闭连接对象
MyBatisUtil.closeSqlSession(sqlSession);
}
}
@Test
public void addUser2(){
//在addUser()方法的基础上拓展
SqlSession sqlSession= MyBatisUtil.getSqlSession();
try {
User user=new User();
user.setName("戴富豪");
user.setAge(23);
user.setEmail("7788@qq.com");
UserDao userDao = sqlSession.getMapper(UserDao.class);//使用反射的方式
//仅仅是在内存中增加一个用户
int i = userDao.addUser(user);
//手动提交事物
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//每次用完记得关闭连接对象
MyBatisUtil.closeSqlSession(sqlSession);
}
}
@Test
public void deleteUser(){
SqlSession sqlSession= MyBatisUtil.getSqlSession();
try {
UserDao userDao = sqlSession.getMapper(UserDao.class);//使用反射的方式
//仅仅是在内存中删除一个用户
int i = userDao.deleteUser(6L);
//手动提交事物
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//每次用完记得关闭连接对象
MyBatisUtil.closeSqlSession(sqlSession);
}
}
@Test
public void updateUser(){
//在addUser()方法的基础上拓展
SqlSession sqlSession= MyBatisUtil.getSqlSession();
try {
UserDao userDao = sqlSession.getMapper(UserDao.class);//使用反射的方式
User user=new User();
user.setId(1);
user.setName("李伟伟");
user.setAge(32);
//仅仅是在内存中更新一个用户
int i = userDao.updateUser(user);
//手动提交事物
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
//每次用完记得关闭连接对象
MyBatisUtil.closeSqlSession(sqlSession);
}
}
}
最后
参考的文档:
MyBatis官方文档:https://mybatis.org/mybatis-3/zh/getting-started.html
此文作为个人总结,如果此文章有什么错误、或者有什么疑问欢迎留言。