一、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一起学着。