摘要:Mybatis笔记_02-2021.06.13,笔记内容均为观看B站视频@狂神说
-
一般性流程:前面已经实现第一个Mybatis程序时,已经将环境、依赖配置完成
-
进一步实现功能只需要修改:
①编写接口类:添加我们需要实现的功能(定义方法),如:UserMapper.java;
②编写Mapper文件:实现我们的功能,方法,如:UserMapper.xml;
③编写测试类:测试我们编写的代码,如:UserMapperTest.java;
④注意点:增删改必须要提交事务;
1.知识回顾及注意事项
- UserMapper.xml
<?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">
<!--namespace=帮定对应的Mapper接口(原理:相当于我们实现了这个接口)-->
<mapper namespace="com.riove.dao.UserMapper">
<!--SQL语句: id = "接口中的方法名" resultType = “全类名,返回类型” -->
<select id="getUserList" resultType="com.riove.pojo.User">
<!--执行SQL语句-->
select * from book.t_user
</select>
</mapper>
注意:1.namespace="这里写的是接口的全类名" ;
2.id = "实现接口中的方法";
3.resultType = ①全类名,返回SQL语句返回值类型;②普通数据类型,如:int、String等";
4.parameterType="传入参数类型";
5.#{"参数名"}: #{}相当于前面所学的占位符;
6.实体类中对象的属性可以直接拿出来(编写实体类应与数据库字段一一对应),如:#{id},#{username},#{password},#{email}
2.增加(Create)
UserMapper.java
//插入一个新的用户,参数是User对象
void addUser(User user);
UserMapper.xml
<!--插入一个新的用户,参数是User对象-->
<!--对象中的属性可以直接取出来-->
<insert id="addUser" parameterType="com.riove.pojo.User">
insert into t_user (id,username,password,email) values(#{id},#{username},#{password},#{email});
</insert>
UserMapperTest.java
@Test
public void addUserTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.获取SqlSession绑定的接口类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.测试方法
mapper.addUser(new User(6,"pojo","pojo","pojo@qq.com"));
//4.提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭资源
sqlSession.close();
}
}
3.查询、检索(Retrieve)
UserMapper.java
//查询所有用户
List<User> getUserList();
//通过id查询用户
User getUserById(int id);
UserMapper.xml
<!--查询所有用户-->
<select id="getUserList" resultType="com.riove.pojo.User">
select * from book.t_user;
</select>
<!--通过id查询用户-->
<select id="getUserById" parameterType="int" resultType="com.riove.pojo.User">
select * from t_user where id = #{id};
</select>
UserMapperTest.java
@Test
public void getUserListTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.执行Sql,面向接口,通过获取接口实现方法
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.实现方法
List<User> userList = mapper.getUserList();
//4.输出
for (User user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭SqlSession
sqlSession.close();
}
}
@Test
public void getUserByIdTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.获取SqlSession绑定的接口类,然后通过接口实现方法
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.测试(实现)方法
User userById = mapper.getUserById(1);
System.out.println(userById);
} catch (Exception e) {
e.printStackTrace();
} finally {
//4.关闭资源
sqlSession.close();
}
}
4.更新(Update)
UserMapper.java
//通过id,修改用户信息
void updateUserById(User user);
UserMapper.xml
<!--通过id,修改用户信息-->
<update id="updateUserById" parameterType="com.riove.pojo.User">
update t_user
set username = #{username},password = #{password},email = #{email}
where id = #{id};
</update>
UserMapperTest.java
@Test
public void updateUserByIdTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.获取SqlSession绑定的接口类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.测试方法
mapper.updateUserById(new User(6,"AABB","abc123","AABB@qq.com"));
//4.提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭资源
sqlSession.close();
}
}
5.删除(Delete)
UserMapper.java
//通过id,删除用户
void deleteUserById(int id);
UserMapper.xml
<!--通过id,删除用户-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id};
</delete>
UserMapperTest.java
@Test
public void deleteByIdTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.获取SqlSession绑定的接口类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.测试方法
mapper.deleteUserById(6);
//4.提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭资源
sqlSession.close();
}
}
6.Map的应用
- 使用场景:当需要传入大量的参数并且需要自定义参数名时,可以通过使用Map进行参数的传递
6.1 什么是Map?
/*
*Map<Key,Value> map,是一对键值对;
*键,Key:基本数据类型;
*值,Value,我们传入值的类型;
*注意:一个键只对应一个值,可以通过键获取里面的值
*/
如:Map<String,String> map = new HashMap<String, Object>();
map.put("map_name","Hello");
假设我们进行输入:System.out.println(map_name);
结 果:Hello
6.2 通过传入Map参数进行查询
UserMapper.java
//通过id查询用户,参数类型为Map
User getUserById2(Map<String, Object> map);
UserMapper.xml
<!--通过id查询用户,参数类型为Map-->
<select id="getUserById2" parameterType="map" resultType="com.riove.pojo.User">
select *
from t_user
where id = #{map_id};
</select>
UserMapperTest.java
@Test
public void getUserById2Test() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.获取SqlSession绑定的接口类,然后通过接口实现方法
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.传入一个Map<>类型的参数
Map<String,Object> map = new HashMap<String, Object>();
map.put("map_id",5);
//4.测试(实现)方法
User userById = mapper.getUserById2(map);
System.out.println(userById);
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭资源
sqlSession.close();
}
}
6.3 通过传入Map参数进行插入
UserMapper.java
//插入一个新的用户,参数类型为Map
void addUser2(Map<String,String> map);
UserMapper.xml
<!--插入一个新的用户,参数类型为Map-->
<!--我们可以将map理解为一个实体类,我们可以自定义参数名(这叫键,key),传入的值(这叫值,value)-->
<insert id="addUser2" parameterType="map">
insert into t_user (username,password,email)
values(#{map_username},#{map_password},#{map_email});
</insert>
UserMapperTest.java
@Test
public void addUser2Test() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.获取SqlSession绑定的接口类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.编写Map参数
Map<String,String> map = new HashMap<String, String>();
map.put("map_username","Hello");
map.put("map_password","hello");
map.put("map_email","Hello@qq.com");
//4.测试方法
mapper.addUser2(map);
//5.提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
//6.关闭资源
sqlSession.close();
}
}
6.4 Map应用小结
我们可以将Map当做一个可以临时的、可自定义的实体类(官方:实体类的原型就是Map),当我们需要传入大量的值和数据时,我们可以通过使用Map来进行传递,而不需要重新去定义一个实体类,并且可以临时定义,键值可自定义。
7. 模糊查询
模糊查询有两种传值方式:
- 1.可以在编写SQL代码时,将通配符("%")进行拼接好,用户只需要输入:值(Value);
UserMapper.java
//模糊查询
List<User> getUserListByLike(String value);
UserMapper.xml
<!--模糊查询-->
<select id="getUserListByLike" parameterType="String" resultType="com.riove.pojo.User">
select *
from t_user
where username like "%"#{value}"%";
</select>
UserMapperTest.java
@Test
public void getUserListByLikeTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.执行Sql,面向接口,通过获取接口实现方法
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.实现方法
List<User> userList = mapper.getUserListByLike("o");
//4.输出
for (User user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭SqlSession
sqlSession.close();
}
}
- 2.可以在编写传值代码块时,用户需要输入:通配符("%")+值(Value);
UserMapper.java
//模糊查询
List<User> getUserListByLike(String value);
UserMapper.xml
<!--模糊查询2-->
<select id="getUserListByLike" parameterType="String" resultType="com.riove.pojo.User">
select *
from t_user
where username like #{value};
</select>
UserMapperTest.java
@Test
public void getUserListByLikeTest() {
//1.获取的SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//2.执行Sql,面向接口,通过获取接口实现方法
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//3.实现方法
List<User> userList = mapper.getUserListByLike("%o%");
//4.输出
for (User user : userList) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭SqlSession
sqlSession.close();
}
}