使用示例
1. 配置文件及映射表编写示例
配置文件及映射表 mybatis.xml
:
<?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. 加载类路径下的属性文件,主要是数据库的链接、密钥等内容 -->
<properties resource="db.properties"/>
<!-- 2.1 设置一个默认的连接环境信息 -->
<environments default="mybatis_dev">
<!-- 2.2 某个连接环境的信息,取一个任意唯一的名字(以MySQL为例) -->
<environment id="mysql_developer">
<transactionManager type="jdbc"/> <!-- mybatis使用jdbc事务管理方式 -->
<!-- 2.3 配置数据源:mybatis使用连接池方式来获取连接 -->
<dataSource type="pooled">
<!-- 2.4 配置与数据库交互的4个必要属性 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
<!-- 其它环境 -->
</environments>
<!-- 3. 给出映射配置文件-->
<mappers>
<mapper resource="./StudentMapper.xml"/>
<!-- 批量引用,需要PojoA.xml与PojoA.java在同一个目录中 --><!--
<package name="examples.pojo"/> -->
</mappers>
</configuration>
2. 实例类与数据库表映射文件编写示例
实例类与数据库表的映射文件 StudentMapper.xml
:
<?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">
<!-- namespace属性是名称空间,必须唯一,用于接口调用 -->
<mapper namespace="StudentMapperA">
<!-- resultMap 标签:映射实体与表
type 属性:表示实体全路径名(类名)
id 属性:为实体与表的映射取一个任意的唯一的名字 -->
<resultMap type="example.Student" id="StudentBeanMap">
<!-- id 标签:映射主键属性
result 标签:映射非主键属性
property 属性:实体的属性名
column 属性:数据库表的字段名 -->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sal" column="sal"/>
<!-- 关联属性,把两个Map关联起来 --> <!--
<association property="studentWhatEver" resultMap="StudentMapperB.anotherStudentMap"/> -->
</resultMap>
<!-- 各种SQL操作语句
id 标签:语句映射ID,使用"名称空间.语句映射ID"的方式调用DAO方法/SQL语句
parameterType 属性:接受参数的类型
resultMap 属性:返回参数的类型一个,<resultMap>:id -->
<insert id="add" parameterType="example.Student"> <!-- insert("StudentMapperA.add", student)方法-->
INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal});
</insert>
<delete id="delete" parameterType="int"> <!-- delete("StudentMapperA.delete",id)方法 -->
DELETE FROM STUDENTS WHERE id=#{id};
</delete>
<update id="update" parameterType="example.Student"> <!-- update("StudentMapperA.update", student)方法 -->
update students set name=#{name},sal=#{sal} where id=#{id};
</update>
<select id="findById" parameterType="int" resultMap="StudentBeanMap"> <!-- selectOne("StudentMapperA.findById",id) 方法-->
SELECT * FROM STUDENTS WHERE id = #{id};
</select>
<select id="findAll" resultMap="StudentBeanMap"> <!-- selectList("StudentMapperA.findAll")方法,返回List<example.Student> -->
SELECT * FROM STUDENTS;
</select>
</mapper>
resultType
和resultMap
的区别:前者需要数据库中字段名和Java POJO类中的属性名一致,且只能一对一;后者根据映射条件即可,可用于一对多即分页查询结果返回。
Student
类:
public class Student { // example.Student
private Integer id;
private String name;
private Double sal;
public Student() {}
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Double getSal() {return sal;}
public void setSal(Double sal) {this.sal = sal;}
}
3. 动态SQL的编写示例
<select id="findByCondition" parameterType="map" resultMap="studentMap">
select * from students
<where>
<if test="name!=null">
and name = #{name}
</if>
<if test="sal!=null">
and sal = #{sal}
</if>
</where>
</select>
查询方法:
Map<String, Object> map = new HashMap()<String, Object>{{
put("name", name);
put("sal", sal);
}};
return sqlSession.selectList("StudentID.findByCondition", map);
4. 获取链接和执行语句
public class MybatisUtil {
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlSessionFactory;
static{
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml"); // 1. 加载位于src/mybatis.xml配置文件
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 2. 构建工厂类
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private MybatisUtil(){}
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get(); // 从当前线程中获取SqlSession对象
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession(); // 3. 在SqlSessionFactory非空的情况下,获取SqlSession对象
threadLocal.set(sqlSession); // 将SqlSession对象与当前线程绑定在一起
}
return sqlSession;
}
/**
* 关闭SqlSession与当前线程分开
*/
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close(); // 4.关闭SqlSession对象
threadLocal.remove(); // 5. 分开当前线程与SqlSession对象的关系,目的是让GC尽早回收
}
}
public static void main(String[] args) {
Connection conn = MybatisUtil.getSqlSession().getConnection();
System.out.println(conn!=null?"连接成功":"连接失败");
try {
sqlSession.selectOne("StudentMapperA.findById", 10); //映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL
sqlSession.commit(); // 手动提交事务
} catch(Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
} finally {
MybatisUtil.closeSqlSession();
}
}
}
- Mybatis的事务默认是开启的,需要我们手动去提交事务。
附录
1 配置文件中的别名
Java中的类型与 parameterType
的映射关系:
Java类型 | 别名 | Java类型 | 别名 |
---|---|---|---|
byte | _byte | Byte | byte |
long | _long | Long | long |
short | _short | Short | short |
int | _int, _integer | Integer | int, integer |
double | _double | Double | double |
float | _float | Float | float |
boolean | _boolean | Boolean | boolean |
Date | date | ||
BigDecimal | decimal, bigdecimal |
自定义别名:
<typeAliases>
<!-- 单个别名的定义:type(别名映射的类型) alias(别名) -->
<!-- <typeAlias type="example.pojo.PojoA" alias="pojoalias"/> -->
<!-- 批量别名定义:指定包路径,自动扫描包下边的pojo。定义别名,别名默认为类名(首字母小写或大写)-->
<package name="example.pojo"/>
</typeAliases>
2 延迟加载
设置项 | 描述 | 默认值 |
---|---|---|
lazyLoadingEnable | 是否全局性的进行懒加载 | false |
aggressiveLazyLoading | 被设置为true时,可能被懒加载,否则均按需加载 | true |