简介:
Entity就是实体层,我理解是java中的一个实体类,一个对象。
Mapper层与DAO等价,是用于直接操作数据库的层。
Service层就是对DAO层进行封装,相当于做好的工具,让用户直接用就好了。
Mybatis和数据库的引入
这里使用Maven进行项目的构建,Maven引入上述jar包版本如下
<!--引入mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--引入数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
试验对象--User
这里创建一个Entity-->User
User.java
package org.test.mybatis.entity;
public class User {
//这是三个属性
private int userId;
private String userName;
private String password;
//这里是String化,以后用这个方法能输出看到user内容
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
//下面是上面三个属性的setter、getter
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
userMapper--(与User实体对应的Mapper,这里只写select、insert两个数据库操作方法)
userMapper.java
package org.test.mybatis.Mapper;
import org.apache.ibatis.annotations.Param;
import org.test.mybatis.entity.User;
public interface userMapper {
//这里的@Param是表示有一个参数userId,这个是在Mybatis的xml文件上用的,不然Mybatis识别不了这个参数
User selectUser(@Param("userId") int userId);
int insertUser(User user);
}
有了userMapper.java就必须要有对应的userMapper.xml文件与它对应,不然操作不了数据库。当然,这个xml文件生成后也是会用得到的,将在后面Mybatis配置文件中进行使用。
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">
<!--
以下语句可以这样理解:
在org.test.mybatis的包下有一个接口类:userMapper
然后里面有一个方法:selectUser,且该方法暂时没有放置参数,当sql语句带有条件时可以添加参数进行sql条件查询,该方法的返回值是User类型的数据
namespace处就填写userMapper的全文称路径(好像是叫这个名)
-->
<mapper namespace="org.test.mybatis.Mapper.userMapper">
<select id="selectUser" resultType="org.test.mybatis.entity.User">
select * from test1
</select>
<insert id="insertUser">
<!--这里没有userId的原因是:我已经在数据库中设置这个字段为自增长,所以这里没有-->
insert into test1 (userName,password)
values (#{userName},#{password})
</insert>
</mapper>
userService.java——对Mapper层进行一个封装
这里是一个接口类,里面的方法实现将在userServiceImpl.java中进行实现。
userService.java
package org.test.mybatis.Service;
import org.test.mybatis.entity.User;
public interface userService {
User queryUser(int userId);
int addUser(User user);
}
userServiceImpl.java
package org.test.mybatis.Service;
import com.mysql.cj.Session;
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 org.test.mybatis.Service.userService;
import org.test.mybatis.entity.User;
import java.io.IOException;
import java.io.InputStream;
public class userServiceImpl implements userService {
//导入配置文件
String config = "MybatisDispositions.xml";
//将配置文件转换成stream
InputStream inputStream = Resources.getResourceAsStream(config);
//这是必需要添加的东西,现在不太清楚为什么,有待后面了解
public userServiceImpl() throws IOException {
}
//每个Mybatis都必须具备的SqlSessionFactory。使用一个SqlSessionFactory建造器,通过将转换的配置流交给建造器建造起SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建造完成后,再把Session给打开就可以使用SqlSession进行数据库操作(即openSession)
@Override
public User queryUser(int userId) {
User result = new User();
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
User user = sqlSession.selectOne("selectUser",userId);
result = user;
}catch (Exception e) {e.printStackTrace();}
return result;
}
@Override
public int addUser(User user) {
int num = 0;
try (SqlSession session = sqlSessionFactory.openSession()) {
num = session.insert("insertUser",user);
session.commit();
}catch (Exception e) {e.printStackTrace();}
return num;
}
}
配置文件——Mybatis连接数据库所使用的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
XML 头部的声明,它用来验证 XML 文档的正确性。
environment 元素体中包含了事务管理和连接池的配置。
mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--以下配置是Mybatis中的关键配置-->
<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://localhost:3306/wechartsmallprogrammanage?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/test/mybatis/userMapper.xml"/>
</mappers>
</configuration>
最后再写个测试类TestMybatis.java
TestMybatis.java
package org.test.mybatis;
import org.test.mybatis.Service.userServiceImpl;
import org.test.mybatis.entity.User;
import java.io.IOException;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//这就是对代码进行Entity、Mapper、Service分层的代码,
//我们可以看到这里的代码量算是挺少的,这也算是一个好处
//代码也可以很容易读懂,这样后期维护起来也简单
userServiceImpl serviceImpl = new userServiceImpl();
User user = new User();
user.setUserName("aaa");
user.setPassword("a");
int num = serviceImpl.addUser(user);
User user1 = serviceImpl.queryUser(1);
System.out.println(num);
System.out.println("=============================");
System.out.println(user1.toString());
}
}
//输出结果如下:
// 1
// =============================
// User{userId=1, userName='aaa', password='a'}