上篇文章讲述了Mybatis是什么以及简单的将Mybatis的查询流程过了一便。使用Mybatis的应用应该从导包开始,导入mybatis依赖包,后在resources资源文件夹下新增mybatis-config.xml核心配置文件,配置数据库连接等信息,然后完成实体类、接口和SQL语句文件*Mapper.xml的映射。
本篇文章主要是完成一些增删改查工作,了解有参数情况下应该怎么操作。除此之外还有了解一下配置文件标签,以及配置文件的一些优化。
首先完成接口方法的创建
package com.mybatis.dao;
import com.mybatis.pojo.User;
import java.util.List;
public interface userMapper {
//增加用户
int addUser(User user);
}
第二步完成userMapper.xml的SQL语句实现
insert into user (id, name , pwd) value (#{id}, #{name}, #{pwd});
上述代码红有两个知识点:
- parameterType所映射的是addUSer()接口方法中传进来的参数类型,因为传进来的是User类型,所以parameterType填写的是User的完全限定名。传递进来的参数在SQL语句中怎么使用呢?使用#{}包裹参数名的方式完成,注意这里的参数名必须和addUser()传递进来的参数一致才可以。此处语句中的id name pwd也要和User类中的属性名一致。
可能有的人会觉得麻烦,因为如果项目庞大可能找不到对应的类型或参数名,这个后面的注解开发中会解决。
到此处增加的代码已经完成,接下来进行测试阶段:
@Test
public void addUserTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
User user = new User();
user.setId(4);
user.setName("天使");
user.setPwd("1614700");
mapper.addUser(user);
sqlSession.commit();
sqlSession.close();
}
查看结果:
在上述测试代码中有两个知识点:
- 在Mybatis中,当要完成增删改的操作时,都要执行sqlSession.commit()方法提交,否则数据库不会更新同步,会自动回滚到未操作时的状态。在完成全部操作后记得要关闭sqlSession
如果觉得每次提交都比较麻烦的话,可以在获取sqlSession的方法中做出一些改变,使其默认提交。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
让我们看一下其内置的方法:
public SqlSession openSession(boolean autoCommit) {
return this.sqlSessionFactory.openSession(autoCommit);
}
这里的autoCommit就是提交的意思。
改userMapper文件
//修改name
int updateNameByName(Map map);
userMapper.xml文件
update user set name = '枫华' where name = #{name};
上述代码中可以看到我传递类型是Map,而SQL中引用参数名称是name。由此可以知道使用Map集合可以随自己的心意传递任意参数名。
测试代码
@Test
public void updateNameTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
Map map = new HashMap();
map.put("name", "张三");
mapper.updateNameByName(map);
sqlSession.close();
}
执行结果:
userMapper文件
//根据name删除李四
int deleteByName(String name);
userMapper.xml文件
delete from user where name = #{name}
上述代码中可以看到我传递类型是Map,而SQL中引用参数名称是name。由此可以知道使用Map集合可以随自己的心意传递任意参数名。
测试代码
@Test
public void deleteByName(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
int result = mapper.deleteByName("李四");
if (result > 0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
sqlSession.close();
}
执行结果:
细心的读者可以看到三个不同的SQL语句我传递的参数都是不一样的,但是这个不是乱写的,不同参数类型对应的写法是不一样,随文章增表一张
场景:查找出name为枫华和天使的用户全部信息
userMapper.java文件
//查询name为枫华和天使的全部信息
List selectByName(@Param("names")List names);
上述代码中我使用了一个注解@Param,这个注解就是传递参数的注解,它的value就是参数名,可以在SQL语句中直接使用;同时也看到了我所传递的参数是List类型的,那么在SQL中怎么应用呢?怎么遍历呢?
userMapper.xml文件
从上述代码中可以看到采用了foreach标签来完成对list参数的遍历。其中属性也有不同意思:
collection:集合名称,也可以说是传递过来的参数名
item:遍历后每个元素的名称
index:索引
open:起到拼接SQL的作用,即开头使用(包裹
close:起到拼接SQL的作用,即结尾使用)包裹
separator:起到拼接SQL的作用,即每个元素之间使用,分割
测试代码
@Test
public void selectByName(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List list = new ArrayList();
list.add("枫华");
list.add("天使");
List users = mapper.selectByName(list);
for(User user : users){
System.out.println(user.toString());
}
sqlSession.close();
}
查询结果:
User(id=1, name=枫华, pwd=123456) User(id=4, name=天使, pwd=1614700)
到目前为止,增删改查的简单语句都完成了。
配置解析 动态配置属性——propertiesdb.properties文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&useUnicode=false&characterEncoding=UTF-8 username=root password=2222
mybatis-config.xml文件
属性配置可以采用外部引入的方式,可以灵活的完成数据库配置。具体应用场景可以想象以下:公司开发一般有三套数据库,测试一套、uat实测环境一套、生产测试一套,当环境变更的时候一般不会直接修改核心配置文件。
使用properties标签可以配置属性,其中的resources属性可以指定资源文件,从中获取到信息,而后在property标签中的value属性使用${}来完成映射。
那么就需要思考一个问题,properties标签和property标签谁的优先级更高呢?即两者都配置属性,系统以哪个为准呢?
properties标签中配置的账号、密码分别是root 1111,正确的账号密码分别是root 2222,即properties密码错误,dataSource下的property标签配置正确。测试发现可以正常运行,当二者反过来时报异常错误。
由此可以得出结论:properties标签的优先级更高,系统在读取时先读取properties标签的配置信息,而后再读取后续的配置信息并将properties的配置信息覆盖,最后的结果以property为准。
设置——settings这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。许多操作都要在这里配置方能够使用,比如日志、驼峰映射、缓存等等。具体只能通过自己摸索得出结论,这里只附表一张:
com.mybatis.pojo.User——这是全限定类名,这是XML独有的写法,主要用于类与XML文件之间的映射。在开发过程中经常会使用到,也是经常错误的地方。全限定类名不仅繁琐而且不符合程序员的开发习惯,如果一个实体类在十几个包下,那么全限定类名就会及其的长。为了解决这种繁琐的定类名,可以从核心配置文件的typeAliases中进行配置,配置一次后可以全局使用别名进行映射,简单有效。
类型别名的配置方法有三种:类配置、包配合、注解配置
类配置类配置别名也成为了自定义别名,使用typeAlias标签配置别名,type别名填写全限类定名,alias填写别名,将二者映射在一起。
mybatis-config.xml文件
userMapper.xml文件
包配置
包配置别名,系统会自动扫描mybatis-config.xml指定的包下面的类。使用类的非全限定名形式即可,但是建议使用全小写的形式,为了代码美观也为了区分类。
mybatis-config.xml文件
userMapper.xml文件
注解配置别名
使用注解配置较为自由,和类配置别名一样可以选用自己习惯的名字进行配置别名。
User文件
@Data
@AllArgsConstructor
@NoArgsConstructor
@Alias("BAT")
public class User implements Serializable {
private int id;
private String name;
private String pwd;
}
userMapper.xml文件
映射器——mappers
映射器是Mybatis中十分重要的,其完成的是注册*Mapper.xml,使得系统能够扫描到对应的xml文件。
方式有三个:XML文件映射、class映射、package映射
映射器的映射和类型别名的映射类似,可以做练习,这里无多介绍。
本篇文章内容就是这样,下一篇文章将介绍结果集映射、复杂语句时的处理以及动态SQL



