Mybatis
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"> <!-- 通过这个配置标签,完成mybatis与数据库的连接 --> <configuration> <!-- 引入jdbc.properties文件 --> <properties resource="jdbc.properties"></properties> <!-- 配置mybatis的log实现为LOG4J --> <settings> <setting name="logImpl" value="LOG4J"/> <!-- 设置全局缓存 --> <setting name="cacheEnabled" value="true"/> </settings> <!-- 引入与数据库表对应的javaBean的包 注意:别名为类名首字母大写 :User --> <typeAliases> <package name="com.pp.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <!-- 配置事务管理 采用jdbc --> <transactionManager type="JDBC"></transactionManager> <!-- POOLED是mybatis的数据源,jndi是基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 引入mapper.xml文件 --> <mappers> <mapper resource="com/pp/dao/UserMapper.xml"/> <mapper resource="com/pp/dao/RoleMapper.xml"/> </mappers> </configuration>
连接数据库的配置文件: jdbc.properties(这个文件要引入mybatis配置文件中)
driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/testdb username=root password=123
Mapper配置文件: UserMapper.xml(专门存储sql语句的配置文件)(这个文件要引入mybatis配置文件中)
<?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.pp.dao.UserMapper"> <!--1. --> <!-- 因为返回一条数据 类型用int接收 --> <select id="count" resultType="int"> select count(1) from user </select> <!-- 2. --> <!-- Bean中的Object属性用association标签表示 association标签中的result为role对象的属性 --> <!-- javaType为Role是因为别名 --> <resultMap type="User" id="userMap"> <result property="id" column="id"/> <result property="userName" column="userName"/> <result property="userCode" column="userCode"/> <result property="userPassword" column="userPassword"/> <association property="role" javaType="Role"> <result property="roleName" column="roleName"/> </association> </resultMap> --> <!--3. --> <!-- type为User 这个返回结果是User对象 property是属性 addressList是集合 ofType是集合中的对象,即泛型 --> <!-- 对象属性为集合 用collection标签表示 标签里面的是集合中对象(泛型对象)的属性 --> <resultMap type="User" id="getAddressByUserMap"> <result property="id" column="userId"/> <collection property="addressList" ofType="Address"> <id property="id" column="a_id"/> <result property="postCode" column="postCode"/> <result property="addressContent" column="addressContent"/> </collection> </resultMap> <!-- resultMap对应标签,标签 --> <!-- parameterType为调用方法时的参数类型 --> <select id="getAddressByUser" resultMap="getAddressByUserMap" parameterType="User"> select *,a.id as a_id from user u,address a where u.id=a.userId and u.id=#{id} </select> </mapper>
test类(junit) 增删改需要sqlSession.commit();提交事务
private Logger logger=Logger.getLogger(this.getClass()); @Test public void conTest(){ String resources="mybatis-config.xml"; int count = 0; SqlSession sqlSession=null; InputStream is=null; try { //1.读取配置文件输入流 is=Resources.getResourceAsStream(resources); //2.创建sqlSessionFactory对象,完成对配置文件的读取 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); //3.创建sqlSessin对象 sqlSession=sqlSessionFactory.openSession(); //4.调用mapper.xml文件进行数据操作 count=sqlSession.selectOne("com.pp.dao.UserMapper.count"); //测试输出 logger.debug(count); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ sqlSession.close(); try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Assert.assertEquals(5, count); }
mybatis特性之一
动态sql
涉及标签: if choose when otherwise trim where set foreach 1. <select id="getRoleList" resultType="Role" parameterType="Role"> select * from role <where> <choose> <when test="roleCode!=null"> and roleCode like CONCAT('%',#{roleCode},'%') </when> <when test="roleName!=null"> and roleName like CONCAT('%',#{roleName},'%') </when> <otherwise></otherwise> </choose> </where> </select> //where 标签相同sql语句where 智能省略第一个判断的and,就不用加 1=1 这样的语句 //choose 标签相同switch //when 标签相同case 当满足一个条件时,追加sql语句后,跳出choose //otherwise 标签相同switch中的default 当所有条件都不满足时,执行此标签内的语句 2. <where> <if test="roleCode!=null"> and roleCode like CONCAT('%',#{roleCode},'%') </if> <if test="roleName!=null"> and roleName like CONCAT('%',#{roleName},'%') </if> </where> //if标签 判断如满足条件则追加语句 3. <trim prefix="where" prefixOverrides="and|or"> <when test="roleCode!=null"> and roleCode like CONCAT('%',#{roleCode},'%') </when> <when test="roleName!=null"> and roleName like CONCAT('%',(#roleName),'%') </when> </trim> //trim标签 追加where关键字 间隔符是and 或者 or trim也会在满足第一个条件时,舍去其语句中and 4. <update id="updateRole" parameterType="Role"> update role <set> <if test="roleCode!=null and roleCode!=''"> roleCode=#{roleCode}, </if> <if test="roleName!=null"> roleName=#{roleName} </if> </set> where id=#{id} </update> //update 也有set标签 添加set关键字 后面判断条件追加语句 5. <update id="updateRole" parameterType="Role"> update role <trim prefix="set" prefixOverrides=","> <if test="roleCode!=null and roleCode!=''"> roleCode=#{roleCode}, </if> <if test="roleName!=null"> roleName=#{roleName} </if> </trim> where id=#{id} </update> //trim标签 前缀为set 意为追加set关键字 prefixOverrides值, 间隔符号为, 6. <resultMap type="User" id="userMapBydepId"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> </resultMap> <!-- 传入的参数如果是数组 key:array 集合 key:list--> <select id="getUserBydepIds" resultMap="userMapBydepId" > select * from user where depId in <foreach collection="array" item="depIds" open="(" separator="," close=")"> #{depIds} </foreach> </select> //select * from user where depId in(1,2) 查询表user字段depId为1和2的数据 //数组collection为array //open,separator,close 定义in后面的格式 :(?,?) //不需要写parameterType <select id="getUserBydepIds" resultMap="userMapBydepId" > select * from user where depId in <foreach collection="list" item="depIds" open="(" separator="," close=")"> #{depIds} </foreach> </select> //集合collection为list
关于缓存
一级缓存 session作用域
二级缓存 全局作用域
全局缓存
mybatis配置文件:
<settings> <setting name="cacheEnabled" value="true"/> </settings>
开一级缓存的话 一定要开全局缓存 不生效
在mapper.xml中设置缓存 默认不开启
<cache eviction="FIFO" flushInterVal="60000" size="512" readOnly="true"/>