一:背景介绍
在进行项目开发编写更新接口时,编写了11个Update接口,这样可以实现最后的功能效果,但是后期如果需要维护的话是十分难得。也无法进行复用和扩展。
下边的例子中,给大家展示了如何编写可复用、可扩展、维护成本低的SQL语句。
二:前期准备
代码环境:Java MyBatis maven项目,Mysql
引入pom依赖
需要引入mysql、mybatis、junit三个依赖即可。
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
MyBatis配置文件
实体类包的路径和接口mapper的路径需要改成自己的路径
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration mybatis的核心配置文件--> <configuration> <!--引入外部配置文件--> <properties resource="db.properties"/> <!--配置--> <settings> <!--标准日志工厂设置--> <setting name="logImpl" value="STDOUT_LOGGING"/> <!--显示的开启全局缓存--> <setting name="cacheEnabled" value="true"/> </settings> <!--可以给实体类取别名--> <typeAliases> <!--<typeAlias type="com.wangsiqi.pojo.User" alias="User"/>--> <!--可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean--> <package name="com.wangsiqi.pojo"/> </typeAliases> <!--environments 后面的s表示这是一个复数,可以编写多套环境 default表示默认的环境为development--> <environments default="development"> <!--编写一套环境 名称为configuration--> <environment id="development"> <!--jdbc的事务管理--> <transactionManager type="JDBC"/> <!--配置数据库相关数据--> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <!--userSSL是一个按权连接 &是一个转移符 等同于and CharacterEncoding=utf-8可以保证输入数据库的数据不乱码--> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--绑定接口--> <mappers> <mapper class="com.wangsiqi.dao.UserCourseGroupConfigurationMapper"/> </mappers> </configuration>
数据库连接文件
先进行数据库的连接
MyBatis配置类
//sqlSessionFactory(获取资源) 必然是构建 sqlSession //该工具类的作用时读取配置文件 获取sqlSessionFactory工厂 public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; //该代码的作用是提升作用域 可以让getSqlSession方法使用sqlSessionFactory static{ //静态代码块:一旦初始化就加载 try { //使用Mybatis第一步:获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; //获取资源,直接读到mybatis-config.xml InputStream inputStream = Resources.getResourceAsStream(resource); //需要用到输入流(InputStream) 把resource类加载进来 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//通过build把输入流加载进来 } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句 public static SqlSession getSqlSession() { //该方法会返回一个SqlSession类 // SqlSession sqlSession = sqlSessionFactory.openSession(); // return sqlSession; return sqlSessionFactory.openSession(true);//openSession中有自动commit(提交)事务的方法,加上true就能实现 } }
以上就是我们所需的基本环境啦,接下来就可以进行代码的编写啦~!
三:代码编写
Mapper编写
接口
public interface UserCourseGroupConfigurationMapper { void updateCourseGroupConfiguration(@Param("reviseParam")UserCourseGroupConfigurationPojo reviseParam, @Param("conditionParam")UserCourseGroupConfigurationPojo conditionParam); }
通用mapper
<update id="updateCourseGroupConfiguration"> update arpro_user_course_group_configuration <trim prefix="SET" suffixOverrides=","> <if test="reviseParam.infoId != null">info_id = #{reviseParam.infoId}</if> <if test="reviseParam.courseId != null">course_id = #{reviseParam.courseId}</if> <if test="reviseParam.classId != null">class_id = #{reviseParam.classId}</if> <if test="reviseParam.groupId != null">group_id = #{reviseParam.groupId}</if> <if test="reviseParam.type != null">type = #{reviseParam.type}</if> <if test="reviseParam.isDelete != null">is_delete = #{reviseParam.isDelete}</if> <if test="reviseParam.remark != null">remark = #{reviseParam.remark}</if> <if test="reviseParam.isMostLike != null">is_like = #{reviseParam.isLike}</if> </trim> where is_delete = 0 <if test="conditionParam.infoId != null"> and info_id = #{conditionParam.infoId}</if> <if test="conditionParam.courseId != null">and course_id = #{conditionParam.courseId}</if> <if test="conditionParam.classId != null">and class_id = #{conditionParam.classId}</if> <if test="conditionParam.groupId != null">and group_id = #{conditionParam.groupId}</if> <if test="conditionParam.isMostLike != null">and is_like = #{conditionParam.isLike}</if> <if test="conditionParam.type != null">and type = #{conditionParam.type}</if> </update>
实体pojo
@Data public class UserCourseGroupConfigurationPojo { /** * 主键id */ private BigInteger id; /** * 信息id是用户表的关联键 */ private BigInteger infoId; /** * 课程id */ private BigInteger courseId; /** * 班级id */ private BigInteger classId; /** * 分组id */ private BigInteger groupId; /** * 我学的课还是我教的课 */ private Integer type; /** * 是否删除 0 否 1是 */ private Integer isDelete; /** * 创建时间 */ private Date createTime; /** * 更新时间 */ private Date updateTime; /** * 备注 */ private String remark; /** * 分组名称 */ private String groupName; /** * 分组顺序 */ private Integer sequence; /** * 是否是默认分组 */ private Integer isDefault; /** * 是否为我喜欢分组 0其他分组,1特别关注分组 */ private Integer isMostLike; public BigInteger getId() { return id; } public void setId(BigInteger id) { this.id = id; } public BigInteger getInfoId() { return infoId; } public void setInfoId(BigInteger infoId) { this.infoId = infoId; } public BigInteger getCourseId() { return courseId; } public void setCourseId(BigInteger courseId) { this.courseId = courseId; } public BigInteger getClassId() { return classId; } public void setClassId(BigInteger classId) { this.classId = classId; } public BigInteger getGroupId() { return groupId; } public void setGroupId(BigInteger groupId) { this.groupId = groupId; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public Integer getIsDelete() { return isDelete; } public void setIsDelete(Integer isDelete) { this.isDelete = isDelete; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } public Integer getSequence() { return sequence; } public void setSequence(Integer sequence) { this.sequence = sequence; } public Integer getIsDefault() { return isDefault; } public void setIsDefault(Integer isDefault) { this.isDefault = isDefault; } public Integer getIsMostLike() { return isMostLike; } public void setIsMostLike(Integer isMostLike) { this.isMostLike = isMostLike; } }
junit测试编写
public class UserCourseGroupConfigurationTest { @Test public void test(){ //获取数据库连接 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserCourseGroupConfigurationMapper userCourseGroupConfigurationMapper = sqlSession.getMapper(UserCourseGroupConfigurationMapper.class); //进行更新操作 UserCourseGroupConfigurationPojo reviseParam = new UserCourseGroupConfigurationPojo(); UserCourseGroupConfigurationPojo conditionParam = new UserCourseGroupConfigurationPojo(); //假删除某个课的某个班的所有信息 /*reviseParam.setIsDelete(0); conditionParam.setCourseId(BigInteger.valueOf(223667994)); conditionParam.setClassId(BigInteger.valueOf(56496292));*/ //reviseParam是修改后的数据 reviseParam.setCourseId(new BigInteger("315282991842590721")); //conditionParam是修改条件 conditionParam.setCourseId(new BigInteger("315282991842590720")); conditionParam.setType(1); //进行调用 userCourseGroupConfigurationMapper.updateCourseGroupConfiguration(reviseParam,conditionParam); } }
测试结果
没执行代码之前的数据库表数据
执行成功后,数据库中type=1的数据不见了
然后使用course_id=315282991842590721修改后的数据进行查询
四:总结
通过以上分析,更加认识到了面向对象的思想是多么的伟大。我们一直都说做软件设计要使用面向对象的思想:可复用、可扩展、可维护,可是真的做起来没有做到知行合一。