接上一个博客(Mybatis(二)核心配置文件),请提前配置xml文件信息。
1、增删改查
增加
- 接口中配置相应的方法
public interface ParameterMapper {
// 添加用户
int insertUser();
}
- 在配置文件中ParameterMapper.xml中配置对应的接口sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mlzx.mapper.ParameterMapper">
<insert id="insertUser">
insert t_user values(2, '李四', '123', 23, '男', '123@163.com');
</insert>
</mapper>
需要注意的是,xml文件中的id -> insertUser需要和接口中的方法名一致。
- 测试结果
@Test
public void testInsert(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
int userNumber = mapper.insertUser();
System.out.println(userNumber);
}
SqlSessionUtils 是我写的一个包装类,我会把它放到最后,简单来说,就是生成一个sqlSession的过程。
删除
- 接口中配置相应的方法
public interface ParameterMapper {
// 删除用户
int deleteUser();
}
- 在配置文件中ParameterMapper.xml中配置对应的接口sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mlzx.mapper.ParameterMapper">
<delete id="deleteUser">
delete from t_user where id = 2;
</delete>
</mapper>
- 测试结果
@Test
public void testDeleteUser(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
int userNumber = mapper.deleteUser();
System.out.println(userNumber);
}
测试结果
修改
因为内容大概一样,所以我就简单写一下。
代码语言:javascript复制<!--int updateUser();--> 接口方法
<update id="updateUser">
update t_user set username = '张三' where id = 5
</update>
查看
1. 查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系
- resultType:自动映射,用于属性名和表中字段名一致的情况
- resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
2. 当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值
- 查看一个实体类对象
<!--User getUserById();--> 接口方法
<select id="getUserById" resultType="User">
select * from t_user where id = 2
</select>
2. 查询集合
代码语言:javascript复制<!--List<User> getUserList();--> 接口方法
<select id="getUserList" resultType="User">
select * from t_user
</select>
获取参数
在前面写到的一些数据库操作中,所有的 参数都是已知的,但是在实际情况中,这些id等信息都是未知的,所以说用别的符号代替它,使用的时候直接换成id即可。在获取参数时有两个方法,分别是${}和#{} ,它们的区别如下:
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
单个参数
代码语言:javascript复制<!--#{}-->
<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select * from t_user where username = #{username}
</select>
代码语言:javascript复制
<!--${}-->
<!--User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select * from t_user where username = '${username}'
</select>
多个参数
若mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中。
可以使用arg0,arg1... 或者 param1,param2...作为参数,值为键。
举例如下:
代码语言:javascript复制<!--User checkLogin(String username,String password);-->
<select id="checkLogin" resultType="User">
select * from t_user where username = #{arg0} and password = #{arg1}
</select>
代码语言:javascript复制<!--User checkLogin(String username,String password);-->
<select id="checkLogin" resultType="User">
select * from t_user where username = '${param1}' and password = '${param2}'
</select>
map集合类型的参数
代码语言:javascript复制若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
<!--User checkLoginByMap(Map<String,Object> map);-->
<select id="checkLoginByMap" resultType="User">
select * from t_user where username = #{username} and password = #{password}
</select>
代码语言:javascript复制@Test
public void checkLoginByMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("usermane","admin");
map.put("password","123456");
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
实体类型的参数
代码语言:javascript复制若mapper接口中的方法参数为实体类对象时此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
<!--int insertUser(User user);-->
<insert id="insertUser">
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
</insert>
代码语言:javascript复制@Test
public void insertUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
User user = new User(null,"Tom","123456",12,"男","123@321.com");
mapper.insertUser(user);
}
使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中
1. 以@Param注解的value属性值为键,以参数为值;
2. 以param1,param2...为键,以参数为值;
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
代码语言:html复制<!--User CheckLoginByParam(@Param("username") String username, @Param("password") String password);-->
<select id="CheckLoginByParam" resultType="User">
select * from t_user where username = #{username} and password = #{password}
</select>
代码语言:java复制@Test
public void checkLoginByParam() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
mapper.CheckLoginByParam("admin","123456");
}
生成SqlSession过程
先放下一段从《Mabatis技术内幕》一书中摘抄的一段话,它详细解释了sql的执行过程
应用程序首先会加载 mybatis-config.xml 配置文件,并根据配置文件的内容创建 SqlSessionFactory 对象;然后,通过 SqlSessionFactory 对象创建 SqlSession 对象, SqlSession 接口中定义了执行 SQL 语句所需要的各种方法;之后,通过 SqlSession 对象执行映射配置文件中定义的 SQL 语句,完 成相应的数据操作 最后 ,通过 SqlSession 对象提交事务,关闭 SqlSession 对象。
根据上述的描述,来写SqlSession的中间代码。
代码语言:javascript复制public class SqlSessionUtils {
//设置为static静态变量,可以全局查看
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
//对应上面描述中 “应用程序首先会加载 mybatis-config.xml 配置文件”。
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 对应上面描述中 “并根据配置文件的内容创建 SqlSessionFactory 对象”
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 对应上面描述中 “通过 SqlSessionFactory 对象创建 SqlSession 对象”,
// 因为sqlSession最后需要提交,所以设置为true,代表自动提交。类似于(sqlSession.commit())
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
愿你每天好心情!