MyBatis入门
2016-03-18 15:15
363 查看
简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google
code,并且改名为MyBatis。MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlanOld Java Objects,普通的Java对象)映射成数据库中的记录。
Mybatis的功能架构分为三层(图片借用了百度百科):
1)
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2)
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3)
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
快速入门
Mybatis的整体流程图jar包
mybatis.jarmysql-connector-java.jar
conf.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="db.properties" /> <!-- 别名设置,主要用在实体类的mapper.xml的实体类的resultType 可以用typeAlias 然后type="对应类" alias="别名" 或者定义一个 package 扫描所有 --> <typeAliases> <!-- <typeAlias type="com.coracle.mybatis.model.User" alias="User"/> <typeAlias type="com.coracle.mybatis.model.Order" alias="Order"/> --> <!-- <package name="com.coracle.mybatis.model"/> --> <!-- <typeAlias type="com.corcle.mybatistest.entity.User" alias="User" /> --> <package name="com.corcle.mybatistest.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- 注册 mapper.xml 如果是接口注解就用 class 或者 用package扫描所有接口 如果是xml 就要用 resuorce 一个 一个的注册 --> <mappers> <mapper resource="com/corcle/mybatistest/entity/userMapper.xml" /> <!-- <mapper resource="com/coracle/mybatis/mapper/userMapper.xml"/> <mapper resource="com/coracle/mybatis/mapper/userMapperCrud.xml"/> --> <!-- <mapper class="com.coracle.mybatis.intf.UserMapperCrud"/> --> <!-- <package name="com.coracle.mybatis.intf"/> --> <mapper class="com.corcle.mybatistest.service.UserService"/> <mapper resource="com/corcle/mybatistest/entity/classerInfoMapper.xml"/> </mappers> </configuration>
entity
普通的javabean就行xxxmapper.xml文件
classLoad加载conf.xml
private SqlSession session = null; @Before public void before() { String xml = "conf.xml"; InputStream in = ClassTest.class.getClassLoader().getResourceAsStream( xml); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in); session = sf.openSession(); } @After public void close() { session.close(); }
SqlSessionFactoryBuilder.build(inputStream)
SqlSession
记得 session 更新插入的 事务提交 session.commit();获取sqlid
命名空间加 语句idString statement = "com.corcle.mybatistest.entity.classerInfoMapper.getClass"; List<ClassInfo> list =
执行sql
session.selectList(statement);
别名typeAliases-》 typeAlias
别名主要是用在 mapper.xml中。 可以用package扫描所有,或者 一个 一个的设置<typeAlias type="com.corcle.mybatistest.entity.User" alias="User" /> <package name="com.corcle.mybatistest.entity"/>
package 设置的默认的别名 是类名
<properties resource="db.properties" />
resultMap 视图模型–查询字段和pojo不对应
一对一(嵌套结果、嵌套查询-》循环查询)
/**
* 嵌套结果 1-1查询
*/
@Test
public void oneToOneSelectTest() {
String statement = "com.corcle.mybatistest.entity.classerInfoMapper.getClass"; List<ClassInfo> list =session.selectList(statement);
System.out.println(JSON.toJSON(list));
}
运行结果
2016-03-18 14:49:09,836 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getClass] - ==> Preparing: select * from classinfo c inner join teacher t where c.t_id=t.t_id;
2016-03-18 14:49:09,886 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getClass] - ==> Parameters:
2016-03-18 14:49:09,909 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getClass] - <== Total: 2
[{"teacher":{"tName":"lyh","tId":1},"cId":1,"cName":"一班"},{"teacher":{"tName":"djd","tId":2},"cId":2,"cName":"二班"}]
/**
* 嵌套查询 1-1查询
*/
@Test
public void oneToOneSelectTest2() {
String statement = "com.corcle.mybatistest.entity.classerInfoMapper.getClassinfo";
List<ClassInfo> list = session.selectList(statement);
System.out.println(JSON.toJSON(list));
}
运行结果
2016-03-18 14:50:25,992 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getClassinfo] - ==> Preparing: select * from classinfo;
2016-03-18 14:50:26,039 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getClassinfo] - ==> Parameters:
2016-03-18 14:50:26,060 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getTeacher] - ====> Preparing: select t_id tId,t_name tName from teacher where t_id=?
2016-03-18 14:50:26,060 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getTeacher] - ====> Parameters: 1(Integer)
2016-03-18 14:50:26,061 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getTeacher] - <==== Total: 1
2016-03-18 14:50:26,061 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getTeacher] - ====> Preparing: select t_id tId,t_name tName from teacher where t_id=?
2016-03-18 14:50:26,061 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getTeacher] - ====> Parameters: 2(Integer)
2016-03-18 14:50:26,062 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getTeacher] - <==== Total: 1
2016-03-18 14:50:26,062 [main] DEBUG [com.corcle.mybatistest.entity.classerInfoMapper.getClassinfo] - <== Total: 2
[{"teacher":{"tName":"lyh","tId":1},"cId":1,"cName":"一班"},{"teacher":{"tName":"djd","tId":2},"cId":2,"cName":"二班"}]
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.corcle.mybatistest.entity.classerInfoMapper">
<resultMap type="ClassInfo" id="classinfo_map">
<id column="c_id" property="cId"></id>
<result column="c_name" property="cName" />
<association property="teacher" javaType="Teacher">
<id column="t_id" property="tId"></id>
<result column="t_name" property="tName" />
</association>
</resultMap>
<resultMap type="ClassInfo" id="classinfo_map_sel">
<id column="c_id" property="cId"></id>
<result column="c_name" property="cName" />
<association property="teacher" column="t_id" select="getTeacher">
<id column="t_id" property="tId"></id>
<result column="t_name" property="tName" />
</association>
</resultMap>
<select id="getTeacher" parameterType="int" resultType="Teacher">
select
t_id tId,t_name tName from teacher where t_id=#{id}
</select>
<select id="getClass" resultMap="classinfo_map">
select * from classinfo c inner
join teacher t where c.t_id=t.t_id;
</select>
<select id="getClassinfo" resultMap="classinfo_map_sel">
select * from classinfo;
</select>
</mapper>
一对多 collection (嵌套结果-嵌套查询)
嵌套查询
<select id="getclassallinfo" resultMap="getclassallinfomap"> select * from student st inner join classinfo c on st.si_ci=c.c_id inner join teacher t on c.t_id =t.t_id </select> <resultMap type="ClassInfo" id="getclassallinfomap" extends="classinfo_map"> <collection property="students" ofType="Student"> <id column="st_id" property="stId"></id> <result column="st_name" property="stName" /> <result column="si_ci" property="stCi" /> </collection> </resultMap> <resultMap type="ClassInfo" id="classinfo_map"> <id column="c_id" property="cId"></id> <result column="c_name" property="cName" /> <association property="teacher" javaType="Teacher"> <id column="t_id" property="tId"></id> <result column="t_name" property="tName" /> </association> </resultMap>
注意 collection和 association 不同的是
collection 用 ofType 表示多的类型
association用 javaType来表示 1
/** * 嵌套结果 1-n查询 */ @Test public void oneToManySelectTest() { String statement = "com.corcle.mybatistest.entity.classerInfoMapper.getclassallinfo"; List<ClassInfo> list = session.selectList(statement); System.out.println(JSON.toJSON(list)); }
extends
resultMap 可以被继承!分页(插件)
动态传入数据表参数
select * from ${tablename}更少的创建实体类
可以省一些 vo(视图模型),但是就不规范了!具体做法!–》
resultType 用 map
动态sql
批量插入 list
存储过程
事物
缓存
相关文章推荐
- OpenCV Harris 角点检测子
- HBase权威指南环境配置
- 缓存
- Word embedding
- CSS3:为内容设置样式
- 传图片
- POJ1007.DNA Sorting
- MyEclipse 统计代码行数的两种方法
- ListView缓存机制
- SilkTest入门快打7-异常处理
- 网站服务器选择windows主机好还是linux主机好
- 87 - Scramble String(recursive)
- #define宏和const常量学习
- android sqlite 触发器
- Ckeditor配置
- 严苛模式 strictmode
- PHP写时复制, 变量复制和对象复制不同!!!
- 博客园文件下载脚本
- 多态--重载--重写
- SilkTest入门快打6-使用类和对象