Mybatis实现动态SQL
1、看需求
设计三张表:部门表、用户表、角色表,表中字段自拟,基于MyBatis的动态SQL实现以下查询、
1. 根据用户名和密码查询用户
2. 根据用户名查询用户
3. 查询所有用户
4. 查询角色
5 查询部门
6 查询指定部门中的用户
7 查询指定角色的用户
需求是要我们至少设计三张表,但是两表之间还需要互相连接,所以需要5张表,分别是user用户表、role角色表、dept部门表、user_role表,role_dept表
2、设计表
user表:
role表:
dept表:
user_role表:
role_dept表:
3、创建项目
1)创建Maven项目
可以参考之前的笔记:如何在eclipse和IDEA里创建Maven项目
2)新建资源文件夹resources
3)在pom.xml引入依赖
因为我们仍然需要Junit测试,所以引入Junit依赖;因为我们需要对数据库进行操作,所以引入MySQL驱动依赖;因为我们需要Mybatis,所以引入Mybatis依赖。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.23</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
</dependencies>
4)建立pojo类
User类,Role类,Dept类,还有对应的有参、无参、toString、getter和setter方法,注意对应表中字段的类型就可以了。可以参看我之前的笔记:https://blog.csdn.net/weixin_45747080/article/details/105978497,在3、4)中有介绍,这里就不再赘述。
5)建立Mapper接口,用于实现需求
看需求:
User:
1. 根据用户名和密码查询用户
2. 根据用户名查询用户
3. 查询所有用户
Role:
4. 查询角色
7. 查询指定角色的用户(一个角色可以被多个用户拥有)
Dept:
5. 查询部门
6. 查询指定部门中的角色(一个部门中可以有多个用户)
新建RoleMapper接口:
RoleMapper.java:
public interface RoleMapper {
//查询角色
Role selectRole(Role role);
//查询指定角色的用户(一个角色可以被多个用户拥有)
Role selectRoleAndUser(Role role);
}
其他两个接口同理,传递需要的参数,返回想要的参数就可以了
6)新建MybatisUtils工具类用获取SqlSession对象
MybatisUtils.java:
//Mybatis工具类
//sqlSessionFactory-->sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory=null;
//获取sqlSessionFactory对象
static {
try {
String resource="mybatis-config.xml";
InputStream in= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取sqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession=sqlSessionFactory.openSession();
return sqlSession;
}
}
7)新建mapper.xml写CRUD的SQL语句
动态SQL具体写法的相关笔记:https://blog.csdn.net/weixin_45747080/article/details/105253183
RoleMapper.xml:
mapper namespace="cn.wqk.mapper.RoleMapper">
<select id="selectRole" parameterType="Role" resultType="Role">
SELECT
role_id,role_name,role_key
FROM
sys_role
<trim prefix="WHERE" prefixOverrides="AND">
<if test=" role_id!=null and role_id!='' ">
AND role_id=#{role_id}
</if>
<if test=" role_name!=null and role_name!='' ">
AND role_name=#{role_name}
</if>
</trim>
</select>
<select id="selectRoleAndUser" parameterType="Role" resultMap="RoleAndUserMap">
SELECT
u.user_name,r.role_id,r.role_name,r.role_key
FROM
sys_user u,
sys_role r,
sys_user_role ur
<trim prefix="WHERE" prefixOverrides="AND">
<if test=" role_id!=null and role_id!='' ">
AND r.role_id=#{role_id}
</if>
<if test=" role_name!=null and role_name!='' ">
AND r.role_name=#{role_name}
</if>
</trim>
AND ur.role_id=r.role_id
AND u.user_id=ur.user_id
</select>
<resultMap id="RoleAndUserMap" type="Role">
<id property="role_id" column="role_id"/>
<result property="role_name" column="role_name"/>
<result property="role_key" column="role_key"/>
<collection property="userList" ofType="User">
<result property="user_name" column="user_name"/>
</collection>
</resultMap>
</mapper>
UserMapper.xml和DeptMapper.xml同理
8)db.properties数据库连接配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/表名?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
jdbc.username=你的数据库连接用户名
jdbc.password=你的数据库连接密码
9)mybatis-config配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入db.properties配置文件 -->
<properties resource="db.properties" />
<!-- 引入pojo包,就可以用类的别名了 -->
<typeAliases>
<package name="cn.wqk.pojo" />
</typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 配置Mapper映射文件地址 -->
<mappers>
<mapper class="cn.wqk.mapper.UserMapper"/>
<mapper class="cn.wqk.mapper.RoleMapper"/>
<mapper class="cn.wqk.mapper.DeptMapper"/>
</mappers>
</configuration>
10)Junit测试
RoleMapperTest.java:
public class RoleMapperTest {
SqlSession sqlSession=null;
@Before
public void setUp() throws Exception {
sqlSession = MybatisUtils.getSqlSession();
}
@After
public void tearDown() throws Exception {
sqlSession.close();
}
@Test
public void selectRole() {
RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
Role role = new Role();//如果传递空对象,就是查询所有角色
/*role.setRole_id(7);如果查询role_id=7就返回一个角色信息*/
/*role.setRole_name("保安");如果查询role_name=保安就返回一个角色信息*/
List<Role> roleList = mapper.selectRole(role);
for (Role role1 : roleList) {
System.out.println(role1);
}
}
@Test
public void selectRoleAndUser() {
RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
Role role = new Role();
role.setRole_id(7);
Role result = mapper.selectRoleAndUser(role);
System.out.println(result);
for (User user : result.getUserList()) {
System.out.println(user.getUser_name());
}
}
}
因为我给id为selectRole设置了动态SQL查询,只要role_id或者role_name有值就会用其中一个去查询,如果role_id和role_name都有值,那么就会将两个作为组合条件一起查询,如果一个条件都没有就是查询全表,直接输出所有角色信息
输出结果: