SpringBoot Mybatis 增删改查+存储

开发工具: IDEA 2022.1.4+ Mybatis+ SQL SERVER 2012

目录

1. 概述

2. 准备工作

        2.1 SQL表结构

        2.2 测试存储准备

        2.3 mybatis-config.xml配置

        2.4 jdbc.properties配置

3. 代码实现

        3.1 工具类 MybatisUtils获取SqlSession

        3.2 创建实体类 User

        3.3 创建UserMapper接口

        3.4 创建UserMapper.xml文件

        3.5 新建UserController控制类

4. 结语


1. 概述

        CRUD是数据库得基本操作,在SQLServer里,视图、存储也使用得非常频繁。摸索着视频学习,也查阅着百度上得资料,特地自己实践下操作。

2. 准备工作

        之前写过一篇关于存储操作得,这个就一起再整理下。

        2.1 SQL表结构

        测试数据就随意整点了。

CREATE TABLE [dbo].[TB_USER](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[loginname] [varchar](30) NOT NULL,
	[username] [varchar](30) NOT NULL,
	[password] [varchar](20) NOT NULL,
	[groupid] [varchar](10) NOT NULL,
	[memo] [varchar](50) NULL,
	[enable] [int] NOT NULL,
 CONSTRAINT [PK_TB_USER_1] PRIMARY KEY CLUSTERED 
(
	[loginname] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

        2.2 测试存储准备

CREATE procedure [dbo].[usp_user_getUser]
	@username varchar(30)='',
	@groupid varchar(10)=''
as
/*
	exec usp_user_getUser '',''
*/
begin
	select * from TB_USER with(nolock)
	where 1=1
		and ((@username='') or (@username<>'' and username=@username))
		and ((@groupid='') or (@groupid<>'' and groupid=@groupid))
end
GO

        2.3 mybatis-config.xml配置

        当时额外搞了一个jdbc.properties文件。主要是想知道有这么一种实现方式。就来实践操作下。其实jdbc相关设置时可以直接写在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核心配置文件-->
<!--顺序 properties->settings->typeAliases->typeHandlers->objectFactory->objectWrapperFactory->reflectorFactory->plugins->environments->databaseIdProvider->mappers-->
<configuration>
    <!--jdbc.properties配置文件-->
    <properties resource="jdbc.properties"></properties>

    <!--设置mybatis输出日志 Mybatis默认就是STDOUT_LOGGING-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--  类型别名 默认为类名 指定这个后 mapper的xml文件指定返回值时候 可直接写类名(不区分大小写) 建议直接拷贝类名  -->
    <typeAliases>
        <package name="com.ceaning.crudp.entity"/>
    </typeAliases>

    <!-- 环境配置 -->
    <!-- development IDEA默认 开发环境 -->
    <!-- 可以自定义 比如定义test formal 看心情 每个SqlSessionFactory实例只能选择一种环境 这个可随时配置 -->
    <!-- test 测试环境 -->
    <!-- formal 正式环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 映射器 每一个mapper.xml都需要在Mybatis的核心文件中注册! -->
    <!-- 注册方式1 使用xml文件 <mapper resource="com/ceaning/efmis/mapper/UserMapper.xml"/> -->
    <!-- 注册方式2 使用class文件 <mapper class="com.ceaning.efmis.mapper.UserMapper"/> -->
    <!-- 注册方式3 mapper代理方式 <package name="com.ceaning.efmis.mapper"/> -->
    <!--
        注册方式2(使用class文件)和注册方式3(使用包扫描注册)
        1.接口和他的Mapper配置文件必须同名
        2.接口和他的Mapper配置文件必须在同一个包下
    -->
    <mappers>
        <package name="com.ceaning.crudp.mapper"/>
    </mappers>
</configuration>

        2.4 jdbc.properties配置

driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://127.0.0.1:1433;databaseName=EFMIS
username=sa
password=123qwe,.

3. 代码实现

        3.1 工具类 MybatisUtils获取SqlSession

        这个是看BiliBili学习,照搬得代码。实现从本地资源文件mybatis-config.xml中,获取设置创建SqlSessionFactory工厂。

public class MybatisUtils {
    //SqlSessionFactory 静态单例模式
    private static SqlSessionFactory sqlSessionFactory;

    //使用Mybatis第一步 获取SqlSessionFactory对象
    static {
        try{
            String resource="mybatis-config.xml";
            InputStream inputStream= Resources.getResourceAsStream(resource);
            sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    //获取SqlSession实例
    //该实例包含了面向数据库执行sql命令所需要的所有方法
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

        3.2 创建实体类 User

        使用@Data注解,就可以节省很多代码,但编译时候会自动生成Getter、Setter、ToString方法。 @JsonPropertyOrder用来指定输出得属性顺序。

/*
* 实体类: 系统登录用户表
* */
@Data
@JsonPropertyOrder(value = {"loginname","username","password","groupid","memo","enable"})//使用该注解 指定json顺序
public class User {
    @JsonIgnore //使用该注解 将某字段排除在序列化和反序列化之外
    private int id;
    //@JsonProperty("登录名")//给对应字段起别名 这样搞的话 在请求入参时候 就要用这个别名才行 不建议使用
    private String loginname;   //登录名
    private String username;    //账号
    private String password;    //密码
    private String groupid;     //组别
    private String memo;        //描述
    private int enable;         //状态
    /**
     * @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”)**:按照指定日期格式进行转换
     * 或
     * (建议 再application.yml中统一指定)
     * jackson:
     *     date-format: yyyy-MM-dd HH:mm:ss
     *     time-zone: GMT+8
     */
}

        3.3 创建UserMapper接口

        @Mapper注解得作用,在于标记当前接口属于Mapper接口。

@Mapper
public interface UserMapper {

    List<User> getUserList();

    User login(User user);

    int updateUser(User user);

    int deleteUser(User user);

    int addUser(User user);

    List<User> find(User user);

    List<Map<String,User>> getProcUser(String username, String groupid);

    List<Map<String,Object>> getProcUsers(String username, String groupid);
}

        3.4 创建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">
    <!--namespace=绑定一个对应的Dao/Mapper接口-->
    <mapper namespace="com.ceaning.crudp.mapper.UserMapper">
    <!--select查询语句-->
    <select id="getUserList" resultType="User">
        SELECT * FROM TB_USER WITH(NOLOCK)
    </select>

    <select id="login" parameterType="User" resultType="User">
        SELECT * FROM TB_USER WITH(NOLOCK) WHERE loginname=#{loginname} AND password=#{password}
    </select>

    <update id="updateUser" parameterType="User">
        UPDATE TB_USER
        <set>
            <if test="password!=null">password=#{password},</if>
            <if test="groupid!=null">groupid=#{groupid},</if>
            <if test="memo!=null">memo=#{memo},</if>
            <if test="enable!=null">enable=#{enable}</if>
        </set>
        WHERE username=#{username}
    </update>

    <delete id="deleteUser" parameterType="User">
        DELETE FROM TB_USER
        WHERE username=#{username}
    </delete>

    <insert id="addUser" parameterType="User">
        INSERT INTO TB_USER
        VALUES(#{username},#{password},#{groupid},#{memo},#{enable})
    </insert>
    <select id="getProcUser" statementType="CALLABLE" resultType="java.util.Map">
        {
            call usp_user_getUser (
                #{username,mode=IN,jdbcType=VARCHAR},
                #{groupid,mode=IN,jdbcType=VARCHAR}
            )
        }
    </select>
    <select id="getProcUsers" statementType="CALLABLE" resultType="java.util.Map">
        {
            call usp_user_getUser(
                #{username,mode=IN,jdbcType=VARCHAR},
                #{groupid,mode=IN,jdbcType=VARCHAR}
            )
        }
    </select>
    <select id="find" parameterType="User" resultType="User">
        SELECT * FROM TB_USER WITH(NOLOCK) WHERE username=#{username}
    </select>
</mapper>

        3.5 新建UserController控制类

        需要注意得是,在实际开发中,一般将类对象作为参数体传入,使用@RequestBody,入参可以使用json格式,自动转化为对象。

@Slf4j
@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private IUserInterface service;

    @Autowired
    private Info info;

    /**
     * 查询所有数据
     * @return
     */
    @GetMapping("/user/getUserList")
    public Result<?> getUserList(){
        //return Result.ok(DictResourceCache.getDict("User"));
        System.out.println("info:>>>>>>>>>>>>>>>"+ info);
        List<User> userList= service.query();
        return Result.ok(userList);
    }

    /**
     * 登录验证
     * @return
     */
    @PostMapping("/user/login")
    public Result<?> login(@RequestBody User user){
        SqlSession sqlSession= null;
        Map<String, Object> map= new HashMap<>();
        try{
            sqlSession= MybatisUtils.getSqlSession();
            UserMapper mapper= sqlSession.getMapper(UserMapper.class);
            user= mapper.login(user);
            if (user!= null){
                //生成token
                Map<String, String> tokenmap= new HashMap<>();
                tokenmap.put("loginname", user.getLoginname());
                tokenmap.put("password", user.getPassword());
                String token= JwtUtils.getToken(tokenmap);
                //返回数据
                map.put("user", user);
                map.put("token", token);
                return Result.ok(map);
            } else {
                return Result.error(CommonConstant.SYS_ERR_CODE, "用户不存在!");
            }
        } catch (Exception e){
            e.printStackTrace();
            return Result.error("异常!"+ e.getMessage());
        } finally {
            if (sqlSession!= null){
                sqlSession.close();
            }
        }
    }

    @PostMapping("/user/updateUser")
    public int updateUser(@RequestBody User user){
        return service.update(user);
    }

    @PostMapping("/user/deleteUser")
    public int deleteUser(@RequestBody User user){
        return service.delete(user);
    }

    @PostMapping("/user/addUser")
    public int addUser(@RequestBody User user){
        return service.add(user);
    }

    @PostMapping("/user/getProcUser")
    //这种方式 入参必须有值
    public List<Map<String,User>> getProcUser(String username, String groupid){
        List<Map<String,User>> list= null;
        SqlSession sqlSession= null;
        try{
            sqlSession= MybatisUtils.getSqlSession();
            UserMapper mapper= sqlSession.getMapper(UserMapper.class);
            list= mapper.getProcUser(username,groupid);
            System.out.println(list);
        } catch(Exception e){
            e.printStackTrace();
        } finally {
            if (sqlSession!= null){
                sqlSession.close();
            }
        }
        return list;
    }

    @PostMapping("/user/getProcUsers")
    public List<Map<String,Object>> getProcUsers(String username, String groupid){
        List<Map<String,Object>> list= null;
        SqlSession sqlSession= null;

        if (username==null){username= "";}
        if (groupid==null){groupid= "";}

        try{
            sqlSession= MybatisUtils.getSqlSession();
            UserMapper mapper= sqlSession.getMapper(UserMapper.class);
            list= mapper.getProcUsers(username,groupid);
            System.out.println(list);
        } catch(Exception e){
            e.printStackTrace();
        } finally {
            if (sqlSession!= null){
                sqlSession.close();
            }
        }
        return list;
    }
}

4. 结语

        即将准备不使用mybatis-config.xml文件,将配置写进application.yml, 并使用druid连接池。

        将之前得学习写在这里作个备份。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值