Spring3+mybatis+mysql整合详解(四)
2015-07-29 15:26
621 查看
http://www.tashan10.com/spring3mybatismysqlzheng-he-xiang-jie-si/
使用Mybatis,你需要配置一个SqlMapConfig.xml的文件,主要用于配置sql语句的映射。当然,你也可以使用注解的方式直接将sql语句写入到class中,但我个人觉得sql语句后期优化的时候可能会时常调整。如果硬编码到class中,修改不方便。
好了,下面我们来看SqlMapConfig的配置:
settings部分都是可选配置,如果 你不配置,mybatis都设有默认值。附件指南中对相关配置讲解的很详细。
typeAliases部分主要是给一些java bean 配置一个别名,你使用这个bean的时候直接使用别名即可。特别在mappers配置文件中使用很方便,后面我们会讲到。这有点类似JNDI。
mappers部分为mybatis的Sql配置。这里你可以直接将sql配置写在mappers配置里面,也可以像本例中一样,新建一个mappers映射文件,然后在mappers配置中指向映射文件。
下面我们以LoginMapper.xml为例讲解一下mappers配置:
首先,大家注意
mybatis的增、删、改、查对应相应的insert、delete、update、select标签。注意标签的id一定要与接口中的方法名相同。
我们重点看一下查询。
单表查询:
注意
多表查询:
数据查询涉及到数据封装及将数据从ResultSet中封装为我们需要的对象。在Mybatis中,可以使用 resultType进行简单的封装。例如我们指定 resultType为Users,Mybatis会自动将查询结果封装到Users的属性中。那么如果Users关联到其他实体bean呢?这种情况下,如果我们使用 resultType的方式封装,关联对象将不会被封装!所以我们就需要另外一个更强大的东东,那就是resultMap!resultMap说白了,就是自定义数据封装方式,就是告诉mybatis哪个字段对应实体的哪个属性。
为了能使resultMap配置能够重用,通常我们会单独建一个resultMap,然后在select中使用
insert、update、delete操作方式类似,下面我们看一下insert:
parameterType属性,我们指定为Users,然后使用
好了,Mybatis配置部分就是这样。总体上讲,我个人感觉,虽然Mybatis相对Hibernate没有那么自动化,很多东西需要我们手动配置,但这也显示出Mybatis的灵活性。对后期查询优化、缓存系统建设都是有好处的。
附
Mybatis_中文指南
使用Mybatis,你需要配置一个SqlMapConfig.xml的文件,主要用于配置sql语句的映射。当然,你也可以使用注解的方式直接将sql语句写入到class中,但我个人觉得sql语句后期优化的时候可能会时常调整。如果硬编码到class中,修改不方便。
好了,下面我们来看SqlMapConfig的配置:
<?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> <settings> <!-- 这个配置使全局的映射器启用或禁用缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如 Derby) --> <setting name="useGeneratedKeys" value="true" /> <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 --> <setting name="defaultExecutorType" value="REUSE" /> <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。 --> <setting name="defaultStatementTimeout" value="25000"/> </settings> <!-- 别名配置 --> <typeAliases> <typeAlias alias="Users" type="com.hl.usersmanager.model.Users" /> <typeAlias alias="Login" type="com.hl.usersmanager.model.Login" /> <typeAlias alias="LoginLog" type="com.hl.usersmanager.model.LoginLog" /> </typeAliases> <!-- 指定映射器路径 --> <mappers> <mapper resource="com/hl/usersmanager/dao/mappers/UserMapper.xml" /> <mapper resource="com/hl/usersmanager/dao/mappers/LoginMapper.xml" /> </mappers> </configuration>
settings部分都是可选配置,如果 你不配置,mybatis都设有默认值。附件指南中对相关配置讲解的很详细。
typeAliases部分主要是给一些java bean 配置一个别名,你使用这个bean的时候直接使用别名即可。特别在mappers配置文件中使用很方便,后面我们会讲到。这有点类似JNDI。
mappers部分为mybatis的Sql配置。这里你可以直接将sql配置写在mappers配置里面,也可以像本例中一样,新建一个mappers映射文件,然后在mappers配置中指向映射文件。
下面我们以LoginMapper.xml为例讲解一下mappers配置:
<?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必须是接口的路径,不然要运行的时候要报错 “is not known to the MapperRegistry”--> <mapper namespace="com.hl.usersmanager.dao.ILoginMapper"> <!-- 这里的id必须和接口中的方法名相同,不然运行的时候也要报错 --> <select id="findLogin" resultMap="findLoginResultMap"> <!-- 这里sql结尾不能加分号,否则报“ORA-00911”的错误 --> select * from login inner join users on login.user_id=users.id </select> <!-- 自定义映射关系 --> <resultMap type="Login" id="findLoginResultMap"> <!-- 标记结果作为ID 可以帮助提高整体效能 --> <id property="id" column="id"/> <!-- 注入到字段或JavaBean 属性的普通结果 --> <result property="loginName" column="loginName"/> <result property="passWord" column="passWord"/> <result property="loginTime" column="loginTime"/> <!-- 一个复杂的类型关联;许多结果将包成这种类型 (一对一映射) --> <association property="users" column="user_id" javaType="Users"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="phone" column="phone"/> </association> </resultMap> <select id="findLoginLogInfo" resultMap="findLoginLogInfoResultMap"> select *,loginLog.id as log_id,users.id as users_id from login inner join users on login.user_id=users.id left join loginLog on loginLog.login_id=login.id </select> <resultMap type="Login" id="findLoginLogInfoResultMap"> <id property="id" column="id"/> <result property="loginName" column="loginName"/> <result property="passWord" column="passWord"/> <result property="loginTime" column="loginTime"/> <association property="users" column="user_id" javaType="Users"> <id property="id" column="users_id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="phone" column="phone"/> </association> <!-- 复杂类型的集合 (一对多映射) --> <collection property="loginLogs" ofType="LoginLog"> <id property="id" column="log_id"/> <result property="loginTimeLog" column="loginTimeLog"/> </collection> </resultMap> </mapper>
首先,大家注意
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">我这里使用的是mybatis3的配置文件格式,如果使用较低版本的ibatis,标签会有一些差异!mapper标签有个namespace,指向dao层的接口(这里,顺便说一下,我们使用Spring3+mybatis+mysql整合,dao层只需要一个接口就行了,不再需要实现类。mybatis会自动创建代理类完成数据查询及封装,这个查询条件及封装依据就取决于我们这里的mappers映射文件。另外,如果特殊的操作,比如数据库备份之类,你可以手动创建实现类完成操作,附件里面有实例。)
mybatis的增、删、改、查对应相应的insert、delete、update、select标签。注意标签的id一定要与接口中的方法名相同。
我们重点看一下查询。
单表查询:
<select id="findAllUsers" resultType="Users" useCache="true"> select * from users </select>
注意
resultType="Users"中的Users即前面我们配置的别名,否则要引用
com.hl.usersmanager.model.Users。如果有参数,则需要指定参数类型:
<select id="findUserByName" resultType="Users" parameterType="java.lang.String"> select * from users where name=#{name} </select>
多表查询:
数据查询涉及到数据封装及将数据从ResultSet中封装为我们需要的对象。在Mybatis中,可以使用 resultType进行简单的封装。例如我们指定 resultType为Users,Mybatis会自动将查询结果封装到Users的属性中。那么如果Users关联到其他实体bean呢?这种情况下,如果我们使用 resultType的方式封装,关联对象将不会被封装!所以我们就需要另外一个更强大的东东,那就是resultMap!resultMap说白了,就是自定义数据封装方式,就是告诉mybatis哪个字段对应实体的哪个属性。
为了能使resultMap配置能够重用,通常我们会单独建一个resultMap,然后在select中使用
resultMap=" resultMapId"的方式引用。在resultMap中,如果是一一映射,便使用association(注意其javaType属性,就是告诉Mybatis这个关联要封装为什么java bean);如果是一对多则使用collection(需要在实体bean中指定关联对象为List集合,例如
private List<LoginLog> loginLogs;)
insert、update、delete操作方式类似,下面我们看一下insert:
<insert id="insertUser" parameterType="Users"> <!-- 这里sql结尾不能加分号,否则报“ORA-00911”的错误 --> insert into users(name,age,phone) values(#{name},#{age},#{phone}) </insert>
parameterType属性,我们指定为Users,然后使用
values(#{name},#{age},#{phone}的方式,Mybatis会自动将Users的name,age,phone属性值作为参数。
好了,Mybatis配置部分就是这样。总体上讲,我个人感觉,虽然Mybatis相对Hibernate没有那么自动化,很多东西需要我们手动配置,但这也显示出Mybatis的灵活性。对后期查询优化、缓存系统建设都是有好处的。
附
Mybatis_中文指南
相关文章推荐
- Spring3+mybatis+mysql整合详解(三)
- Spring3+mybatis+mysql整合详解(一)
- eclipse 快捷键
- Spring3+mybatis+mysql整合实例
- 001-maven构建struts项目
- SpringMVC +Hibernate JPA+Spring-data-jpa
- 【转】eclipse下使用git上传(下载)代码至(从)github
- java读取properties文件方法
- Eclipse 一直Building Workspace 的解决办法
- JAVA程序生成XML标准化的文件格式,缩进,美化。
- eclipse 不自动编译
- java开发中JDBC连接MySQL
- eclipse提示信息设置和提示信息操作
- 深入JDK
- 算法(第四版)学习笔记之java实现二叉查找树
- Java SE Java EE Java ME 的区别
- [Java][细节](int)n的执行结果,其中n为float或double类型
- 用JSP+Servlet+JavaBean模式实现简单的登录
- Map接口的使用注意事项
- 生成javadoc 报错软件包不存在