一,如何搭建Mybatis
1,创建一张表和表对应的实体类
2.导入 MyBatis jar 包,mysql 数据库驱动包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
3. 创建 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
</configuration>
4
定义对应的接口
public interface AdminDao{
Admin findAdminById(int id);
}
5 创建 sql 映射文件
<?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="接口的地址">
<select id="findAdminById" parameterType="int" resultType="com.ffyc.mybatis.model.Admin">
select * from admin where id = #{id} </select> </mapper>
6.
测试
MyBatis
读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
创建 SqlSessionFactory
SqlSessionFactory sessionFactory =
new SqlSessionFactoryBuilder().build(reader);
创建 SqlSession
SqlSession sqlSession = sessionFactory.openSession();
获得接口代理对象
sqlSession.getMapper(接口.class);
sqlSession .close();关闭
二,如何使用Mybatis框架
1,API 接口说明
SqlSessionFactory 接口
使用 SqlSessionFactory 来创建 SqlSession,一旦创建 SqlSessionFactory 就
会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建
它,一个应用运行中也不建议多次创建 SqlSessionFactory。
SqlSession 接口
Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方
法,与数据库会话完成后关闭会话。
2,参数传递
单个参数直接传递
Admin selectAdmins(int id);
多个参数使用@Param(“id”)绑定
Admin selectAdmins(@Param(“account”)String account, @Param(“password”)String password);
如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如:
void insertAdmin(Admin admin);
<insert id="insertAdmin" parameterType="Admin">
insert into admin(id, account, password)
values (#{id}, #{account}, #{password})
</insert>
3,增删改查
增加
<insert id="
唯一标识
" useGeneratedKeys="
把新增加的主键赋值到自己定义的
keyProperty " keyProperty=“
接收主键的属性
parameterType="
参数类型
">
insert into
admin(account,password)values(#{account},#{password})
</insert>
</mapper>
修改
<update id=
"
唯一标识
"
parameterType=“
参数类型
">
update
admin set account= #{account},password= #{password} where
id= #{id}
</update>
删除
<delete id=
"
唯一标识
"
parameterType=
"
参数类型
"
>
delete from admin where id= #{id}
</delete>
查询
<select id="
唯一标识
" resultType="
返回结果集类型
">
select *
from admin where id= #{id}
</select>
4,结果处理
简单类型输出映射
返回简单基本类型
<select id="findAdminInfoCount" resultType="int">
select count(*) from admin
</select>
5,对象映射
如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装
到POJO对象中.
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局
设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>
6,#{} 和${}区别
#{}
是占位符,是采用预编译方式向sql中传值,可以防止sqL注入,
如果我们往sql中传值,使用#{}
${}
是将内容直接拼接到sql语句中,一般不用于向sql中传值,
一般用于向sql动态传递列名
区别:
底层实现不同
# { } 采用预编译方式 防止sql注入更加安全
${ } 采用字符串拼接,直按将值拼接到sql中
使用场景不国
# { } 一般用于向sql 中的列传值
$ { }一般用于向sql动态传递到列名 例如: 排序时 order by 后面的列名是可以改变
例如:select 后面的列名也可以自由选择
7,特殊处理定义 resultMap
定义 resutlMap
<resultMap id="adminResultMap" type="Admin">
<id column="id" property="id"/>
<result property="account" column="account" />
<result property="password" column="password" />
</resultMap>
(1). resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为
“adminResultMap”
(2). resutlMap 的 type 属性是映射的 POJO 类型
(3). id 标签映射主键,result 标签映射非主键
(4). property 设置对象属性名称,column 映射查询结果的列名称
使用 resutlMap
<select id="findAdminInfoResultMap" resultMap="adminResultMap">
SELECT id ,account,password FROM admin
</select>
(1). 本例的输出映射使用的是 resultMap,而非 resultType
(2). resultMap 引用了 adminResultMap
8,多表关联处理结果集
<!--
使用resultMap标签,对查询结果进行自定义映射
type = "Admin" 最终返回结果的类型
-->
<resultMap id="adminMap" type="Admin">
<id column="adminid" property="id"></id>
<result column="account" property="account"></result>
</resultMap>
<select id="findAdmin" resultMap="adminMap">
select id adminid , account from admin
</select>
运行结果
9,嵌套查询
将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.
<association property="dept" javaType="Dept"
select="findDeptByID" column="dept_id">
</association>
(1). select:指定关联查询对象的 Mapper Statement ID 为 findDeptByID
(2). column="dept_id":关联查询时将 dept_id 列的值传入 findDeptByID,
并将 findDeptByID 查询的结果映射到 Emp 的 dept 属性中
(3).collection 和 association 都需要配置 select 和 column 属性,两者配置方法
相同
10,注解方式
常用注解标签
@Insert : 插入 sql , 和 xml insert sql 语法完全一样
@Select : 查询 sql, 和 xml select sql 语法完全一样
@Update : 更新 sql, 和 xml update sql 语法完全一样
@Delete : 删除 sql, 和 xml delete sql 语法完全一样
@Param
: 入参
@Results : 设置结果集合
@Result : 结果
使用Mybatis框架来进行数据库的查询操作
11,使用案例
查询所有信息
@Select("select * from t_emp")
@Results(id = "empMap",value = {
@Result(column = "emp_id",property = "empId",id = true),
@Result(column = "emp_name",property = "empName"),
@Result(column = "emp_tel",property = "empTel"),
@Result(column = "emp_education",property = "empEducation"),
@Result(column = "emp_birthday",property = "empBirthday")
})
List<Employee> getAll();
查询单个信息
@Select("select * from t_emp where emp_id=#{empId}")
@ResultMap(value="empMap")
Employee getById(@Param("empId") Integer empId);
插入信息
@Insert("insert into t_emp (emp_id, emp_name, emp_tel, " +
" emp_education, emp_birthday, fk_dept_id" +
" )" values (#{empId}, #{empName}, #{empTel}, " +
" #{empEducation}, #{empBirthday}, #{fkDeptId}" +
" )")
int insert(Employee record);
删除信息
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);
12,Mybatis 动态 SQL
MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用
JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么
的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理
这种痛苦。
MyBatis 中用于实现动态 SQL 的元素主要有:
If
where
teim
set
choose(when,otherwise)
foreach
动态SQL实例: 可以在SQL中添加逻辑判断 if test 属性条件立 执行if标签体,不成立就不执行 where标签 当where标签 if语句有条件成立时,就会动态添加where关键字 还可以删除where后面紧跟着的关键字,例如 and,or