MyBatis入门(3)
前记:这是很早之前自学学习myBatis时的笔记,内容比较基础,适合新手,内容基本是来自网络,如有雷同,敬请谅解!
jar包
加入mybatis核心包、依赖包、数据驱动包。
配置日志
在classpath下创建log4j.properties如下:
# Global loggingconfiguration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis默认使用log4j作为输出日志信息。
配置SqlMapConfig.xml
在SqlMapConfig.xml文件中配置:
SqlMapConfig.xml就是myBatis的全局配置文件
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和spring整合后 environments配置将废除-->
<environmentsdefault="development">
<environment id="development">
<!--用jdbc事务管理-->
<transactionManagertype="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="123"/>
</dataSource>
</environment>
</environments>
</configuration>
SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。
映射文件
映射文件命名:
举例:
User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml
在映射文件中配置sql语句。
parameterType:定义输入到sql中的映射类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:定义结果映射类型。mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
在SqlMapConfig.xml中加载映射文件
举例:
在sqlMapConfig.xml中加载User.xml:
自增主键返回
mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键:
LAST_INSERT_ID()
是insert之后调用此函数。
修改insertUser定义:
<insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">
<!-- selectKey将主键返回,需要再返回 -->
<selectKey keyProperty="id"
order="AFTER"
resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address});
</insert>
添加selectKey实现将主键返回:
keyProperty:返回的主键存储在pojo中的哪个属性
order:selectKey的执行顺序,是相对与insert语句来说,
由于mysql的自增原理执行完insert语句之后才将主键生成,
所以这里selectKey的执行顺序为after
resultType:返回的主键是什么类型
LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。
select LAST_INSERT_ID()得到刚insert进去记录的主键值,只适用于自增主键。
非自增主键返回(使用uuid())
1. 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中。
执行uuid()语句顺序相对于insert语句之前执行。
注意这里使用的order是“BEFORE”
2. 通过oracle的序列生成主键:
<selectKeykeyProperty="id"
order="BEFORE"
resultType="java.lang.String">
SELECT序列名.nextval()
</selectKey>
insert into user(id,username,birthday,sex,address)
value(#{id},#{username},#{birthday},#{sex},#{address})
注意这里使用的order是“BEFORE”
总结
1. parameterType 在映射文件中通过parameterType指定输入 参数的类型。
2. resultType 在映射文件中通过resultType指定输出结果的类型。
3. #{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
4. selectOne和selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
如果使用selectOne报错:
org.apache.ibatis.exceptions.TooManyResultsException:Expected one result (or null) to be returned by selectOne(), but found: 4