Mybatis总结

382 阅读3分钟

1.Mybatis介绍

(1).MyBatis是一款优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

(2).通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

(3)优点:简化JDBC,能执行sql语句,将sql转换为Java对象

2.基本mybatis实现
需要定义实体类,Dao接口,Dao接口的Mapper文件,mybatis主配置文件。
(1)实体类:定义实体的属性,给属性设置set,get方法,重写toString方法
(2)Dao接口:定义操作数据库的方法
(3)Mapper文件:写入sql语句,与Dao接口中方法相映射
(4)主配置文件:写入数据库信息,Mapper文件位置

使用步骤:添加mybatis依赖,mysql驱动,定义dao接口,定义mapper文件,定义主配置文件,使用sqlsession对象执行sql语句

//实体类
public class Customer {
   //属性

   //set get方法
   
   //toString方法
    }
}

//dao接口
public interface CustomerDao {
     public List<Customer> findAll();
     public List<Customer> findLike(String name);
     public int insert(Customer customer);
     public int delete(int id);
     public int update(Customer customer);
}
//映射文件
<mapper namespace="com.yuan.dao.CustomerDao">
    <select id="findAll" resultType="com.yuan.domain.Customer">
        select * from customer
    </select>
    <select id="findLike" resultType="com.yuan.domain.Customer">
        select * from customer where cust_name like #{name}
    </select>
    <insert id="insert">
        insert into customer(cust_id,cust_name) values(#{cust_id},#{cust_name})
    </insert>
    <update id="update">
        update customer cust_name=#{type_name} where cust_id=#{cust_id}
    </update>
    <delete id="delete">
        delete from customer where cust_id=#{typeId}
    </delete>
</mapper>
//mybatis主配置文件
<configuration>
    <environments default="mydev">
        <environment id="mydev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库的驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/18jxnu_boot"/>
                <!--访问数据库的用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    <!-- sql mapper(sql映射文件)的位置-->
    <mappers>
        <!--一个mapper标签指定一个文件的位置。
           从类路径开始的路径信息。  target/clasess(类路径)
        -->
        <mapper resource="com/yuan/dao/CustomerDao.xml"/>
        <mapper resource="com/yuan/dao/UserDao.xml"/>
    </mappers>

</configuration>

3.SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession分析

SqlSessionFactoryBuilder从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory的类

SqlSessionFactory顾名思义,是用于生产 SqlSession 的工厂。

SqlSession 包含了执行 SQL 的所有的方法

4.将获取sqlsession对象封装为工具类

//工具类
public class MyBatisUtils {

    private  static  SqlSessionFactory factory = null;
    static {
        String config="mybatis.xml";
        try {
            //Resources负责读取主配值文件
            InputStream in = Resources.getResourceAsStream(config);
            //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //获取SqlSession的方法
    public static SqlSession getSqlSession() {
        SqlSession sqlSession  = null;
        if( factory != null){
            sqlSession = factory.openSession();// 非自动提交事务
        }
        return sqlSession;
    }
}

5.Mybatis的动态代理:

SqlSession中可以通过getMapper()拿到代理对象,SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。

动态代理的 代理类是 MapperProxy ,这里边mapperMethod.execute(sqlSession, args)最终完成了增删改查方法的调用。


//测试方法
public void TestFindAll() throws IOException {

        SqlSession session = MyBatisUtils.getSqlSession();

        CustomerDao dao = session.getMapper(CustomerDao.class);
        //动态代理:session.getMapper() 方法内部产生了CustomerDao的实现类。
        List<Customer> customers = dao.findAll();

        for(Customer cust: customers){
            System.out.println("顾客="+cust);
        }
        session.close();
    }

6.多表查询

需要使用resultMap关联结果集映射

<mapper namespace="com.yuan.dao.UserDao">
    <resultMap id="cust_user" type="com.yuan.domain.Sys_user">
        <result column="cust_name" property="customer.cust_name"/>
    </resultMap>
    <select id="findAll" resultMap="cust_user">
        select sys_user.user_id,customer.cust_id,customer.cust_name,customer.cust_address,sys_user.user_name from sys_user inner join customer on customer.cust_id=sys_user.cust_id
    </select>
</mapper>

7.#{}和${}的区别是什么?

(1)Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值
(2)Mybatis在处理美元符号时,就是把其替换成变量的值
(3)使用#{}可以有效的防止 SQL 注入,提高系统安全性
#是预编译处理, $是字符串替换

8.MyBatis 传递参数
(1)一个简单参数
Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方 法的参数名无关。
(2)多个参数-使用@Param
当 Dao 接口方法多个参数,需要通过名称使用参数。在方法形参前面加入@Param(“自定义参数名”), mapper 文件使用#{自定义参数名}。

9.resultType
执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集 合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。 返回的类型使用构造方法创建对象。调用 setXXX 给属性赋值。