Mybatis的搭建以及使用

一,如何搭建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

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值