上篇文章讲述了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 id="addUser" parameterType="com.mybatis.pojo.User">
insert into user (id, name , pwd) value (#{id}, #{name}, #{pwd});
insert>
上述代码红有两个知识点:
parameterType
所映射的是addUSer()接口方法中传进来的参数类型,因为传进来的是User类型,所以parameterType
填写的是User的完全限定名。#{}
包裹参数名的方式完成,注意这里的参数名必须和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();
}
增删改
的操作时,都要执行sqlSession.commit()
方法提交,否则数据库不会更新同步,会自动回滚到未操作时的状态。如果觉得每次提交都比较麻烦的话,可以在获取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 id="updateNameByName" parameterType="map">
update user set name = '枫华' where name = #{name};
update>
上述代码中可以看到我传递类型是Map
,而SQL中引用参数名称是name
。由此可以知道使用Map集合可以随自己的心意传递任意参数名。
测试代码
@Test
public void updateNameTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
Map<String, String> map = new HashMap<String, String>();
map.put("name", "张三");
mapper.updateNameByName(map);
sqlSession.close();
}
userMapper文件
//根据name删除李四
int deleteByName(String name);
userMapper.xml文件
<delete id="deleteByName" parameterType="string">
delete from user where name = #{name}
delete>
上述代码中可以看到我传递类型是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<User> selectByName(@Param("names")List<String> names);
上述代码中我使用了一个注解@Param
,这个注解就是传递参数的注解,它的value
就是参数名,可以在SQL语句中直接使用;同时也看到了我所传递的参数是List
类型的,那么在SQL中怎么应用呢?怎么遍历呢?
userMapper.xml文件
<select id="selectByName" resultType="com.mybatis.pojo.User">
select * from user
where name in
<foreach collection="names" item="name" index="index" open="(" close=")" separator=",">
#{name}
foreach>
select>
从上述代码中可以看到采用了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<String> list = new ArrayList<String>();
list.add("枫华");
list.add("天使");
List<User> 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)
到目前为止,增删改查的简单语句都完成了。
db.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文件
<properties resource="db.properties">
properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
属性配置可以采用外部引入的方式,可以灵活的完成数据库配置。具体应用场景可以想象以下:公司开发一般有三套数据库,测试一套、uat实测环境一套、生产测试一套,当环境变更的时候一般不会直接修改核心配置文件。
使用properties
标签可以配置属性,其中的resources属性可以指定资源文件,从中获取到信息,而后在property
标签中的value
属性使用${}
来完成映射。
那么就需要思考一个问题,properties
标签和property
标签谁的优先级更高呢?即两者都配置属性,系统以哪个为准呢?
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="1111"/>
properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="root"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
properties
标签中配置的账号、密码分别是root
1111
,正确的账号密码分别是root
2222
,即properties
密码错误,dataSource
下的property
标签配置正确。测试发现可以正常运行,当二者反过来时报异常错误。
由此可以得出结论:properties
标签的优先级更高,系统在读取时先读取properties
标签的配置信息,而后再读取后续的配置信息并将properties
的配置信息覆盖,最后的结果以property
为准。
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。许多操作都要在这里配置方能够使用,比如日志、驼峰映射、缓存等等。具体只能通过自己摸索得出结论,这里只附表一张:
com.mybatis.pojo.User
——这是全限定类名,这是XML独有的写法,主要用于类与XML文件之间的映射。在开发过程中经常会使用到,也是经常错误的地方。全限定类名不仅繁琐而且不符合程序员的开发习惯,如果一个实体类在十几个包下,那么全限定类名就会及其的长。为了解决这种繁琐的定类名,可以从核心配置文件的typeAliases
中进行配置,配置一次后可以全局使用别名进行映射,简单有效。
类型别名的配置方法有三种:类配置、包配合、注解配置
类配置别名也成为了自定义别名,使用typeAlias
标签配置别名,type
别名填写全限类定名,alias
填写别名,将二者映射在一起。
mybatis-config.xml文件
<typeAliases>
<typeAlias type="com.mybatis.pojo.User" alias="user"/>
typeAliases>
userMapper.xml文件
<select id="userList" resultType="user">
select * from user;
select>
包配置别名,系统会自动扫描mybatis-config.xml指定的包下面的类。使用类的非全限定名形式即可,但是建议使用全小写的形式,为了代码美观也为了区分类。
mybatis-config.xml文件
<typeAliases>
<package name="com.mybatis.pojo"/>
typeAliases>
userMapper.xml文件
<select id="userList" resultType="user">
select * from user;
select>
使用注解配置较为自由,和类配置别名一样可以选用自己习惯的名字进行配置别名。
User文件
@Data
@AllArgsConstructor
@NoArgsConstructor
@Alias("BAT")
public class User implements Serializable {
private int id;
private String name;
private String pwd;
}
userMapper.xml文件
<select id="userList" resultType="BAT">
select * from user;
select>
映射器是Mybatis中十分重要的,其完成的是注册*Mapper.xml
,使得系统能够扫描到对应的xml文件。
方式有三个:XML文件映射、class映射、package映射
映射器的映射和类型别名的映射类似,可以做练习,这里无多介绍。
本篇文章内容就是这样,下一篇文章将介绍结果集映射、复杂语句时的处理以及动态SQL