学习前提:mybatis实现插入数据后获取插入的ID
1.SQL查询最后一次插入数据的用户id
select LAST_INSERT_ID()
2.mybatis实现插入数据后获取插入的ID
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.itheima.domain.User">
<!-- 配置插入后的操作,获取插入后的id数据 -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
mybatis基本使用
1.mybatis的参数和返回值
参数:
parameterType:输入类型,可以是简单对象,也可以是实体对象(POJO)
OGNL表达式: Object Graphic Navigation Language (对象 图 导航 语言)
作用:通过对象的取值方法来获取数据。在写法上吧get和()省略了。
比如:我们获取用户的名称
类中的写法:user.getUsername();
OGNL表达式:user.username
mybatis能直接写username,不用写user.
是因为在parameterType中已经指定了属性所属的类
POJO对象查询:
嵌套对象要在OGNL表达式写 类名.参数名
返回值:
问题:封装数据的时候,实体类与数据库名称不匹配,无法自动注入
解决1:修改实体类名称(不推荐)
解决2:在查询的时候起别名sex as userSex (最有效)
select id as uid,name as username from user
解决3:采用配置方式解决(resultMap )推荐
<!-- 数据库列名和实体名对不上 使用mapper解决 -->
<resultMap id="userMap" type="com.itheima.domain.User">
<!-- 设置主键 property:实体类的属性名称,column数据库的字段名称-->
<id property="userId" column="id"></id>
<!-- 设置非主键属性 -->
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
2.mybatis配置细节(主配置文件:SqlMapConfig.xml)
properties标签
可以在标签内部配置数据库信息,也可以通过外部引用
<!-- 使用properties配置 -->
<properties resource="Jdbc.properties">
<!-- 使用property标签配置 -->
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="root"/>-->
</properties>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
xxx.properties文件内容如下:
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/eesy_mybatis
jdbc.username = root
jdbc.password = root
properties标签
配置别名,它只能配置domain中类的别名
<!-- typeAliases配置别名,它只能配置domain中类的别名 -->
<typeAliases>
<!-- typeAlias用于配置别名。type属性配置全限定类名,alias指定别名,指定别名后不再区分大小写 -->
<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>
<!-- 用于指定要起别名的包,指定后,该包下的所有实体类都会被注册别名,并且类名就是别名,不再区分大小写 -->
<package name="com.itheima.domain"/>
</typeAliases>
mappers标签的子标签package
指定Dao所在的包,之后不需要写全限定类名,只需要写类名即可
<!-- 配置映射文件 -->
<mappers>
<!-- 指定映射文件的位置 -->
<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>
<!-- package用于指定dao接口所在的包,指定后就不需要在写resource或者class了 -->
<package name="com.itheima.dao"/>
</mappers>