Java - MyBatis

遇到的问题以及解决方式

(1)

错误:
Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property ‘id’ of ‘class com.yhsoft.api.store.domain.SysUserDetail’ with value ‘71ba561ac536413b891778db0809f9ff’ Cause: java.lang.IllegalArgumentException: argument type mismatch

解决方式:
@TableId(type = IdType.AUTO)
@TableField(value = “id”, fill = FieldFill.INSERT)

一.JDBC的缺点

1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。
2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。
3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便

left join: 左表查询的结果是完整的,右边的表查询的结果是残缺的.
inner join:左右两边查询的结果是残缺的.

(1)一对一关联查询,以订单为中心关联用户

需求:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

//一对一关联查询,以订单为中心关联用户
<resultMap type=“Orders” id=“order”>
	//订单对字段不能少写
	<result column=“user_id” property=“userId” />
	...
	//一对一,这是用户对象字段
	<association property=“user” javaType=“User”>
		<id column=“user_id” property=“id” />
		<result column=“username” property=“username”/>
	</association>
</resutlMap>

<select id=“selectOrders” resultMap=“order”>
	SELECT
	o.id
	o.user_id,
	o.number,
	o.createtime,
	u.username
	FROM oreders o
	left join user u
	on o.user_id = u.id
</select>
(2)一对多查询

案例:查询所有用户信息及用户关联的订单信息。
用户信息和订单信息为一对多关系。

SELECT
	u.id,
	u.username,
	u.birthday,
	u.sex,
	u.address,
	o.id oid,
	o.number,
	o.createtime,
	o.note
FROM
	`user` u
LEFT JOIN `order` o ON u.id = o.user_id

####(3)foreach标签
向sql传递数组或List,mybatis使用foreach解析,如下:
根据多个id查询用户信息
查询sql:
SELECT * FROM user WHERE id IN (1,10,24)

<!-- 根据ids查询用户 -->
<select id="queryUserByIds" parameterType="queryVo" resultType="user">
	SELECT * FROM `user`
	<where>
		<!-- foreach标签,进行遍历 -->
		<!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
		<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
		<!-- open:在前面添加的sql片段 -->
		<!-- close:在结尾处添加的sql片段 -->
		<!-- separator:指定遍历的元素之间使用的分隔符 -->
		<foreach collection="ids" item="item" open="id IN (" close=")"
			separator=",">
			#{item}
		</foreach>
	</where>
</select>

####MyBatis数据库连接设置步骤
//加载配置文件

<!-- 加载配置文件 -->
   <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>

//配置SqlSessionFactory

<!-- 配置SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 配置mybatis核心配置文件 -->
		<property name="configLocation" value="classpath:SqlMapConfig.xml" />
		<!-- 配置数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

//
两种dao的实现方式:
1、 原始dao的开发方式
2、 使用Mapper代理形式开发方式
a) 直接配置Mapper代理
b) 使用扫描包配置Mapper代理

需求:
实现根据用户id查询
实现根据用户名模糊查询
添加用户

//推荐使用"Mapper动态代理开发   扫描"
<!-- Dao原始Dao -->
	<bean id="userDao" class="com.itheima.mybatis.dao.UserDaoImpl">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
	</bean>
	<!-- Mapper动态代理开发 -->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
		<property name="mapperInterface" value="com.itheima.mybatis.mapper.UserMapper"/>
	</bean>
	
	<!-- Mapper动态代理开发   扫描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 基本包 -->
		<property name="basePackage" value="com.itheima.mybatis.mapper"/>
	</bean>

//读取配置文件

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

//getBean方式可以是,取id,取类
ac.getBean(“userMapper”);//取id,需要强转
ac.getBean(UserMapper.class)//取类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值