1.导入依赖
Pom.xml中的配置:
<dependency> <groupId>com.github.abel533</groupId> <artifactId>mapper</artifactId> <version>2.3.4</version> </dependency> |
2.配置plugins
Mybatis-config.xml的plugins下新增plugin配置。注意:该插件必须配置在分页插件下方,目前没有分页插件,暂不用理会
<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor"> <!--主键自增回写方法,默认值MYSQL,详细说明请看文档 --> <property name="IDENTITY" value="MYSQL" /> <!--通用Mapper接口,多个通用接口用逗号隔开 --> <property name="mappers" value="com.github.abel533.mapper.Mapper" /> </plugin> |
3.使用通用mapper
3.1继承通用的Mapper<T>,必须指定泛型<T>
3.2泛型(实体类)<T>的类型必须符合要求
1、表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如UserInfo默认对应的表名为user_info。
2、表名可以使用@Table(name = "tableName")进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
3、字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
4、可以使用@Column(name = "fieldName")指定不符合第3条规则的字段名
5、使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.
6、建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键.
获取自增主键:
//不限于@Id注解的字段,但是一个实体类中只能存在一个(继承关系中也只能存在一个)
@GeneratedValue(generator = "JDBC")
private Integer id;
这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。
4测试通用方法
:::如果POJO类名和表名不对应一定要在类名上指名对应的表名
( 数据库表名为tab_user,而实体类名为user ) 如下 :
4.1新建测试类
public class NewUserMapperTest {
private NewUserMapper userMapper;
@Before
public void setUp() throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"spring/applicationContext.xml", "spring/applicationContext-mybatis.xml", "spring/applicationContext-transaction.xml",});
userMapper = applicationContext.getBean(NewUserMapper.class);
}
@Test
public void testSelectOne() {
User user = new User();
user.setUid(48);
System.out.println(userMapper.selectOne(user));
}
@Test
public void testSelect() {
User user = new User();
user.setName("taft");
System.out.println(userMapper.select(user));
}
@Test
public void testSelectCount() {
System.out.println(userMapper.selectCount(null));
}
@Test
public void testSelectByPrimaryKey() {
System.out.println(userMapper.selectByPrimaryKey(47));
}
@Test
public void testInsert() {
User user = new User();
user.setUsername("csy002");
user.setPassword("csy002");
user.setStatus("N");
user.setCode("hello-itheima");
System.out.println(userMapper.insert(user));
}
@Test
public void testInsertSelective() {
User user = new User();
user.setUsername("csy003");
user.setPassword("csy003");
user.setStatus("N");
user.setCode("hello-itcast");
System.out.println(userMapper.insertSelective(user));
}
}
4.2问题及解决方案
解决:把POJO属性的类型统一改为封装类型
总结:selective只会操作有”值”得属性,update时一定要带着selective,表示只修改对应的值
5. :解决密码隐藏 : 在实体类(user)中的对应属性上,添加@JsonIgnore注解
6.通用Example查询对象
测试类 : NewUserMapperTest 添加如下测试:
@Test
public void testSelectByExample() {
Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
//创建sex= “男”的查询条件
criteria.andEqualTo("sex","男");
List<User> users = userMapper.selectByExample(example);
System.out.println("users = " + users);
//对名称模糊查询
Example.Criteria criteria1 = example.createCriteria();
criteria1.andLike("name","%刘%");
//进行or组合
example.or(criteria1);
//添加排序功能
example.setOrderByClause(“ uid asc”);
System.out.println("=========================================");
System.out.println(userMapper.selectByExample(example));
}
7.通用mapper改造userServiceImpl
@Service("userService")
public class UserServiceImpl implements UserService {
// 实例用户数据访问类
@Autowired
private NewUserMapper userMapper;
/**
* 实现用户注册业务
*
* @param user
* @return boolean
* @throws Exception
*/
public boolean register(User user) throws Exception {
// 数据验证,用户名不能为空
if (user.getUsername() == null || "".equals(user.getUsername())) {
// 抛出自定义异常
throw new UserNameNotNullException("用户名不能为空");
}
// 判断用户名是否已被注册
User dbUser = userMapper.selectOne(user);
if (dbUser != null) {
// 抛出自定义异常
throw new UserExistsException("用户名已存在");
}
// 封装业务字段-**状态为未**
user.setStatus("N");
// 封装业务字段-**码(唯一,uuid)
user.setCode(UuidUtil.getUuid());
// 密码加密,使用md5加密,md5号称不可逆的加密算法
user.setPassword(Md5Util.encodeByMd5(user.getPassword()));
// 注册用户添加用户
int row = userMapper.insert(user);
// 发送邮件
MailUtil.sendMail(user.getEmail(),
"<a href='http://localhost:8080/travel/user/active?code="
+ user.getCode() + "'>用户**</a>");
return true;
}
/**
* **方法
*
* @param code
* @return
* @throws Exception
*/
public boolean active(String code) throws Exception {
User user = new User();
user.setCode(code);
User userStore = userMapper.selectOne(user);
userStore.setStatus("Y");
int row = userMapper.updateByPrimaryKeySelective(userStore);
return row > 0;
}
/**
* 登录的方法
*
* @param username
* @param password
* @return
* @throws Exception
*/
public User login(String username, String password) throws Exception {
// 数据校验
if (username == null || username.equalsIgnoreCase("")) {
throw new UserNameNotNullException("用户名不能为空");
}
// 判断用户名是否存在
User user = new User();
user.setUsername(username);
User dbUser = userMapper.selectOne(user);
if (dbUser == null) {
throw new UserNotExistsException("用户名不存在");
}
// 判断密码是否正确
if (!dbUser.getPassword().equals(password)) {
throw new PasswordErrorException("密码错误");
}
// 用户是否已**
if (dbUser.getStatus().equals("N")) {
throw new UserNoActiveException("用户未**");
}
return dbUser;
}
}
8.部分乱码 : 在{servlet-name}-servlet.xml中加入全局配置
<!-- 配置注解驱动,String转json默认使用ISO-8859-1,手动设置为UTF-8 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8"></constructor-arg>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
9. 复杂条件的查询、删除和修改
我们发现,上面在进行删除、修改、查询时,where后面跟的条件,都是AND关系,一些复杂的,例如:OR 、IN、ORDER BY 等等都无法实现,这时就要用到通用Mapper中提供的 Example类了
删、改、查都有对应的 xxxByExample()方法
我们以查询为例,来介绍这个Example的使用
// 通过Example实现特殊条件的查询
@Test
public void testSelectByExample() {
// 创建Example对象,并且指定要操作的实体类的Class对象
Example example = new Example(User.class);
// 创建查询条件对象,默认是and关系
example.createCriteria().andEqualTo("sex", 2).andBetween("age", 16, 24);// 查询女性,并且年龄在16到24
// 添加查询条件,or关系
example.or(example.createCriteria().andEqualTo("userName", "lisi"));// 或者用户名是lisi的
// 实现排序,多个排序规则以','隔开
example.setOrderByClause("age desc");
List<User> users = this.userMapper.selectByExample(example);
for (User user : users) {
System.out.println(user);
}
}
生成的SQL语句:
其中的参数:
查询的结果: