Mybatis框架运行机制(增删改查,一对一,一对多,日志系统,单元测试,版本控制,缓存,动态Sql)
2016-07-24 10:30
801 查看
对JDBC是一个轻量级的封装。一个持久层一个框架
支持普通SQL查询,存储过程和高级映射的优秀持久层框架
可以使用简单的XML或注解用于配置和原始映射,将接口和java的POJO(plai old java objects,普通的java对象)映射成数据库中的记录。
1.步骤:
1>.导包 mybatis.jar + mysql-connector-java.jar
2>.在src目录下创建conf.xml文件(mybatis-conf.xml)
配置数据库连接信息
注册mapper.xml文件(将实体类的映射文件写好之后,加入)
3>.定义数据表对应的实体类
定义操作数据表的SQL映射文件xxxMapper.xm;
1>.写dtd头文件
2>.namesapce(映射文件的路径)
3>.语句中的id为唯一
4>.parameterType参数类型
5>.resultType 返回的结果集类型
4>.测试
1>.创建sqlSession工厂:使用类加载器加载mybatis配置文件→ 构建sqlSession的工厂
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build("mybatis-conf.xml")
2>.使用session.getMapper(Dao层.class)
3>.测试
2.常识
mybatis-config.xml配置文件中注册文件
1>.resource用于注册xxxMapper.xml文件
2>.class 注册xxx<apper映射接口(IBookDao)
创建SqlSession工厂时(基于注解,基于xml)
1>xxxMapper(IBookDao) mapper(BookDao)=SqlSession.getMapper(xxxMapper.class)
对数据表CRUD一共三种方法
1>.配置文件+数据表实例+xxxMapper.xml+SqlSessionFactory+xxxDao
测试时候通过session.getMapper(xxxDao.class)
2>.配置文件+数据表实例+SqlsessionFactory+xxxDao(里面有注解)→注解
测试时候通过session.getMapper(xxxDao.class)获得
3>.配置文件+数据表实例+jdbc.properties(需要在配置文件中引用,用${}获得参数)+xxxMapper.xml+SqlSessionFactory+xxxDao(接口方法)
测试时候通过session.getMapper(xxxDao.class)获得
3.一对一查询,一对多查询
因为获得不到主键表的数据
1>.把语句整合在一起,使用两个构造resultMap
2>.把语句分开写,使用外键关联查询
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.hellojava.dao.IPersonDao"> <!-- 第一种方法 --> <resultMap type="Person" id="personResult"> <id column="perId" property="perId"/> <result column="perName" property="perName"/> <association property="card" javaType="Card"> <id column="cardId" property="cardId"/> <result column="cardNumber" property="cardNumber"/> </association> </resultMap> <select id="loadPersonById" parameterType="int" resultMap="personResult"> select P.perId,P.perName,C.cardId,C.cardNumber from person P,card C where P.perId=C.cardId and P.perId=#{perId} </select> <!-- 第二种方法 --> <resultMap type="Person" id="ResultPerson"> <id column="perId" property="perId"/> <result column="perName" property="perName"/> <association property="card" javaType="Card" select="loadCard" column="perId"></association> </resultMap> <select id="loadPerson" parameterType="int" resultMap="ResultPerson"> select * from person where PerId=#{perId} </select> <select id="loadCard" parameterType="int" resultType="Card"> select * from card where cardId=#{cardId} </select> </mapper>4.边缘问题
1>.日志系统
查看bug error fatal(重大错误) info trace
可以在log4j.properties更改配置,然后查找对应的日志
2>.测试(单元测试)
继承TestCase,使用断言进行测试(绿,红进度条)
3>.版本控制 SVN(服务器,客户端 eclipse插件)
开发时候,小组各自上传自己文件
5.缓存
一级缓存基于session,清楚缓存:
1>.clear() 2>.close() 3>.update(当数据发生更改也会清楚,其实是更新对应的缓存)
二级缓存基于Mapper文件,cache配置:
1>.eviction剔除的算法(先进先出)FIFO
2>.flushInterval 刷新的频率 1000
3>.readonly 是否只读 false
4>.size 缓存默认大小 10
5>.type 缓存中存储的数据类型
测试二级缓存,使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发生Sql语句
而是从缓存中取出数据。
6.动态Sql
1>.添加集合List 使用foreach遍历 separator分隔符
2>.更新数据 使用if判断 拼接语句
3>.模糊查询 在查询条件添加%(mapper文件里面只能bind一个模糊条件,其他会得不到参数)
<mapper namespace="com.hellojava.dao.IBookDao"> <insert id="saves" parameterType="java.util.List"> insert into book(bookName,bookAuthor,bookPrice,bookInfo) values <foreach collection="list" item="b" separator=","> (#{b.bookName},#{b.bookAuthor},#{b.bookPrice},#{b.bookInfo}) </foreach> </insert> <update id="update" parameterType="Book"> update book <trim prefix="set" suffixOverrides=","> <if test="bookName!=null"> bookName=#{bookName}, </if> <if test="bookAuthor!=null"> bookAuthor=#{bookAuthor}, </if> <if test="bookPrice>0"> bookPrice=#{bookPrice}, </if> <if test="bookInfo!=null"> bookInfo=#{bookInfo}, </if> </trim> <where> bookId=#{bookId} </where> </update> <select id="load" parameterType="Book" resultType="Book"> select * from book <bind name="bname" value="'%' + _parameter.getBookName() + '%'"/> <where> <trim suffixOverrides="AND|OR"> <if test="bookId>0"> bookId=#{bookId} and </if> <if test="bookName!=null"> bookName like #{bname} and </if> <if test="bookAuthor!=null"> bookAuthor like #{bookAuthor} and </if> </trim> </where> </select> </mapper>7.mybais-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> <typeAliases> <package name="com.hellojava.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <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="com/hellojava/mapper/BookMapper.xml"/> </mappers> </configuration>
相关文章推荐
- nfs+mariadb
- Oracle 11g 32bit安装记录
- win7系统64位Navicat for Oracle Cannot load OCI DLL 87,126,193
- MySQL 数据类型
- MySQL 语句分类
- mac上安装mongoDb以及简单使用
- MySQL的deocode,与not in的关联查询实现
- MongoDB32位linux版本在安装中遇到的问题
- mysql使用(3)
- MongoDB executeCommand返回结构 CommandResult解析
- MySQL Windows快速安装与配置
- SQL server无法连接到LENOVO-PC,已成功与服务器建立连接,但是在登录过程中发生错误
- mysql使用(2)
- redis 源码阅读 数值转字符 longlong2str
- Mac下Mysql数据库编码问题
- ofbiz连接mysql并创建独立数据库
- mysql字符串拼接,存储过程
- MySql使用(1)
- Oracle用户的创建及授权
- mysql 显示所有的数据库