mybatis编程学习
相关配置信息
select 语句传递参数的方式
<select id="queryUserById" resultType="User">
select * from user where id=#{arg0}
</select>
以下所写的内容实在#{}里写的值,如上
-
arg0 、arg1从0开始代表以一个参数
-
param1,param2从1开始代表第一个参数
-
在定义Dao接口方法的时候,将参数带上注解
方法名(@Param(" 对应的值") 参数名);‘
-
通过Map设定好值传过去,前提是在map里设定好key和value的值,传过来直接抽取就可以了。
-
在Dao接口的方法中直接传入实体类也可以。语句中直接调用实例属性就可以
可用concat来做模糊查询,concat是字符串拼接
增删改
在增删改的过程中需要提交事物,提交的方法为
sqlSession.commit();
主键回填
可在insert标签中添加,他会将参数中的属性名赋值,针对的是自增的主键
<selectKey order="AFTER" resultType="int" keyProperty="id">
select last_insert_id()
<!-- select replace(UUID(),"-","") 这里面after变成before
</selectKey>
Mybatis工具类
package com.lang.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
private static final ThreadLocal<SqlSession> t1=new ThreadLocal<SqlSession>();
static {/*加载配置信息*/
try {
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession openSession(){
SqlSession sqlSession= t1.get();
if(sqlSession==null){
sqlSession=sqlSessionFactory.openSession();
t1.set(sqlSession);
}
return sqlSession;
}
public static void commit(){
SqlSession sqlSession =openSession();
sqlSession.commit();
closeSession();
}
public static void rollback(){
SqlSession sqlSession=openSession();
sqlSession.rollback();
closeSession();
}
public static void closeSession(){
SqlSession sqlSession=openSession();
sqlSession.close();
}
public static <T> T getMapper(Class<T> mapper){
SqlSession sqlSession=openSession();
return sqlSession.getMapper(mapper);
}
}
resultMap进行映射
<?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写要配置的Dao接口-->
<mapper namespace="com.lang.dao.UserDao">
<resultMap id="user_resultMap" type="User">
<!--定义更复杂的映射规则-->
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="gender" property="gender"></result>
</resultMap>
<!--描述方法-->
<select id="queryUserById" resultMap="user_resultMap"> <!-- resultMap-->
select * from user where id=#{arg0}
</select>
</mapper>
映射对一
利用标签完成对应的一对多关系
<association property="entity的实例属性名" javaType="entity的实例属性的类型">
<id column="列名" property="对应关系的属性名"></id>
<result column="列名" property="对应关系的属性名" ></result>
</association>
映射对多
<collection>标签完成
<collection property="entity的实例属性名" ofType="entity的实例属性的泛型"><!--ofType用来对应泛型的类型-->
<id column="列名" property="对应关系的属性名"></id>
<result column="列名" property="对应关系的属性名" ></result>
</collection>
多对多
一般数据库中要有额外的第三张表,分别是两个关系的主键
mybatis标签
这里面写重复的语句 抽取重复的sql片段
<sql id="idname">
select * from user
</sql>
<!--描述方法-->
<select id="queryUserById" resultType="User">
<include refid="idname"/> where id=#{arg0}
</select>
标签
<select id="queryUserById" resultType="User">
<include refid="idname"/> where
<if test="id!=null" >id=#{arg0}</if>
<if test="username!=null"> username=#{username}</if>
</select>
标签
这个标签可以自动消除紧跟着的字段是or或者and,自动补充where关键字
标签
这个标签会自动把要修改的属性之后存在的逗号删除例如
update user set username=#{ username} , where id=#{id }
多出了一个逗号,所以用set标签可以消除多余的逗号
标签
/*prefixOverrides="or|and 以or或and开头就替换掉 suffixOverrides=","替换末尾的逗号*/
<trim prefix="要补充的前缀标签" suffix="要补充的后缀标签" prefixOverrides="or|and" suffixOverrides=","></trim>
forEach标签
<delete id="deleteUser" parameterType="java.util.List">
delete from user where id in
<foreach collection="参数名" open ="(" close=")" item="id" separator=",">/*open代表要生成语句的开头,close就是结尾, item就是一个每次遍历后获得值存入item中 ,separator代表多次遍历的分割 *//* 最后还有index 它是从0开始,一次递增*/
#{id}
</foreach>
</delete>
缓存
首次访问时,查询数据库,将数据存储到缓存中,再次访问时,直接访问缓存,减少IO、硬盘读写次数,提高效率
一级缓存
SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在以及缓存中
二级缓存
SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中。
开启二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
并在相应的mapper文件中加入 标签,否则不会开启二级缓存,二级缓存默认开启,但并不是所有的查询结果都会进入二级缓存的,如果发生增删改会将缓存消除,消除的时同一个Mapper的缓存
Druid
package com.lang.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;
public class MyDruidDataSourceFactory extends PooledDataSourceFactory {
public MyDruidDataSourceFactory(){
this.dataSource=new DruidDataSource();
}
}
运用Druid的连接池配置 mybatis-config.xml
<?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>
<!--导入外部的参数-->
<properties resource="jdbc.properties">
</properties>
<!--mybaits-config.xml中开启全局缓存(默认开启)-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!--别名-->
<typeAliases>
<!-- <typeAlias type="com.lang.entity.User" alias="user"></typeAlias>-->
<package name="com.lang.entity"/>
</typeAliases>
<!--核心配置信息-->
<environments default="mybatis_config">
<!--数据库相关配置-->
<environment id="mybatis_config">
<!--事物控制类型-->
<transactionManager type="jdbc"></transactionManager>
<!--数据库连接参数-->
<dataSource type="com.lang.datasource.MyDruidDataSourceFactory">
<property name="driverClass" value="${jdbc.driver}"/>
<!--& 转译成&-->
<property name="jdbcUrl" value="${jdbc.url}"/><!--通过${}来取配置文件的值-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lang/dao/UserDaoMapper.xml"/>
</mappers>
</configuration>
分页PageHelper
public void testPage(){
UserDao userDao= MybatisUtil.getMapper(UserDao.class);
PageHelper.startPage(2,2);/*查询第一页每一页两条数据 ,对其之后的第一个数据,进行分页追加*/
List<User> users= userDao.queryUserAll();
for (User user:users){
System.out.println(user);
}
}
PageHelper使用
page实体类
package com.lang.entity;
public class Page {
private Integer pageNum;
private Integer pageSize;
@Override
public String toString() {
return "Page{" +
"pageNum=" + pageNum +
", pageSize=" + pageSize +
'}';
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
UserService
public class UserServiceImpl implements UserService {
@Override
public PageInfo<User> quertUser(Page page) {
UserDao userDao= MybatisUtil.getMapper(UserDao.class);
PageHelper.startPage(1,2);
List<User> userList=userDao.queryUserAll();
PageInfo <User> pageInfo=new PageInfo<>(userList);
return pageInfo;
}
}
分页前端代码模板
<div style="text-align: center">
<a href="${pageContext.request.contextPath}/users?pageNum=1&pageSize=2">首页</a>
<c:if test="${requestScope.pageData.hasPreviousPage}">
<a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.prePage}&pageSize=2">上一页</a>
</c:if>
<c:forEach begin="1" end="${requestScope.pageData.pages}" var="i">
<a href="${pageContext.request.contextPath}/users?pageNum=${i}&pageSize=2">
<c:if test="${requestScope.pageData.pageNum==i}">
<span style="color:red">${i}</span>
</c:if>
<c:if test="${requestScope.pageData.pageNum!=i}">
<span>${i}</span>
</c:if>
</a>
</c:forEach>
<c:if test="${requestScope.pageData.hasNextPage}">
<a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.nextPage}&pageSize=2">下一页</a>
</c:if>
<a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.pages}&pageSize=2">末页</a>
</div>
延迟加载
<?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>
<!--导入外部的参数-->
<properties resource="jdbc.properties">
</properties>
<!--mybaits-config.xml中开启全局缓存(默认开启)-->
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnable" value="true"/><!--延迟加载-->
</settings>
<!--别名-->
<typeAliases>
<!-- <typeAlias type="com.lang.entity.User" alias="user"></typeAlias>-->
<package name="com.lang.entity"/>
</typeAliases>
<!--pageHelper引入-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
<!--核心配置信息-->
<environments default="mybatis_config">
<!--数据库相关配置-->
<environment id="mybatis_config">
<!--事物控制类型-->
<transactionManager type="jdbc"></transactionManager>
<!--数据库连接参数-->
<dataSource type="com.lang.datasource.MyDruidDataSourceFactory">
<property name="driverClass" value="${jdbc.driver}"/>
<!--& 转译成&-->
<property name="jdbcUrl" value="${jdbc.url}"/><!--通过${}来取配置文件的值-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lang/dao/UserDaoMapper.xml"/>
</mappers>
</configuration>