开发工具: IDEA 2022.1.4+ Mybatis+ SQL SERVER 2012
目录
3.1 工具类 MybatisUtils获取SqlSession
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连接池。
将之前得学习写在这里作个备份。