mybatis
mybatis是什么?
mybatis是一款基于java的持久层框架,支持定制化sql,存储过程以及高级映射。可以使用简单的XML或注解配置来映射原生信息
用在哪一层?
java持久层
使用mybatis,你的项目中,与mybatis相关的有那几部分?
数据库和spring集成mybatis
Mybatis怎么获取一个插入数据的主键?
第一种方式
<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
insert into user(userName,password,comment)
values(#{userName},#{password},#{comment})
</insert>
useGeneratedKeys=“true” 表示给主键设置自增长
keyProperty=“userId” 表示将自增长后的Id赋值给实体类中的userId字段
第二种方式
<insert id="insertProduct" parameterType="domain.model.ProductBean" >
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
</insert>
order=“AFTER” 表示先执行插入语句,之后再执行查询语句.可被设置为 BEFORE 或 AFTER。如果设置为BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。
如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
keyProperty=“userId” 表示将自增长后的Id赋值给实体类中的userId字段。SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.实体类中uerId 要有getter() and setter(); 方法
Mybatis的mapper映射文件:注意事项有哪些?
mapper映射文件中所有的sql语句id需要对应接口类中的方法名
设置参数时若配置文件中没有定义别名,需要引入参数的全限定名。其他数据类型需要查询mybatis与java的对应数据类型表
Mybatis中实现多表的关联查询:怎么做?????
嵌套查询
嵌套查询就是通过另一个sql映射语句获取到结果封装到ResultMap中
//property:关联集合
//ofType:"集合中元素类型"
//select:通过这个关联sql查询对应数据集合
//column:关联对象表中的外键,对应当前对象主键的id
<collenction property="users" ofType="User" column="id" select="全限定名.sql映射语句Id"></collenction>
嵌套结果
嵌套结果就是发一条关联sql解决问题,映射文件Mapper结果的手动封装ResultMap
使用嵌套结果映射来处理重复的联合结果的子集。这种方式,所有属性都要自己来!
//property:关联对象所在类中的属性
//javaType:关联对象类型
<association property="department" javaType="Department">
//column:结果集中列名
//property:关联对象属性
<id column="did" property="id"/>
<result column="dname" property="name"/>
</association>
SSM(SpringMvc+Spring+Mybatis)的搭建的步骤:
1.项目中导入spring的jar包,创建一个applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<import resource="classpath*:application-mapper.xml"/>
<!--扫描的包-->
<context:component-scan base-package="cn.itsource.crm.service"/>
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--注解是事务:crm-service层非base方法,可以使用-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- aop应用事务管理:注意针对basic-core上的BaseService层事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="select*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="search*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--
所有service事务
<aop:pointcut expression="execution(* cn.itsource.*.service..*.*(..))"-->
<!--id="servicePointcut" />-->
<!--只针对basic事务-->
<aop:pointcut expression="execution(* cn.itsource.basic.service..*.*(..))"
id="servicePointcut" />
<aop:advisor advice-ref="txAdvice" po