mybatis配置和总结

一、Mybatis介绍

    MyBatis是一个优秀的持久层框架,它对jdbc操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。      

   Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

二、Mybatis的配置(传统的配置)

  1. SqlMapConfig.xml的配置:

在classpath下创建SqlMapConfig.xml,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<environments default="development">
	<environment id="development">
	<!-- 使用jdbc事务管理-->
		<transactionManager type="JDBC" />
	<!-- 数据库连接池-->
		<dataSource type="POOLED">
			<property name="driver" value="com.mysql.jdbc.Driver" />
			<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
			<property name="username" value="root" />
			<property name="password" value="root" />
		</dataSource>
	</environment>
</environments>
<mappers>
   <mapper resource="sqlmap/User.xml"/>
SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理 2.sql映射文件配置:

在classpath下的sqlmap目录下创建sql映射文件Users.xml:

<?xml version="1.0" encoding="UTF-8" ?>

3.#{}和${}的区别

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称

表 示 拼 接 s q l 串 , 通 过 {}表示拼接sql串,通过 sql{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值, pojoparameterType{}括号中只能是value。

三、Mapper的动态代理方式
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

<?xml version="1.0" encoding="UTF-8" ?> select * from user where id = #{id} select * from user where username like '%${value}%' select LAST_INSERT_ID() insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})

Mapper配置的几种方法:
1.使用相对于类路径的资源 如:<mapperresource=“sqlmap/User.xml” />

2.使用mapper接口类路径 如:<mapperclass=“cn.itcast.mybatis.mapper.UserMapper”/>

3.注册指定包下的所有mapper接口 如:<packagename=“cn.itcast.mybatis.mapper”/>(推荐)

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

四、输入参数类型

1.传递简单类型
2.传递pojo类型

 Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。

3.传递pojo包装类型

开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

Pojo类中包含pojo。

五、输出结果类型

1.输出简单类型

<select id="findUserCount" parameterType="user" resultType="int">
   select count(1) from user
</select>

2.输出pojo类型
3.输出pojo列表

六、动态sql

1.if

<select id="findUserList" parameterType="user" resultType="user">
	select * from user 
	where 1=1 
	<if test="id!=null">
	and id=#{id}
	</if>
	<if test="username!=null and username!=''">
	and username like '%${username}%'
	</if>
</select>

2.where
可以自动处理第一个and。

select * from user and id=#{id} and username like '%${username}%'

3.foreach
向sql传递数组或List,mybatis使用foreach解析,如下:

SELECT * FROM USERS WHERE username LIKE ‘%张%’ AND (id =10 OR id =89 OR id=16)

SELECT * FROM USERS WHERE username LIKE ‘%张%’ id IN (10,89,16)

在pojo中定义list属性ids存储多个用户id,并添加getter/setter方法

#{id}

4.sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下:

<select id="findUserList" parameterType="user" resultType="user">
	select * from user 
	<where>
	<if test="id!=null and id!=''">
	and id=#{id}
	</if>
	<if test="username!=null and username!=''">
	and username like '%${username}%'
	</if>
	</where>
</select>

将where条件抽取出来


and id=#{id}


and username like ‘%${username}%’


使用include引用

select * from user




注意:如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:

<include refid="namespace.sql片段”/>

七、关联查询
一对一查询:

1.使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息:

定义pojo类:

public class OrdersCustom extends Orders {

private String username;// 用户名称
private String address;// 用户地址
  get/set。。。

OrdersCustom类继承Orders类后OrdersCustom类包括了Orders类的所有字段,只需要定义用户的信息字段即可。

mapper.xml

SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id

定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。
2.使用resultMap,定义专门的resultMap用于映射一对一查询结果

定义pojo类

在Orders类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。

Mapper.xml

<resultMap type="Orders" id="orderUserResultMap">
	<id column="id" property="id"/>
	<result column="user_id" property="userId"/>
	<result column="number" property="number"/>
	<result column="createtime" property="createtime"/>
	<result column="note" property="note"/>
	<!-- 一对一关联映射 -->
	<!-- 
	property:Orders对象的user属性
	javaType:user属性对应 的类型
	 -->
	<association property="user" javaType="cn.itcast.po.User">
		<!-- column:user表的主键对应的列  property:user对象中id属性-->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
		<result column="address" property="address"/>
	</association>
</resultMap>
<select id="findOrdersWithUserResultMap" resultMap="orderUserResultMap">
	SELECT
		o.id,
		o.user_id,
		o.number,
		o.createtime,
		o.note,
		u.username,
		u.address
	FROM
		orders o
	JOIN `user` u ON u.id = o.user_id
</select>

这里resultMap指定orderUserResultMap。

association:表示进行关联查询单条记录

property:表示关联查询的结果存储在cn.itcast.mybatis.po.Orders的user属性中

javaType:表示关联查询的结果类型

<id property="id"column=“user_id”/>:查询结果的user_id列对应关联对象的id属性,这里是表示user_id是关联查询对象的唯一标识。

<result property="username"column=“username”/>:查询结果的username列对应关联对象的username属性。

一对多查询:

mapper.xml

SELECT u.*, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN orders o ON u.id = o.user_id collection部分定义了用户关联的订单信息。表示关联查询结果集

property=“orders”:关联查询的结果集存储在User对象的上哪个属性。

ofType=“orders”:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。

及的意义同一对一查询。

八、Mybatis整合spring
SqlMapConfig.xml:

<?xml version="1.0" encoding="UTF-8" ?>

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${jdbc.driver}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
	<property name="maxActive" value="10" />
	<property name="maxIdle" value="5" />
</bean>
<!-- mapper配置 -->
<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<!-- 数据库连接池 -->
	<property name="dataSource" ref="dataSource" />
	<!-- 加载mybatis的全局配置文件 -->
	<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
</bean>

   <!--扫描包配置mapper-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     <property name="basePackage" value="cn.itcast.mybatis.mapper"></property>
</bean>
db.properties: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=root
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring整合MyBatis的原理可以总结为以下几步: 1. 配置数据源:在Spring配置文件中配置数据源,可以使用Spring自带的数据源或第三方数据源。 2. 配置SqlSessionFactory:SqlSessionFactory是MyBatis的核心配置对象,可以通过Spring的MyBatis-Spring模块来配置SqlSessionFactory。 3. 配置MapperScannerConfigurer:MapperScannerConfigurer是MyBatis-Spring模块提供的一个扫描器,用于自动扫描Mapper接口并注册到Spring容器中。 4. 配置事务管理器:Spring提供了多种事务管理器,可以根据实际情况来选择。 总结一下,Spring整合MyBatis的过程就是将MyBatis的核心配置对象SqlSessionFactory和Mapper接口通过Spring的容器管理起来,并且使用Spring提供的事务管理器来管理事务。 具体的步骤如下: 1. 在Spring配置文件中配置数据源,可以使用Spring自带的数据源或第三方数据源。例如: ``` <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> ``` 2. 配置SqlSessionFactory,可以使用MyBatis-Spring模块提供的SqlSessionFactoryBean来配置。例如: ``` <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.example.model" /> <property name="mapperLocations" value="classpath*:com/example/mapper/*.xml" /> </bean> ``` 其中,typeAliasesPackage用于指定实体类所在的包,mapperLocations用于指定Mapper XML文件所在的路径。 3. 配置MapperScannerConfigurer,可以使用MyBatis-Spring模块提供的MapperScannerConfigurer来配置。例如: ``` <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean> ``` 其中,basePackage用于指定Mapper接口所在的包。 4. 配置事务管理器,可以使用Spring提供的事务管理器。例如: ``` <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> ``` 最后,在Service层的方法上添加@Transactional注解即可实现事务管理。 综上所述,Spring整合MyBatis的过程比较简单,只需要配置几个关键的对象即可。同时,Spring提供了很多方便的注解和工具类,可以更加方便地使用MyBatis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值