Mybatis学习:Mybatis的配置
原创
©著作权归作者所有:来自51CTO博客作者蹊源的奇思妙想的原创作品,请联系作者获取转载授权,否则将追究法律责任
Mybatis的配置
Mybatis是一款支持自定义SQL查询、存储过程和高级映射的持久层框架。
Mybatis特点:
- 与其他的ORM(对象关系映射)框架相比,Mybatis可以理解为半自动ORM。它并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。(之后利用一个映射引擎,声明地将SQL语句执行结果与对象树映射起来。)
- 与jdbc相比,Mybatis简化了相关代码。对jdbc进行了轻量级的封装。
- Mybatis支持声明式缓存,Mybatis默认使用Java HashMap进行缓存,也可以使用第三方API进行缓存。
关于mybatis配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 1、mybatis使用properties来引入外部properties配置文件的内容
resource 引入类路径下资源
url 引入网络路径或磁盘路径下资源 -->
<properties resource="db.properties"></properties>
<!-- 2、settings包含很多重要的设置项
setting标识具体的设置项
name表示设置项的名字
value表示设置项的值 -->
<!--这里设置日志输出方式-->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<!-- 3、typeAliases 为java类型起别名,别名不区分大小写
typeAlias 为某个具体的java类型取别名
type java类的全类名,默认别名就是类名小写
alias 自定义别名 -->
<!-- 在xml中 mapper中返回结果可以使用该别名 这里使用User 等于 con.luo.Model.User-->
<typeAliases>
<package name="src.com.luo.Model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.name}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--配置映射文件-->
<mappers>
<mapper resource="src/com/luo/MybatisMappings/UserMapper.xml"></mapper>
</mappers>
</configuration>
补充:
1.typeAliases :实现取别名的功能
2.配置文件时 可以将文件都列出来,也可以 将整个包导入
Mybatis提供了两种方式将Java方法与SQL语句关联:
使用XML方式进行关联 和 使用注解的方式进行关联
使用XML方式
select
resultMap 与 resultType
a.resultMap用于设置返回值类型和映射关系 property 对象属性 column 表属性 “下划线转驼峰” 适用于属性较多
b.resultType直接使用set 进行对象注入参数 适用于属性较少
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="src.com.luo.MybatisMappings.UserMapper.xml" >
<select id="selectAll" resultType="User">
select * from User
</select>
</mapper>
insert
a.接口参数是对象 会自动调用get获取属性
insert into 表名 (表属性1,表属性2) values(#{对象属性1},#{对象属性2})
b.如何判断插入成功
- insert默认会返回一个int值,代表其影响的行数
- 通过获取返回的自增主键来判断是否成功 …
- 当主键不是自增主键时 在这里添加
mysql
<selectKey keyColumn="id" resultType="long" keyProperty="id" order"AFTER" >
SELECT LAST_INSERT_ID()
</selectKey>
Oracle :先从序列获取值,然后将值作为主键插入到数据库
<selectKey keyColumn="id" resultType="long" keyProperty="id" order"BEFORE" >
SELECT SEQ_ID.nextval from dual
</selectKey>
update和delete
默认返回一个int 表示其影响的行数
重点:
1.接口与XML是通过namespace的值设置为接口的全限定名来进行关联的;
2.接口中的方法 是与事务标签(select、insert、update、delete)中的id属性进行关联的;
使用注解的方式
@Select注解
resultMap的实现
@Results(
@Result(property = "id",column ="id", id=true),
@Result(property = "rolename",column ="role_name"),
)
@Select({"select id,role_name where id =#{id}"})
User selectUser(Long id)
@Insert注解
a.不需要返回主键
@Insert({"insert into 表名(id,name) values(#{id},#{name})"})
int insert(User user)
b.返回自增主键
@Insert({"insert into 表名(id,name) values(#{id},#{name})"})
@Options(useGenerateKeys = true, keyProperty ="id")
int insert(User user)
c.返回非增主键
mysql
@Insert({"insert into 表名(id,name) values(#{id},#{name})"})
@SelectKey(statement ="SELECT LAST_INSERT_ID()",
keyProperty = "id",
resultType = Long.class,
before = false
)
int insert(User user)
Oracle
@Insert({"insert into 表名(id,name) values(#{id},#{name})"})
@SelectKey(statement ="SELECT LAST_INSERT_ID()",
keyProperty = "id",
resultType = Long.class,
before = true
)
int insert(User user)
@Update注解和@Delete注解
@Update({"update 表名 name = #{name} where id =#{id}"})
int update(User user)
@Delete({"delete from 表名 where id = #{id}"})
int delete(User user)