实战项目浅述用MyBatis-plus 条件构造器相比只用MyBatis使用的优点

一、MyBatis写的项目

1、什么是MyBatis-plus什么叫条件构造器

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官网给的定义。可以理解为减少工作量给我们用的一个插件。

条件构造器其实就是一个对象,以方法的形式提供了数据库操作的筛选关键字。

2、MyBatis实现数据库操作过程

数据库部分:

创建并链接数据库 设计表 加入表段。

3、测试数据库

加载数据库驱动  不过在加载驱动之前 要对idea能连接数据库进行测试。

 

 当出现一下结果说明数据库可以正常联通。

可以进行对数据库中已经写好的数据进行进一步的测试。  测试情况如下证明idea与sql数据库联通。

4、idea配置数据库链接过程

 导入数据库相关的依赖包,添加日志的配置文件log4j.properties,放到src/main/resourses下面。

log4j.rootLogger=debug,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE

log4j.logger.com.自己的代码所在位置=debug
log4j.logger.org.apache.ibatis=debug
log4j.logger.org.mybatis.spring=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
######################################################################################
# Console Appender  \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=debug
log4j.appender.CONSOLE.DatePattern=yyyy-MM-dd
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
######################################################################################
# Rolling File  \u6587\u4ef6\u5927\u5c0f\u5230\u8fbe\u6307\u5b9a\u5c3a\u5bf8\u7684\u65f6\u5019\u4ea7\u751f\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6
######################################################################################
#log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
#log4j.appender.ROLLING_FILE.Threshold=INFO
#log4j.appender.ROLLING_FILE.File=${baojia.root}/logs/log.log
#log4j.appender.ROLLING_FILE.Append=true
#log4j.appender.ROLLING_FILE.MaxFileSize=5000KB
#log4j.appender.ROLLING_FILE.MaxBackupIndex=100
#log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
######################################################################################
# DailyRolling File  \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=${SMBMS_C12_10.root}/logs/log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
#DWR \u65e5\u5fd7
#log4j.logger.org.directwebremoting = ERROR
#\u663e\u793aHibernate\u5360\u4f4d\u7b26\u7ed1\u5b9a\u503c\u53ca\u8fd4\u56de\u503c
#log4j.logger.org.hibernate.type=DEBUG,CONSOLE 
#log4j.logger.org.springframework.transaction=DEBUG
#log4j.logger.org.hibernate=DEBUG
#log4j.logger.org.acegisecurity=DEBUG
#log4j.logger.org.apache.myfaces=TRACE
#log4j.logger.org.quartz=DEBUG
#log4j.logger.com.opensymphony=INFO  
#log4j.logger.org.apache.struts2=DEBUG  
log4j.logger.com.opensymphony.xwork2=debug

然后设置四大属性(driver ,url ,username,password) 。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8
user=root//数据库用户名
password=root//数据的密码
checkoutTimeout=30000
idleConnectionTestPeriod=30
initialPoolSize=10
maxIdleTime=30
maxPoolSize=100
minPoolSize=5
maxStatements=200

当都配置完成后 开始写Dao层--->Service层--->Controller层代码 这里就不一一列举,下面是平日用来学习的项目的截图。

5、数据访问层

下面是dao层的接口 主要是整合 可以省略。

代码演示:

public interface UserMapper {

/**
	 * 通过条件查询-userList
	 * @param userName
	 * @param userRole
	 * @param currentPageNo
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	public List<User> getUserList(@Param("userName") String userName, @Param("userRole") Integer userRole,
                                  @Param("from") Integer currentPageNo, @Param("pageSize") Integer pageSize)throws Exception;
}

mapper中主要就是实现java对象的属性与数据库中的元素进行一一对应。

代码演示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.zjx.dao.user.UserMapper">
	<select id="getLoginUser" resultType="User">
<!-- 下面是数据库语句-->
		select * from smbms_user u
 		<trim prefix="where" prefixOverrides="and|or">
			<if test="userCode!=null">
				and u.userCode=#{userCode}
			</if>

		</trim>
	</select>

<!-- 自定义显示用户信息 -->
	<resultMap type="User" id="userList">
		<result property="id" column="id" />
		<result property="userCode" column="userCode" />
		<result property="userName" column="userName" />
		<result property="phone" column="phone" />
		<result property="birthday" column="birthday" />
		<result property="gender" column="gender" />
		<result property="userRole" column="userRole" />
		<result property="userRoleName" column="roleName" />
	</resultMap>

<!-- 查询用户信息列表 -->
	<select id="getUserList" resultMap="userList">
		select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole
		= r.id
		<if test="userRole != null">
			and u.userRole = #{userRole}
		</if>
		<if test="userName != null and userName != ''">
			and u.userName like CONCAT ('%',#{userName},'%')
		</if>
		order by creationDate DESC limit #{from},#{pageSize}
	</select>

<!-- 查询用户总记录数 -->
	<select id="getUserCount" resultType="Int">
		select count(1) as count from smbms_user u,smbms_role r where
		u.userRole = r.id
		<if test="userRole != null">
			and u.userRole = #{userRole}
		</if>
		<if test="userName != null and userName != ''">
			and u.userName like CONCAT ('%',#{userName},'%')
		</if>
	</select>

<select id="getUserById" resultType="user">
		select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r 
			where u.id=#{id} and u.userRole = r.id
	</select>
	
	
	<insert id="add" parameterType="User">
		insert into smbms_user (userCode,userName,userPassword,gender,birthday,phone,
								address,userRole,createdBy,creationDate,idPicPath,workPicPath) 
				values (#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},
				#{address},#{userRole},#{createdBy},#{creationDate},#{idPicPath},#{workPicPath})
	</insert>
	
	<update id="modify" parameterType="User">
	 update smbms_user 
		 <trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
	 		<if test="userCode != null">userCode=#{userCode},</if>
			<if test="userName != null">userName=#{userName},</if>
			<if test="userPassword != null">userPassword=#{userPassword},</if>
			<if test="gender != null">gender=#{gender},</if>
			<if test="birthday != null">birthday=#{birthday},</if>
			<if test="phone != null">phone=#{phone},</if>
			<if test="address != null">address=#{address},</if>
			<if test="userRole != null">userRole=#{userRole},</if>
			<if test="modifyBy != null">modifyBy=#{modifyBy},</if>
			<if test="modifyDate != null">modifyDate=#{modifyDate},</if>
			<if test="idPicPath != null">idPicPath=#{idPicPath},</if>
			<if test="workPicPath != null">workPicPath=#{workPicPath},</if>
		 </trim>
	</update>
	
	<update id="updatePwd" parameterType="Integer">
		update smbms_user set userPassword=#{userPassword} where id=#{id}
	</update>
	
	<delete id="deleteUserById" parameterType="Integer">
		delete from smbms_user where id=#{id}
	</delete>
</mapper>

6、业务层

 再往上(逻辑)就是Service层,Service层业务逻辑链接了Controller层和dao层,应该从Controller层&Dao层解耦出来,成为独立的Service层。说白了就是让Controller和Dao不分开,有bug的话,不会在Controller中一直找还找不到,优点一大堆,缺点就是不同的Controller之间,无法共享一样的业务逻辑。Service同样是由一个接口和一个Impl具体的实现类。

由于接口相当于将几种操作封装起来,当然这个service层在宏观看也就十个操作封装功能,这里就不放Service的接口了 只放了Impl的一个来展示一下。

代码演示:

@Override
	public User selectUserCodeExist(String userCode) throws Exception {
		// TODO Auto-generated method stub
		return userMapper.getLoginUser(userCode);
	}

6、控制层

Controller层负责具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,当然也是可以跳过Service 直接控制Dao层的配置。控制的配置也需要在配置文件中进行。

代码演示:

@Controller
@RequestMapping("/sys/user")//要接收的请求 如果是要加数据的话直接在后面加/{数据}
public class UserContrller {
	private Logger logger=Logger.getLogger(LoginController.class);
	@Resource
	UserService userService;
	@Resource
	private RoleService roleService;
	@RequestMapping(value="/list.html")
	public String getUserList(Model model,
							@RequestParam(value="queryname",required=false) String queryUserName,
							@RequestParam(value="queryUserRole",required=false) String queryUserRole,
							@RequestParam(value="pageIndex",required=false) String pageIndex){
		logger.info("getUserList ---- > queryUserName: " + queryUserName);
		logger.info("getUserList ---- > queryUserRole: " + queryUserRole);
		logger.info("getUserList ---- > pageIndex: " + pageIndex);
		Integer _queryUserRole = null;		
		List<User> userList = null;
		List<Role> roleList = null;
        //后面是分页 是在数据较多的情况下用的多一点 如果拿取的较少的话是可以忽略
		//设置页面容量
    	int pageSize = Constants.pageSize;
    	//当前页码
    	int currentPageNo = 1;
	
		if(queryUserName == null){
			queryUserName = "";
		}
		if(queryUserRole != null && !queryUserRole.equals("")){
			_queryUserRole = Integer.parseInt(queryUserRole);
		}
		
    	if(pageIndex != null){
    		try{
    			currentPageNo = Integer.valueOf(pageIndex);
    		}catch(NumberFormatException e){
    			return "redirect:/syserror";
    		}
    	}	//总数量(表)	
    	int totalCount = 0;
		try {
			totalCount = userService.getUserCount(queryUserName,_queryUserRole);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	//总页数
    	PageSupport pages=new PageSupport();
    	pages.setCurrentPageNo(currentPageNo);
    	pages.setPageSize(pageSize);
    	pages.setTotalCount(totalCount);
    	int totalPageCount = pages.getTotalPageCount();
    	//控制首页和尾页
    	if(currentPageNo < 1){
    		currentPageNo = 1;
    	}else if(currentPageNo > totalPageCount){
    		currentPageNo = totalPageCount;
    	}
		try {
			userList = userService.getUserList(queryUserName,_queryUserRole,currentPageNo,pageSize);
			
			roleList = roleService.getRoleList();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		model.addAttribute("userList", userList);
		model.addAttribute("roleList", roleList);
		model.addAttribute("queryUserName", queryUserName);
		model.addAttribute("queryUserRole", queryUserRole);
		model.addAttribute("totalPageCount", totalPageCount);
		model.addAttribute("totalCount", totalCount);
		model.addAttribute("currentPageNo", currentPageNo);
		return "userlist"; //等程序走完 返回一个界面 然后就完成了整个的对数据的处理
	}

 整个一个流程下来,好了现在我们可以拿到数据库中的数据了。

二、MyBatis-plus写的项目

前面与只用MyBatis是一致的,不同点是MyBatis-plus在dao和service层进行优化了对整个的MyBatis的框架。

1、pom.xml导包

在pom.xml中导入。

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.3</version>
</dependency>

2、Mapper简化

可以实现直接继承BaseMapper类。

代码演示:

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<Ut> {
}

 下面是BaseMappper类的封装内容,内容较多,封装了几乎所有常用的增、删、查、改、以及模糊查询等数据库的操作。

代码演示:

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> queryWrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}

 这里封装了增删查改的各种方法,使用时可以直接调用。

3、Pojo的简化

内容都在图里了。

代码演示:

代码演示:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("jinan")
public class Ut {
    @TableField("userid")
    private Integer userid;
    @TableField("username")
    private  String username;
    @TableField("password")
    private  Integer password;
}

上面有解释,不过要手写get、set、有参无参构造方法,注解开发也可以已经写在图上了。

4、Controller 层

代码演示:

@Controller
public class Testjdbc {
    @Autowired
    UserMapper userMapper;

    /*条件构造器*/
    @GetMapping("/123/{userid}")
    public HashMap<String,Object> getuser(@PathVariable("userid")Integer userid){
        HashMap<String,Object> map=new HashMap<>();
        QueryWrapper<Ut> wrapper=new QueryWrapper<>();
        wrapper.select("userid","username","password").eq("userid",userid);
        List<Ut> userids = userMapper.selectList(wrapper);
        System.out.println(userids);
        map.put("userid",userids);
        return map;

}

}

 then  你就可以拿到数据起飞了。

三、MyBatis-plus写的对比于MyBatis

减少了巨量的代码量 ,把整个映射过程自动配好,另外封装好了增删查改常用的函数供使用。冲就完了。建议学MyBatis时候把MyBatis-plus一起学着。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值