目录
二、创建Maven项目,引入pom依赖(初始化时的项目结构)
五、创建MyBatis的配置文件mybatis-config.xml,文件名称可自定义
1、定义UserMapper.xml文件用来管理RUN_User表
2、在MyBatis配置文件中注册UserMapper.xml文件
4、方式二:通过MyBatis底层封装好的Mapper动态代理实现自定义接口方式
步骤2:编写与方法对应的Mapper.xml文件,编写SQL语句
步骤3:在mybatis-config.xml文件中注册UserRepository.xml
一、ORMpping解释
ORMpping:object relationship mapping,对象关系映射。
对象:指java中的对象,面向对象思想;关系:指关系型数据库,这里是指MySQL数据库。Java对象到MySQL表的映射,开发者可以以面向对象的思想来管理数据库。
二、创建Maven项目,引入pom依赖(初始化时的项目结构)
<?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.wind</groupId>
<artifactId>diy-mybatis</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.13</version>
</dependency>
<!--lombok插件依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
<!--编译之后的文件中少了mapper.xml,这个和maven有关,maven编译src/java代码的时候,默认只会对java文件进行编译然后放在target/classes目录,需要在pom.xml中加入下面配置-->
<!--如果不添加此节点,mapper.xml文件、config.properties文件、config.spring文件都不会被加载到target的classes中去,也就不能被使用,也就会报错-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
三、新建数据库表
show databases;
use RUNOOB;
show tables;
select * from RUN_User;
desc RUN_User;
show create table RUN_User;
CREATE TABLE `RUN_User` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键,用户Id',
`Name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名',
`Age` smallint(6) NOT NULL DEFAULT '1' COMMENT '年龄',
`Salary` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '薪水',
`Sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别:0=未知,1=男,2=女',
`Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1=有效,-1=无效',
`AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB COMMENT='用户表';
四、新建Java实体类
@Data
@ToString
@Getter
@Setter
public class UserEntity implements Serializable {
private static final long serialVersionUID = -8951521178221206271L;
private long id; //主键,用户Id
private String name; //姓名
private int age; //年龄
private double salary; //薪水
private int sex; //性别:0=未知,1=男,2=女
private int status; //1=有效,-1=无效
private Date addTime; //添加时间
private Date updateTime; //更新时间
public UserEntity() {
}
public UserEntity(String name, int age, double salary, int sex) {
this.name = name;
this.age = age;
this.salary = salary;
this.sex = sex;
}
}
五、创建MyBatis的配置文件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>
<typeAliases>
<package name="com.wind.entity"/>
</typeAliases>
<!--配置mybatis运行环境-->
<environments default="development">
<environment id="development">
<!--配置JDBC事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置POOLED类型的JDBC数据源连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="admin0001112"/>
</dataSource>
</environment>
</environments>
<!--注册mapper文件-->
<mappers>
<mapper resource="com/entity/mapper/UserMapper.xml"/>
</mappers>
</configuration>
六、使用MyBatis框架操作数据库表
MyBatis框架需要开发者自己定义SQL语句,SQL语句写在Mapper.xml文件中。实际开发中,会为每个表对应的实体类都创建对应的Mapper.xml文件,用来定义管理该对象数据的SQL。
1、定义UserMapper.xml文件用来管理RUN_User表
<?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="com.entity.mapper.UserMapper">
<resultMap id="userMap" type="com.wind.entity.UserEntity">
<id column="Id" property="id"/>
<result column="Name" property="name"/>
<result column="Age" property="age"/>
<result column="Salary" property="salary"/>
<result column="Sex" property="sex"/>
<result column="Status" property="status"/>
<result column="AddTime" property="addTime"/>
<result column="UpdateTime" property="updateTime"/>
</resultMap>
<sql id="sql_select">
select Id, Name, Age, Salary, Sex, Status, AddTime, UpdateTime from RUN_User
</sql>
<insert id="insertUser" parameterType="userEntity" useGeneratedKeys="true"
keyProperty="userEntity.id">
insert into RUN_User ( Name, Age, Salary, Sex, Status )
values ( #{name}, #{age}, #{salary}, #{sex}, 1 )
</insert>
</mapper>
说明:
(1)namespace:命名空间,通常设置为文件所在包+文件名的形式。
(2)insert、update、delete、select 标签用来定义对数据库表的增改删查操作。
(3)id:实际调用MyBatis方式时需要用到的参数。
(4)parameter:调用对应方法时需要的参数类型。
(5)useGeneratedKeys:用来开启在插入一条数据后是否返回主键ID,如果为true,则开启,并且这个主键ID会在映射在keyProperty标签上返回到java程序中。
2、在MyBatis配置文件中注册UserMapper.xml文件
<!--注册mapper文件-->
<mappers>
<mapper resource="com/entity/mapper/UserMapper.xml"/>
</mappers>
3、方式一:调用MyBatis原生接口方式
public class UserTest {
public static void main(String[] args) {
//加载MyBatis配置文件
InputStream inputStream = UserTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//定位到Mapper文件中的某一个具体方法
String statement = "com.entity.mapper.UserMapper.insertUser";
UserEntity userEntity = new UserEntity("谢贤", 31, 5000.9, 1);
int result = sqlSession.insert(statement, userEntity);
sqlSession.commit();
System.out.println(result);
sqlSession.close();
}
}
如果报了这样的错误,则说明我们的Maven项目只能够主动读取Resources文件夹下的xml文件,而不能主动把java包下的xml文件读取进来并且放进target下的class文件中,所以,此时需要在pom.xml文件中额外配置resource标签。
resource标签如下:
<!--编译之后的文件中少了mapper.xml,这个和maven有关,maven编译src/java代码的时候,默认只会对java文件进行编译然后放在target/classes目录,需要在pom.xml中加入下面配置-->
<!--如果不添加此节点,mapper.xml文件、config.properties文件、config.spring文件都不会被加载到target的classes中去,也就不能被使用,也就会报错-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
到目前为止的项目结构:
4、方式二:通过MyBatis底层封装好的Mapper动态代理实现自定义接口方式
步骤1:自定义接口,定义与业务相关的接口
public interface UserRepository {
int insertUser(@Param("userEntity") UserEntity userEntity);
int deleteUser(@Param("userId") long userId);
int updateUser(@Param("userEntity") UserEntity userEntity);
UserEntity queryUser(@Param("userId") long userId);
List<UserEntity> queryAllUser();
}
步骤2:编写与方法对应的Mapper.xml文件,编写SQL语句
<?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="com.wind.repository.UserRepository">
<resultMap id="userMap" type="com.wind.entity.UserEntity">
<id column="Id" property="id"/>
<result column="Name" property="name"/>
<result column="Age" property="age"/>
<result column="Salary" property="salary"/>
<result column="Sex" property="sex"/>
<result column="Status" property="status"/>
<result column="AddTime" property="addTime"/>
<result column="UpdateTime" property="updateTime"/>
</resultMap>
<sql id="sql_select">
select Id, Name, Age, Salary, Sex, Status, AddTime, UpdateTime from RUN_User
</sql>
<insert id="insertUser" parameterType="userEntity" useGeneratedKeys="true" keyProperty="userEntity.id">
insert into RUN_User ( Name, Age, Salary, Sex, Status )
values ( #{userEntity.name}, #{userEntity.age}, #{userEntity.salary}, #{userEntity.sex}, 1 )
</insert>
<select id="queryUser" parameterType="long" resultMap="userMap">
<include refid="sql_select"/>
where status = 1 and id = #{userId}
</select>
<select id="queryAllUser" resultMap="userMap">
<include refid="sql_select"/>
where status = 1
</select>
<delete id="deleteUser" parameterType="long">
update RUN_User set status = 0 where id = #{userId}
</delete>
<update id="updateUser" parameterType="userEntity">
update RUN_User set name = #{userEntity.name}, age = #{userEntity.age}, salary = #{userEntity.salary}, sex = #{userEntity.sex}, status = 1
where id = #{userEntity.id}
</update>
</mapper>
注意:
(1)statement标签可以根据SQL执行的业务选择insert、update、delete、select。
(2)MyBatis框架会根据规则自动创建接口实现类的动态代理对象。
规则:
(1)Mapper.xml 中的namespace是接口的全类名。
(2)Mapper.xml 中的statement的id是接口中的方法名。
(3)Mapper.xml 中的statement的parameterType和接口中对应方法的参数类型保持一致。
(4)Mapper.xml 中的statement的resultType和接口中对应方法的返回值类型保持一致。
步骤3:在mybatis-config.xml文件中注册UserRepository.xml
<!--注册mapper文件-->
<mappers>
<mapper resource="com/entity/mapper/UserMapper.xml"/>
<mapper resource="com/entity/mapper/UserRepository.xml"/>
</mappers>
步骤4:调用接口的动态代理对象完成相关业务接口的测试
public class UserTest2 {
public static void main(String[] args) {
//加载MyBatis配置文件
InputStream inputStream = UserTest2.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取实现接口的代理对象
UserRepository userRepository = sqlSession.getMapper(UserRepository.class);
UserEntity userEntity = new UserEntity("风暴计划", 18, 100.999, 1);
int insertResult = userRepository.insertUser(userEntity);
sqlSession.commit();
System.out.println(insertResult);
int deleteResult = userRepository.deleteUser(11);
sqlSession.commit();
System.out.println(deleteResult);
userEntity.setSalary(200.88);
int updateResult = userRepository.updateUser(userEntity);
sqlSession.commit();
System.out.println(updateResult);
UserEntity queryResult = userRepository.queryUser(1);
System.out.println(queryResult.toString());
List<UserEntity> queryAllResult = userRepository.queryAllUser();
System.out.println(queryAllResult);
sqlSession.close();
}
}
到目前为止的项目结构: