从零构建springboot项目三:集成mybatis
1、创建表
CREATE TABLE `t_mem_member` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`login_name` varchar(64) NOT NULL COMMENT '登录账号',
`login_pwd` varchar(64) NOT NULL DEFAULT '' COMMENT '登录密码',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
2、添加jar依赖 pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
【题外话】
lombok
官网 https://www.projectlombok.org/
注解说明 https://projectlombok.org/features/all
3、添加数据库配置
示例中使用的是mysql数据库
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/laonongmin?useSSL=false&useUnicode=true&characterEncoding=utf-8
username: xxxx
password: xxxx
mybatis:
type-aliases-package: com.johnny.*.model
4、添加实体类
package com.johnny.laonongmin.model.account;
import java.util.Date;
import com.johnny.laonongmin.model.BaseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Member extends BaseModel {
private static final long serialVersionUID = -3791892312743992410L;
private Long id;
/**登录账号*/
private String loginName;
/**登录密码*/
private String loginPwd;
/**创建时间*/
private Date createTime;
}
5、添加mapper包扫描
在启动类中添加对mapper包扫描@MapperScan。
package com.johnny.laonongmin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("com.johnny")
@MapperScan("com.johnny.laonongmin.mapper")
public class LaonongminWebApplication {
public static void main(String[] args) {
SpringApplication.run(LaonongminWebApplication.class, args);
}
}
【题外话】
关于@MapperScan
http://www.mybatis.org/spring/apidocs/reference/org/mybatis/spring/annotation/MapperScan.html
6、编写mapper接口【注解的形式】
package com.johnny.laonongmin.mapper.account;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;
import org.apache.ibatis.mapping.StatementType;
import com.johnny.laonongmin.model.account.Member;
public interface MemberMapper {
@Select("SELECT * FROM t_mem_member")
@Results({ @Result(property = "id", column = "id"),
@Result(property = "loginName", column = "login_name"),
@Result(property = "loginPwd", column = "login_pwd"),
@Result(property = "createTime", column = "create_time") })
List<Member> getAll();
@Select("SELECT * FROM t_mem_member where login_name=#{loginName} and login_pwd=#{loginPwd}")
@Results({ @Result(property = "id", column = "id"),
@Result(property = "loginName", column = "login_name"),
@Result(property = "loginPwd", column = "login_pwd"),
@Result(property = "createTime", column = "create_time") })
Member getMember(String loginName,String loginPwd);
@Insert("INSERT INTO t_mem_member(login_name,login_pwd) VALUES(#{loginName}, #{loginPwd})")
@SelectKey(statement="SELECT @@IDENTITY", keyProperty="id", before=false, resultType=Long.class,statementType=StatementType.STATEMENT)
int insert(Member member);
}
【题外话】
mybatis 注解说明 http://www.mybatis.org/mybatis-3/zh/java-api.html
8、manager
package com.johnny.laonongmin.manager.account.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.johnny.laonongmin.manager.account.MemberManager;
import com.johnny.laonongmin.mapper.account.MemberMapper;
import com.johnny.laonongmin.model.account.Member;
@Service
@Transactional
public class MemberManagerImpl implements MemberManager {
@Autowired
private MemberMapper memberMapper;
@Override
@Transactional(readOnly = true)
public Member getMember(String loginName, String loginPwd) {
return memberMapper.getMember(loginName, loginPwd);
}
@Override
@Transactional(readOnly = true)
public List<Member> getAllMember() {
return memberMapper.getAll();
}
@Override
public int saveMember(Member member) {
return memberMapper.insert(member);
}
}
9、编写controller
@Autowired
private MemberManager memberManager;
@RequestMapping("member/list")
public String memberList(Model model) {
List<Member> members = memberManager.getAllMember();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("members size:{}", members == null ? 0 : members.size());
}
model.addAttribute("memberList", members);
return "account/member_list";
}
10、页面展现
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>member list</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>memberList</h1>
<hr />
<table>
<tr>
<th>ID</th>
<th>账号</th>
<th>密码</th>
</tr>
<tr th:each="mem,iterStat : ${memberList}">
<td th:attr="mid=${mem.id}" th:text="${mem.id}"></td>
<td th:text="${mem.loginName}" ></td>
<td th:text="${mem.loginName}"></td>
</tr>
</table>
</body>
</html>
11、执行结果