mybatis的基本使用

MyBatis
    1)什么是MyBatis
        开源的持久层框架
        注:MyBatis底层任然是jdbc
    jdbc 优点:速度快,容易掌握,缺点:代码繁琐
    Hibernate 优点:不用写sql语句,代码简洁  缺点:对于比较复杂的查询,生成的sql性能低下,需要优化,难掌握
    MyBatis 优点:速度适中,代码简洁,容易掌握

    2)如何使用MyBatis
        第一步:导包,在pom.xml中  mybatis(3.2.8版本)和ojdbc (14版本)
        第二步:添加配置文件SqlMapConfig.xml 这个文件里面要做相应的修改
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
    "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver" />
                <property name="url"
                    value="jdbc:oracle:thin:@localhost:1521:DHH" />      //这边要写自己数据库的各个参数
                <property name="username" value="sa" />
                <property name="password" value="dhh1990" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="entity/EmpMapper.xml" />          //这边是映射文件的路劲
    </mappers>
</configuration>
        第三步:添加一个实体类
            注:这个类的成员变量的名字要和表的字段名字一样的,大小写无所谓,添加get和set方法
        第四步:添加映射文件
            注:主要是一些sql语句
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="test">
    <!-- insert元素:表示往数据库里插入记录
    id属性:要求唯一
    parameterType属性:参数的类型,如果是类,要写类的全名(包名.类名)
    -->
    <insert id="save" parameterType="entity.Employee">
        insert into t_emp values(t_emp_seq.nextval,#{name},#{salary},#{age})   //这边的#{name}相当于之前的?  这里是调用类中的getName 方法
    </insert>
    
</mapper>



        第五步:调用SQLSession提供的方法来访问数据库
                首先要创建SQLSession对象
                SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
                        InputStream inputStream=TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
                SqlSessionFactory ssf=ssfb.build(inputStream);
                SqlSession ss=ssf.openSession();

                接下来就可以调用相应的方法了    
                 Employee emp=new Employee();
                emp.setName("dong");
                emp.setSalary(60000);
                emp.setAge(27);
                ss.insert("test.save", emp);  //这个调用的插入的方法   第一个参数是映射文件中的对应方法的id,第二个参数是映射文件中的                                //parameterType属性的值对应的类型参数
                ss.commit();    //用sqlsession对象,要手动提交事务的
                ss.close();


        工作原理: 1)配置文件SqlmapConfig.xml包含映射文件的路劲  
              2)SQLSessionFactory对象读取配置文件,然后创建包含好多预编译的statement语句对象的Map
              3)通过调用SQLSessionFactory的openSession方法获得SQLSession对象
              4)调用SqlSession的相应的插入,删除等方法,语句映射文件的sqlid找到对应的statement语句对象,再执行


例题:<mapper namespace="test">
    <!-- insert元素:表示往数据库里插入记录
    id属性:要求唯一
    parameterType属性:sql语句中的参数的类型,如果是类,要写类的全名(包名.类名)
    -->
    <insert id="save" parameterType="entity.Employee">
        insert into t_emp values(t_emp_seq.nextval,#{name},#{salary},#{age})
    </insert>
    <!-- resultType属性:是sql语句执行之后的返回值类型 如果返回值对象是类,要写类的全名(包名.类名) -->
    <select id="findAll" resultType="entity.Employee">
        select * from t_emp
    </select>
    <select id="findid" parameterType="int" resultType="entity.Employee">
        select * from t_emp where id=#{id}
    </select>
    <update id="up" parameterType="entity.Employee">
        update t_emp set name=#{name},salary=#{salary},age=#{age} where id=#{id}
    </update>
    <delete id="del" parameterType="int">
        delete from t_emp where id=#{id}
    </delete>
</mapper>

插入:调用session的insert方法   ss.insert("test.save", emp);
查询所有记录:调用session中的selectlist方法     ss.selectList("test.findAll");
查询一条记录:调用session中的selectOne方法     ss.selectOne("findid", 5);
修改记录:调用session中的update方法     ss.update("up", emp);
删除记录:调用session中的delete方法     ss.delete("del", 5);

解决实体类的属性名与表的字段名不一致的情况
    方法一:使用别名
        就是在写sql语句的时候,给字段名取别名。别名和实体类的变量名字一样
        例如:select id as empNo,name as ename,salary,age from t_emp
    方法二:使用resultMap
        在sql语句的语句前添加<resultMap>元素
        <!-- 告诉Mybatis,实体类的属性名与表的字段名的对应关系 -->
    <resultMap type="entity.Emp" id="erm">            //这边的type就是实体类的类名
        <result property="empNo" column="id"/>         //property  表示的是类中的名字   column  表示的是表中对应的字段的名字
        <result property="ename" column="name"/>      //只要列出不同的字段就可以了
    </resultMap>
    然后在结果标签也要变成resultMap   它的值就是上面写的resultMap的id
    <select id="findbyid3" parameterType="int" resultMap="erm">
        select * from t_emp where id=#{id}
    </select>

   

Mapper映射器

要用映射器,前面MyBatis的配置,这些都要做的

    1、概念    是一个符合映射文件要求的接口
           注:MyBatis会自动生成一个符合该接口要求的对象,只需要调用该对象的方法,就可以访问数据库
    2、如何写一个Mapper映射器
        a、在这个接口中的方法的方法名必须和sql语句的id一样
        b、方法中的参数类型必须和parameterType一样
        c、方法的返回值必须更resultType一样
        d、映射文件namespace必须和接口的名字一样
/*mapper映射器*/
public interface EmpDAO {
    public void save(Employee emp);    //对应映射文件中的插入sql语句  
    public List<Employee> findAll();   //对应映射文件中的查询sql语句
    public Employee findid(int id);       //对应映射文件中的查询指定条件sql语句
    public void up(Employee e);        //对应映射文件中的修改sql语句
    public void del(int i);            //对应映射文件中的删除sql语句
}


        通过SQLSession的ss.getMapper(EmpDAO.class);方法获得接口的对象,然后在调用相应的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值