Mybatis架构
- mybatis 配置 mybatis-config.xml,此文件作为 mybatis 的全局配置文件,配置了 mybatis 的运行环境等信息。 mapper.xml 文件即 sql 映射文件,文件中配置了操作数据库的 sql 语句。此文件需要在 mybatis-config.xml 中加载。
- 通过 mybatis 环境等配置信息构造 SqlSessionFactory 即会话工厂
- 由会话工厂创建 sqlSession 即会话,操作数据库需要通过 sqlSession 进行。
- mybatis 底层自定义了 Executor 执行器接口操作数据库,Executor 接口有两个实现,一个 是基本执行器、一个是缓存执行器。
- Mapped Statement 也是 mybatis 一个底层封装对象,它包装了 mybatis 配置信息及 sql 映射信息等。mapper.xml 文件中一个 sql 对应一个 Mapped Statement 对象,sql 的 id 即 是 Mapped statement 的 id。
- Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就 是 jdbc 编程中对 preparedStatement 设置参数。
- Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至 java 对象中,输出结果映射过程 相当于 jdbc 编程中对结果的解析处理过程。
基本流程
通过maven搭建自己的项目
- 1:引入mybatis依赖
- 2:编写mybatis的主要配置文件(主要是environment节点)
- 3:pojo对象
- 4:编写mapper映射文件
- 5:将mapper引入到主配置文件
- 6:编写程序调用sql语句
演示
1:引入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
2:主配置文件
<?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"></properties>
<!--配置别名-->
<typeAliases>
<!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)-->
<package name="com.etime.pojo"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<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>
<environment id="test">
<!-- 使用jdbc事务管理-->
<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>
<mappers>
<mapper resource="mappers/SysRoleMapper.xml"></mapper>
<mapper resource="mappers/SysUserMapper.xml"></mapper>
</mappers>
</configuration>
3:SysRole类
/**
* @author 17268
* 角色
*/
public class SysRole{
private Integer roleid;
private String rolename;
private String roledesc;
private Integer rolestate;
public Integer getRoleid() {
return roleid;
}
public void setRoleid(Integer roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public String getRoledesc() {
return roledesc;
}
public void setRoledesc(String roledesc) {
this.roledesc = roledesc;
}
public Integer getRolestate() {
return rolestate;
}
public void setRolestate(Integer rolestate) {
this.rolestate = rolestate;
}
@Override
public String toString() {
return "SysRole{" +
"roleid=" + roleid +
", rolename='" + rolename + ''' +
", roledesc='" + roledesc + ''' +
", rolestate=" + rolestate +
'}';
}
}
4:SysRoleMapper.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">
<mapper namespace="com.etime.dao.SysRoleMapper">
<select id="selectSysRole" resultType="sysRole">
select roleid,rolename,roledesc,rolestate from sysrole
</select>
<insert id="insertSysRole" parameterType="sysRole">
insert into sysrole(rolename,roledesc,rolestate) values (#{rolename},#{roledesc},#{rolestate})
</insert>
<select id="selectSysRoleById" parameterType="int" resultType="sysRole">
select roleid,rolename,roledesc,rolestate from sysrole where roleid=#{roleid}
</select>
<update id="updateSysRole" parameterType="sysRole">
update sysrole set rolename=#{rolename},roledesc=#{roledesc},rolestate=#{rolestate}
where roleid=#{roleid}
</update>
<select id="selectSysRoleByState" resultType="sysRole">
select roleid,rolename from sysrole where rolestate=1
</select>
</mapper>
5:SysRoleMapper
/**
* @author 17268
* 角色dao层mybatis实现
*/
public interface SysRoleMapper {
/**
* 查询所有角色
* @return
*/
List<SysRole> selectSysRole();
/**
* 增加角色
* @return
*/
int insertSysRole(SysRole sysRole);
/**
* 根据id查询一个角色
* @param id
* @return
*/
SysRole selectSysRoleById(int id);
/**
* 根据id修改角色
* @param sysRole
* @return
*/
int updateSysRole(SysRole sysRole);
/**
* 根据状态为1查询角色名
* @return
*/
List<SysRole> selectSysRoleByState();
}
注意
- 1:mapper.xml文件中的namespace与mapper接口的类路径相同
- 2:mapper.xml中的每个statement的id与mapper接口的方法名相同
- 3:mapper.xml中的每个statement的parameterType与mapper接口的传入参数相同
- 4:mapper.xml中的每个statement的resultType与mapper接口的返回类型相同
- 5:在mapper.xml中sql使用#,相当于占位符有效防止sql注入。在不能传递sql参数的时候使用{value}
- 6:在传入多个参数将多个参数封装到一个map中;或者在mapper接口中使用@param注解
- 7:只有select操作才需要指定resultType,其它的有默认值
6:使用单例模式创建SqlSessionFactory对象
/**
* @author 17268
* 单例创建sqlsessionfactory实例
*/
public class CreateSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory;
static {
String config = "mybatis-config.xml";
try {
sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(config));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取sqlsessionfactory
* @return
*/
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
7:其它的和上阶段的jsp和servlet差不多,但是要在jsp中的page标签加入isELIgnored="false"才能使用表达式
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
8:效果
9:其它
9-1:动态mysql标签
- <where>:拼接mysql中的where
- <if>:判断是否有此条件
- <foreach>:迭代操作,主要运用在in
- collection 迭代对象 item迭代的每个对象 open以什么开头 close以什么结尾 separator 分隔符
- <trim>
9-2:resultMap
可以将数据库查询出来的结果的列名和java实体类中的属性名不一样也能映射过去,如在执行sql时使用了as取了别名。
关联查询
在一对一关系中使用association标签 在一对多关系中使用collection标签 在多对多关系中使用嵌套collection标签
9-3:缓存机制
sqlsession执行insert,update,delete等操作commit提交后会清空缓存区域,缓存机制比较粗糙,所以在开发过程中不会使用