MyBatis系列第二篇:搭建Maven項目實現對數據庫表的基本操作

目錄

一、ORMpping解釋

二、創建Maven項目,引入pom依賴(初始化時的項目結構)

三、新建數據庫表

四、新建Java實體類

五、創建MyBatis的配置文件mybatis-config.xml,文件名稱可自定義

六、使用MyBatis框架操作數據庫表

1、定義UserMapper.xml文件用來管理RUN_User表

2、在MyBatis配置文件中註冊UserMapper.xml文件

3、方式一:調用MyBatis原生接口方式

4、方式二:通過MyBatis底層封裝好的Mapper動態代理實現自定義接口方式

步驟1:自定義接口,定義與業務相關的接口

步驟2:編寫與方法對應的Mapper.xml文件,編寫SQL語句

步驟3:在mybatis-config.xml文件中註冊UserRepository.xml

步驟4:調用接口的動態代理對象完成相關業務接口的測試


一、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&amp;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();
    }
}

到目前爲止的項目結構:

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章