Live2D
复制代码

02-使用Mybatis实现CRUD

1、使用mybatis实现单张表CRUD

1.1 创建项目

创建项目c-mybatis-crud,新建lib目录

1.2 编写配置文件

编写配置文件mybatis-config.xml和SqlMapper.xml,只要放到类路径下即可

1.3 编写属性配置文件

一般情况下,连接数据库的信息单独写到一个属性配置文件中,使得用户修改比较方便,就算用户再不会改这个属性配置文件,我们还可以写一个脚本文件(如.bat、.exe)帮助用户修改属性配置文件,从而更改xml文件。
在类的根路径下,新建一个jdbc.properties,配置连接数据库的信息。如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysqlstudy
jdbc.username=root
jdbc.password=rong195302
然后在核心配置文件中引入该文件,同时配置好sql映射文件SqlMapper.xml的路径,则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>

    <!--引入独立的配置文件-->
    <!--mybatis中的resource默认从项目的类路径查找-->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--注意${jdbc.driver}不是EL表达式,是mybatis自定制的语法
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="SqlMapper.xml"/>
    </mappers>
</configuration>
我们在新建编写xml、html等文件的时候,发现生成的文件上面有如下面的开头信息
<?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">
-----------------------------------------------------------------------------------------------------
其中有两条信息:
"-//mybatis.org//DTD Config 3.0//EN"
和"http://mybatis.org/dtd/mybatis-3-config.dtd",
前者是后者的唯一标识名字,后者是一个dtd约束文件,

"mybatis-3-config.dtd"是约束mybatis3核心配置文件的约束文件,
这种文件是约束要编辑的mybatis核心配置文件应该填什么标签,
怎么填,填的顺序怎么样等等,填的时候会有提示让你选择什么标签,以防填错,
其他类型的文件填写也有自己的dtd约束文件,如sql映射文件有"mybatis-3-mapper.dtd"。

当我们idea连网时,使用的约束文件就是通过网址
"http://mybatis.org/dtd/mybatis-3-config.dtd"来约束的,
当我们不连网时,是不会有提示的,这就需要我们下载后各种文件的dtd约束文件配置到idea中。
方法如下(idea):
	"-//mybatis.org//DTD Config 3.0//EN",
	这个就是一个唯一标识id名,idea通过这个名字找到对应的约束文件,
	对应的可以是URL(网上的dtd资源)也可以是本地dtd资源路径。
	我们将"http://mybatis.org/dtd/mybatis-3-config.dtd"双引号中的网址复制
	点击
	File->Settings->Languages & Frameworks->点击Schemas and DTDs->点击右边的+->将网址填到URL项,
	下面的file找到自己下载好的dtd文件->Apply-Ok
	这样idea的这个"http://mybatis.org/dtd/mybatis-3-config.dtd"网址
	找约束文件的时候就会去本地找,不需要联网了。

1.4 创建javabean

如下(没有特殊情况,尽量将实体类中的属性字段名与表中的一致)
package com.mybatis.domain;

public class User {
    
    private int id;
    private String loginName;
    private String loginPwd;
    private String realName;

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getLoginPwd() {
        return loginPwd;
    }

    public void setLoginPwd(String loginPwd) {
        this.loginPwd = loginPwd;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", loginName='" + loginName + '\'' +
                ", loginPwd='" + loginPwd + '\'' +
                ", realName='" + realName + '\'' +
                '}';
    }
}

1.5 编写sql映射文件SqlMapper.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">

<mapper namespace="test">
    <!--
        注意:
		parameterType属性是给sql语句中占位符传值的,定义占位符传什么类型对象的属性的值到该位置上
        翻译为:参数类型,下面insert语句中传递的是com.mybatis.domain.User类的属性字段值
        同时javabean在给占位符传值时,程序员要告诉mybatis应该将javabean的哪个属性字段值传到哪个占位符上
        所以占位符中需要有javabean的属性字段名
        mybatis中占位符不用问号表示,因为要放javabean的字段信息,
		所以用:#{这里写javabean的属性字段名} 表示
        #{loginName}底层原理是:
		mybatis会将#{}中的属性字段名获取到,将其首字母大写,然后在前面添加get,调用
        javabean中的各字段的get方法来获取到值,从而组成sql语句执行
    -->
    <insert id="save" parameterType="com.mybatis.domain.User">
        insert into t_user
            (loginName,loginPwd,realName)
        values
            (#{loginName},#{loginPwd},#{realName})
    </insert>

    <!--能复制的就复制,不要自己将属性名敲上去,以防敲错-->
    <update id="update" parameterType="com.mybatis.domain.User">
        update t_user set
            loginPwd = #{loginPwd},realName = #{realName}
        where
            id = #{id}
    </update>

    <!--
	resultType属性是查询结果集类型,
	我们发现insert和update标签是没有resultType属性的,只有在select标签中才有
	-->
    <!--parameterType这个属性是专门负责给sql语句传值的-->
    <!--当传值的参数类型标签中的数据类型是"简单类型"时,该属性可以省略
        即   parameterType="简单类型"  可省略
        但是
             resultType="简单类型"  是不能省略的
        "简单类型":17种
        byte short int long float double boolean char
        Byte Short Integer Long Float Double Boolean Character
        String
        由于这里根据id查询一条记录,传入一个int类型的id,自动封装成Integer类型,可省略
        而且只传入一个参数,#{}中的名字可任意编写
    -->
    <!--<select id="selectOne" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User">-->
    <select id="getById"  resultType="com.mybatis.domain.User">
        select
            id,loginName,loginPwd,realName
        from
            t_user
        where
            id = #{id}
    </select>

    <select id="getAll" resultType="com.mybatis.domain.User">
        select
            *
        from
            t_user
    </select>

    <delete id="deleteById">
        delete from t_user
        where
        id=#{id}
    </delete>
</mapper>

1.6 创建MyBatisCRUD.java测试类

代码如下

package com.mybatis.test;

import com.mybatis.domain.User;
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 javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyBatisTest01 {

    public static void main(String[] args) {

        SqlSession sqlSession = null;

        try {

//            String resource = "mybatis-config.xml";
//            InputStream inputStream = Resources.getResourceAsStream(resource);
//            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //合并上面代码
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));

            //开启事务
            sqlSession = sqlSessionFactory.openSession();

            /*
                do work() 编写业务代码
             */
            //insert
//            User user = new User();
//            user.setLoginName("18888688@qq.com");
//            user.setLoginPwd("1238888ffff");
//            user.setRealName("马云&马化腾");
            //sqlSession.insert()方法中的参数可以只传一个sql映射文件中sql语句的id字符串,表示sql映射文件中的insert语句是这样的:
            // insert into t_user(loginName,lodinPwd,realName) values("xxx","yyy","zzz") 所以不需要再传一个javabean对象
            //而这里我们是需要传javabean对象的,传两个参数
            //返回一个int类型数据,表示改动的记录条数
//            int count1 = sqlSession.insert("save",user);

            //update
//            User user = new User();
//            user.setId(5);
//            user.setLoginPwd("88888888");
//            user.setRealName("大马猴");
//            int count = sqlSession.update("update",user);
//            System.out.println(count);

            //selectOne
            User user1 = sqlSession.selectOne("getById",1);
            System.out.println(user1);
            System.out.println("========================================");
            //selectList
            List<User> userList1 = new ArrayList<>();
            userList1 = sqlSession.selectList("getAll");
            for (User user2:
                 userList1) {
                System.out.println(user2);
            }
            System.out.println("========================================");

            //delete
            int count = sqlSession.delete("deleteById",5);
            System.out.println(count);
            System.out.println("========================================");

            //selectList
            List<User> userList2 = new ArrayList<>();
            userList2 = sqlSession.selectList("getAll");
            for (User user2:
                    userList2) {
                System.out.println(user2);
            }

            //事务正常结束,提交
            sqlSession.commit();
        } catch (IOException e) {
            //出现异常,事务回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        }finally {
            //关闭资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

    }

}

1.7 给实体对象起别名

在上面的sql映射文件中,有一个缺点:
参数类型属性parameterType中我们要把javabean的完整类名填上去,每一条sql语句的parameterType属性都写上一个全限定类名,发现非常的重复,开发效率降低。
所以这里介绍mybatis中在核心配置文件中对javabean起别名的方式解决上面的缺点,核心配置文件如下:
<?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>

    <!--引入独立的配置文件-->
    <!--mybatis中的resource默认从项目的类路径查找-->
    <properties resource="jdbc.properties"/>

    <!--mybatis别名机制-->
    <!--第一种:该方式可以自定义别名,但是实体类较多的话,对很多javabean起别名,不方便-->
    <!--
    <typeAliases>
        <typeAlias type="com.mybatis.domain.User" alias="User"/>
    </typeAliases>
    -->
    <!--
    第二种:通过对某个包如实体类包domain中的所有javabean起别名,
    所有javabean的别名是其简化类名,缺点是不能自定义别名,大部分情况使用
    -->
    <typeAliases>
        <package name="com.mybatis.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="SqlMapper2.xml"/>
    </mappers>
</configuration>

然后将项目中的新建一个用别名的SqlMapper2.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="test">
    <insert id="save" parameterType="User">
        insert into t_user
            (loginName,loginPwd,realName)
        values
            (#{loginName},#{loginPwd},#{realName})
    </insert>

    <update id="update" parameterType="User">
        update t_user set
            loginPwd = #{loginPwd},realName = #{realName}
        where
            id = #{id}
    </update>


    <select id="getById"  resultType="User">
        select
            id,loginName,loginPwd,realName
        from
            t_user
        where
            id = #{id}
    </select>

    <select id="getAll" resultType="User">
        select
            *
        from
            t_user
    </select>

    <delete id="deleteById">
        delete from t_user
        where
        id=#{id}
    </delete>
</mapper>
posted @ 2021-08-08 22:53  Milen-jie  阅读(48)  评论(0编辑  收藏  举报