通用mapper的使用

时间:2024-03-23 10:45:45

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>

 通用mapper的使用

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 ) 如下 :

 通用mapper的使用

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问题及解决方案

 通用mapper的使用

解决:POJO属性的类型统一改为封装类型

 通用mapper的使用

总结:selective只会操作有得属性,update时一定要带着selective,表示只修改对应的值

 通用mapper的使用

通用mapper的使用

5. :解决密码隐藏 : 在实体类user)中的对应属性上,添加@JsonIgnore注解

通用mapper的使用

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中加入全局配置

    <!-- 配置注解驱动,Stringjson默认使用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 INORDER BY 等等都无法实现,这时就要用到通用Mapper中提供的 Example类了

查都有对应的 xxxByExample()方法

 通用mapper的使用

我们以查询为例来介绍这个Example的使用

// 通过Example实现特殊条件的查询

@Test

public void testSelectByExample() {

// 创建Example对象,并且指定要操作的实体类的Class对象

Example example = new Example(User.class);

// 创建查询条件对象,默认是and关系

example.createCriteria().andEqualTo("sex", 2).andBetween("age", 16, 24);// 查询女性,并且年龄在1624

// 添加查询条件,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语句

 通用mapper的使用

其中的参数

 通用mapper的使用

查询的结果

通用mapper的使用