mybatis的学习[2]

写在前面:

1. 为什么要使用Mapper接口开发?
  1. 在测试用例中,在调用session的方法的时候,都会传入要调用的SQL的namespace+id名称,这不是必须的。可以只传入id即可。但是,如果在mybatis的环境中有多个相同id的映射名称,就会报错。所以,一般情况下,调用方法最好还是使用namespace+id。
  2. 但是,namespace+id的使用方式很容易报错,因为是string类型的,没有检查。所以,mybatis提供了一种非常好的设计方式来避免这种问题,即Mapper接口。

2. 接口开发的规范:namespace的值=接口的包名+接口的类名

注意:

1、 包名 + 类名 = XXXMapper.xml中namespace的值

2、 接口中方法名 = mapper.xml中 具体的SQL语句定义的id值

3、 方法的返回值和参数要和映射文件中一致(当数据库的字段名和对象的属性名一致时,可以用简单属性resultType。但是当数据库中的字段名称和对象中的属性名称不一致时,就需要resultMap属性。)


Mapper接口开发需要遵循以下规范:
3. Mapper.xml文件中的namespace与mapper接口的路径相同
4. Mapper接口的方法名和配置文件中定义的每个mapper statement的id相同
5. Mapper接口方法的输入参数和Maooer.xml中定义的每个SQL的parameterType的类型相同
6. Mapper接口方法的输出类型和配置文件中定义的每个SQL的resultType的类型相同
7. 建议映射文件名:‘表名称+Mapper’ 结尾;接口名称:“表名称+Mapper” 作为接口名


3. Mapper接口开发DAO

  • 遇到的错误
    org.apache.ibatis.exceptions.PersistenceException:
    Error building SqlSession.
    Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance.
    Cause: org.xml.sax.SAXParseException; lineNumber: 36; columnNumber: 17;
    元素类型为 “configuration” 的内容必须匹配 “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”。

  • 错误原因:mybatis的配置文件显然是有顺序并且个数是有限定的,‘?’表示可以没有但是最多只能有一个

  • 错误写法:

 <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="EmpMapper.xml"/>
    </mappers>
    s_emp表的映射文件
    <mappers>
        <mapper resource="s_EmpMapper.xml"/>
    </mappers>
  • 正确写法:
 <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="EmpMapper.xml"/>
        <mapper resource="s_EmpMapper.xml"/>
    </mappers>

4. MAPPER接口开发DAO步骤:

第一步:确定业务需求
  1. 实现根据用户ID查询用户的信息
  2. 添加用户信息
第二步:创建dao接口
package cn.itlaobing.mybatis.dao;

import cn.itlaobing.mybatis.entity.Emp;

public interface UserInfoDao {
    //根据主键ID查询用户
    public Emp findByUserId(int id) throws  Exception;
    //添加用户
    public void insertUserInfo(Emp emp) throws  Exception;
}
第三步:创建dao的实现类
package cn.itlaobing.mybatis.dao.impl;

import cn.itlaobing.mybatis.dao.UserInfoDao;
import cn.itlaobing.mybatis.entity.Emp;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class EmpInfoImpl implements UserInfoDao {

    //定义回话工厂该对象从外部通过构造函数注入
    private SqlSessionFactory sqlSessionFactory;
    public  EmpInfoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    //根据ID查询用户信息
    @Override
    public Emp findByUserId(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Emp emp = sqlSession.selectOne("EmpMapper.selectOne",id);
        System.out.println(emp);

        sqlSession.commit();
        sqlSession.close();
        return emp;
    }

    @Override
    public void insertUserInfo(Emp emp) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("EmpMapper.addUserinfo",emp);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }
}

第三步:单元测试
  • 这里只给出一部分代码

    @Test
    public void findById()  throws Exception{

        UserInfoDao userInfoDao = new EmpInfoImpl(sqlSessionFactory);
        Emp emp = userInfoDao.findByUserId(7499);
        System.out.println(emp);
        //调用工具类的格式化日期的方法
        DateFormateUtil dateFormat1 = new DateFormateUtil();
        String strDate = dateFormat1.dateFormatStr(emp.getHiredate());
        System.out.println(strDate);

    }
    //---Mapper接口开发Dao方法
    @Test
    public void   findUserInfoById()  throws Exception{

        S_EmpMapper s_empMapper = new S_empImpl(sqlSessionFactory);
       S_emp s_emp = s_empMapper.findUserInfoById(1);
        System.out.println(s_emp);
    } 。。。。
5. 最后给出mybatis的配置文件和mapper.xml以及jdbc的配置文件
  • mybatis-config.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">
<!--mybatis配置-->
<configuration>
    <!--读取数据库配置信息-->
    <properties resource="jdbc.properties"></properties>
    <settings>
        <!-- 要使延迟加载生效必须配置下面两个属性 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--禁用二级缓存-->
        <setting name="cacheEnabled" value="false"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <!--由mybatis管理jdbc 事务管理-->
            <transactionManager type="JDBC"/>
            <!--由mybatis管理 管理数据库连接池-->
            <dataSource type="POOLED">
                <!--第一种配置-->
                <!--<property name="driver" value="oracle.jdbc.OracleDriver"/>-->
                <!--<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>-->
                <!--<property name="username" value="itlaobing"/>-->
                <!--<property name="password" value="itlaobing"/>-->
                <!--第二种配置-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>

            </dataSource>

        </environment>

    </environments>
    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="EmpMapper.xml"/>
        <mapper resource="s_EmpMapper.xml"/>
    </mappers>
</configuration>
  • Mapper.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">
<mapper namespace="EmpMapper">
    <select id="selectOne" resultType="cn.itlaobing.mybatis.entity.Emp">
    select * from emp where empno = #{id}
  </select>

    <!--查询所有数据-->
    <select id="findAllUser" resultType="cn.itlaobing.mybatis.entity.Emp" >
        select * from emp
    </select>
    <!--模糊查询-->
    <select id="findUserinfoByName" parameterType="java.lang.String" resultType="cn.itlaobing.mybatis.entity.Emp">
        select * from emp where ename like '%${value}%'
    </select>

    <!--添加用户-->
    <insert id="addUserinfo" parameterType="cn.itlaobing.mybatis.entity.Emp">
        insert into emp(empno,ename,job,mgr,sal,comm,deptno)
        values(#{empno},#{ename},#{job},#{mgr},#{sal},#{comm},#{deptno})
    </insert>

    <!--删除用户-->
    <insert id="deleteOne" parameterType="java.lang.Integer">
        delete from emp where empno=#{id}
    </insert>
</mapper>
  • jdbc.properties
#jdbc.connection.mysql.driver = com.mysql.jdbc.Driver
#jdbc.connection.mysql.url = jdbc:mysql://localhost:3306/yyq?useUnicode=true&characterEncoding=utf8&useSSL=false
#jdbc.connection.mysql.username = root
#jdbc.connection.mysql.password =

jdbc.driver = oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username = itlaobing
jdbc.password = itlaobing
6. 生成mapper动态代理对象,调用mapper.xml里面的方法
  • mapper.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">
		<mapper namespace="cn.itlaobing.databaseResource.mapper.EmpMapper">
		    <insert id="addOne" parameterType="cn.itlaobing.databaseResource.entity.Emp">
		         insert into emp(empno,ename) values(#{empno},#{ename})
		    </insert>
		</mapper>
  • addOne()方法测试
		Emp emp = new Emp();
		
		//读取mybatis的配置文件
		String resource = "mybatis.xml";
		InputStream ins = EMpTest.class.getClassLoader().getResourceAsStream(resource);
  
		//获取会话工厂
		SqlSessionFactory sqlfactory = new SqlSessionFactoryBuilder().build(ins);
		//获取SQLsession会话对象
		SqlSession session = sqlfactory.openSession();
		//生成mapper动态代理对象
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		
		emp.setEmpno(6666);
		emp.setEname("杨乐乐");
		
		mapper.addOne(emp);
		System.out.println(emp);

		session.commit();
		session.close();
7. mybatis配置详解
8. 动态SQL
9. 关联查询和缓存
10. 逆向工程

下次再说
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值