接口方法只可以重载的,但是id不能重复,在同名方法中,增加一个RowBound类型的参数用于实现分页查询
resultMap用来配置java对象的属性和查询结果列对应的关系
<select id="selectById" resultMap="userMap">
select * from sys_user where id=#{id}
</select>
2. 设置别名,使其自动映射 -->
<select id="selectAll" resultType="tk.myBatis.simple.model.SysUser">
select id,
user_name ,
user_password ,
user_info ,
head_img ,
create_time
from sys_user
</select>
3. 在设置property属性时,可以不考虑大小写,一般是将其现全转化为大写,进行对比 -->
<result property="username" column="user_name"/>
<!-- logImpl屬性配置指定使用LOG4J輸出日誌 -->
<settings>
<setting name="logImpl" value="LOG4J" />
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- 通过这个属性可以将一下划线方式命名的数据库列映射到Java对象的驼峰式明明属性中 -->
</settings>
<typeAliases>
<package name="tk.mybatis.simple.model"/>
</typeAliases>
1.数据库 date 、time、datatime对应JDBC类型分别为DATE、TIME、TIMESTAMP
2.获取当前时间
user.setCreateTime(new Date());
#{createTime,jdbcType=TIME}
2018-04-12 09:34:22.056(Timestamp)
2018-04-12(Date);
3.mysql获取自增的主键id
<!-- 获取主键自增的id -->
<insert id="insert2" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(
user_name,user_password,user_email,user_info,head_img,create_time)
values(
#{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
)
</insert>
mysql非自增
<insert id="insert3" useGeneratedKeys="true" keyProperty="id">
insert into sys_user(
user_name,user_password,user_email,user_info,head_img,create_time)
values(
#{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP}
)
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()//用于获取数据库中最后插入的数据的ID值
//oracle: select seq_id.nextval from dual//获取序列的sql语句
</selectKey>
注意:
order的属性的设置和适用的数据库相关,在MYSQL数据库中,order属性设置的值是AFTER,因为当前记录的的主键值在inert语句执行成功后才能获取到
在ORACLE数据库中,order旳值为BEFORE,因为 Oracle要先从序列获取值,然后将值作为主键,插入到数据库中
测试语句
@Test
public void testInsert3() {
SqlSession sqlSession=getSqlSession();
try {
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
SysUser user=new SysUser();
user.setUserName("test1");
user.setUserPassword("123456");
user.setUserEmail("test@mybatis.tk");
user.setUserInfo("test info");
user.setHeadImg(new byte[] {1,2,3});
user.setCreateTime(new Date());
int result=userMapper.insert3(user);
Assert.assertEquals(1, result);
Assert.assertNotNull(user.getId());
}finally {
sqlSession.rollback();
sqlSession.close();
}
Mybatis 动态sql
XML标签:if、choose(when、otherwise)、trim(where 、set)、foreach、bind
可以实现多条件查询、只更新更改的的字段、未插入的值使用默认值
foreach实现批量插入、动态更新
bind实现多数据库支持
Mybatis 代码生成器
1. mybatis-generator-config_1_0.dtd用于定义改配置文件中所有标签和属性的用法和限制,文件头后,
需要写上xml文件的根节点 :<generatoeConfiguration>
2. mybatis自定义配置 顺序:properties、classPathEntry、context
<1> properties 用来指定外部的属性元素,最多可以配置一个,也可以不配
<2> classPathEntry最常见的用法是通过属性location制定驱动的路径
<3> context用于指定生成一组对象的环境,例如指定要连接的数据库、要生成对象的类型和要处理的数据库中的表
context的可选属性,defaultModelType定义如何生成实体类,
flat:为每张表生成一个实体类-->
<context id="MySql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="'"/>
</context>
3. commentGenerator 标签用来配置如何生成注释信息,最多可以配置一个,一般关闭mybatis自动生成的注释
<commentGenerator>
<property name="supressDate" value="true" />//阻止生成注释包含时间戳
<property name="addRemarkComments" value="true" />//注释是否添加数据库表的备注信息
</commentGenerator>
4. jdbcConnection 标签用于指定Mybatis要连接的数据库信息,必选并只能有一个。
<jdbcConnection connectionURL="jdbc:oracle:thin:@172.20.94.204:1521:icreative"
driverClass="oracle.jdbc.driver.OracleDriver"
password="itm"
userId="itm" />
存储过程
存储过程处理比较复杂的业务时比较实用。比如说,一个复杂的数据操作。如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。 也就是说存储过程可以给我们带来运行效率提高的好处。
<select id="selectUserById" statementType="CALLABLE" useCache="false">
{call select_user_by_id(
#{id,mode=IN},//oracle数据库,入参存在null的情况,那么入参也必须指定jdbcType
#{userName,mode=OUT,jdbcType=VARCHAR},
#{userPassword,mode=OUT,jdbcType=VARCHAR},
#{userEmail,mode=OUT,jdbcType=VARCHAR},
#{userInfo,mode=OUT,jdbcType=VARCHAR},
#{headImg.mode=OUT,jdbcType=VARCHAR,javaType=_byte[]}
#{createTime,mode=OUT,jdbcType=TIMESTAMP}
)}
</select>