同步操作将从 Java精选/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
方式一:对于支持自动生成主键的数据库,如Mysql、sqlServer,可以通过Mybatis元素useGeneratedKeys返回当前插入数据主键值到输入类中。
<insert id="insertJingXuan" useGeneratedKeys="true" keyProperty="id"
parameterType="com.jx.domain.IdentityUser">
insert into identity_user(name)
values(#{name,jdbcType=VARCHAR})
</insert>
方式二:对于不支持自动生成主键的数据库。Oracle、DB2等,可以用元素selectKey回当前插入数据主键值到输入类中。
<insert id="insertJingXuan" useGeneratedKeys="true" keyProperty="id"
parameterType="com.jx.domain.IdentityUser">
<selectKey keyProperty="id" resultType="String" order="BEFORE">
SELECT REPLACE(UUID(),'-','')
</selectKey>
insert into identity_user(name)
values(#{name,jdbcType=VARCHAR})
</insert>
selectKey元素说明
keyProperty:selectKey语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn:匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType:结果的类型。MyBatis通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的Object或一个Map。
order:这可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会首先选择主键,设置keyProperty然后执行插入语句。如果设置为AFTER,那么先执行插入语句,然后是selectKey元素-这和像Oracle的数据库相似,在插入语句内部可能有嵌入索引调用。
statementType:MyBatis支持STATEMENT,PREPARED和CALLABLE语句的映射类型,分别代表PreparedStatement和CallableStatement类型。
Mybatis中不同的Xml映射文件,如果配置了namespace,那么id可以重复;反之ID不能重复。
这是因为namespace+id是作为Map<String, MapperStatement>的key来使用,如果没有namespace空间,那么ID重复会导致数据互相覆盖。
通过设置namespace空间,ID相同但是namespace不同,namespace+id自然也就不同。目前新版本的namespace是必须的。
mybatis仅可以编写针对parameterhandler、resultsethandler、statementhandler、executor这4种接口的插件。
mybatis使用jdk的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是invocationhandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
编写插件:实现mybatis的interceptor接口并重写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,并在配置文件中配置编写的插件。
第一种: 接口实现类继承SqlSessionDaoSupport:使用此种方法需要编写mapper接口,mapper接口实现类、mapper.xml文件。
1)在sqlMapConfig.xml中配置mapper.xml的位置:
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
2)定义mapper接口:
3)实现类集成SqlSessionDaoSupport:mapper方法中可以this.getSqlSession()进行数据增删改查。
4)spring 配置:
<bean id="对象ID" class="mapper 接口的实现">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
第二种: 使用org.mybatis.spring.mapper.MapperFactoryBean:
1)在sqlMapConfig.xml中配置mapper.xml的位置,如果mapper.xml和mappre接口的名称相同且在同一个目录,这里可以不用配置
<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
2)定义mapper接口:
① mapper.xml中的namespace为mapper接口的地址
② mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致
③ Spring中定义:
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper 接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
第三种: 使用mapper扫描器:
1)mapper.xml文件编写:
mapper.xml中的namespace为mapper接口的地址;
mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致;
如果将mapper.xml和mapper接口的名称保持一致则不用在sqlMapConfig.xml中进行配置。
2)定义mapper接口:
注意mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录
3)配置mapper扫描器:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper接口包地址" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
4)使用扫描器后从spring容器中获取mapper的实现对象。
1)“#”符号将传入的数据当成一个字符串并将传入的数据加上双引号。
如:order by #{userId},如果传入的值是1,那么解析成sql时的值为order by "1",如果传入的值是userId,则解析成的sql为order by "userId"。
2)“$”符号将传入的数据直接显示生成在sql语句中。
如:order by ${userId},如果传入的值是1,那么解析成sql时的值为order by 1, 如果传入的值是userId,则解析成的sql为order by userId。
3)“#”符号能够很大程度防止sql注入,而“$”符号无法防止sql注入。
4)“$”符号方式一般用于传入数据库对象,例如传入表名。
5)一般能用“#”符号的就别用“$”符号
6)MyBatis排序时使用order by动态参数时需要注意使用“$”符号而不是“#”符号。
MyBatis实现一对多关系有联合查询和嵌套查询两种方式。
联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;
嵌套查询是先查一个表。根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim、where、set、foreach、if、choose、when、otherwise、bind。
Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
MyBatis 实现批量插入数据的方式有几种?
1、MyBatis foreach标签
foreach主要用在构建in条件,在SQL语句中进行迭代一个集合。
foreach元素的属性主要有item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名 index指定一个名字,用于表示在迭代过程中,每次迭代到的位置 open表示该语句以什么开始 separator表示在每次进行迭代之间以什么符号作为分隔符 close表示以什么结束
collection必须指定该属性,在不同情况下,值是不同的,主要体现3种情况:
若传入单参数且参数类型是List时,collection属性值为list
若传入单参数且参数类型是array数组时,collection的属性值为array
若传入参数是多个时,需要封装成Map
具体用法如下:
<insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">
insert into t_userinfo
(name, age, sex) values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name},#{item.age},#{item.sex})
</foreach>
</insert>
2、MyBatis ExecutorType.BATCH
Mybatis内置ExecutorType,默认是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql。
batch模式会重复使用已经预处理的语句,并批量执行所有更新语句。但batch模式Insert操作时,在事务没有提交前,是无法获取到自增的id。
数据插入时获得主键值分为两种情况:支持主键自增数据库和不支持主键自增。
1)对于支持自动生成主键的数据库,如Mysql、sqlServer,可以通过Mybatis元素useGeneratedKeys返回当前插入数据主键值到输入类中。
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id"
parameterType="com.kq.domain.IdentityTest">
insert into identity_test(name)
values(#{name,jdbcType=VARCHAR})
</insert>
当执行此条插入语句以后,实体类IdentityTest中的Id会被当前插入数据的主键自动填充。
2)对于不支持自动生成主键的数据库。Oracle、DB2等,可以用元素selectKey 回当前插入数据主键值到输入类中。(同时生成一个自定义的随机主键)
<insert id="insertTest" useGeneratedKeys="true" keyProperty="id"
parameterType="com.kq.domain.IdentityTest">
<selectKey keyProperty="id" resultType="String" order="BEFORE">
SELECT REPLACE(UUID(),'-','')
</selectKey>
insert into identity_test(name)
values(#{name,jdbcType=VARCHAR})
</insert>
当执行此条插入语句以后,实体类IdentityTest中的Id也会被当前插入数据的主键自动填充。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。