• 学习Mybatis中的约定大于配置、数据库配置优化、定义别名、类型处理器、resultMap和parameterType


      一、在昨天的基础上,在测试类中

     SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    		 SqlSession session = sessionFactory.openSession();
    		 String statement="org.ruangong.mapper.personMapper.queryall";
    		 List<Person> list = session.selectList(statement);
    

      替换为:

     SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    		 SqlSession session = sessionFactory.openSession();
    		 personMapper personmapper = session.getMapper(personMapper.class);
    		 Person person = personmapper.queryPersonById(1);
    

      这种优化叫做:约定大于配置。

    定义接口 personMapper:这个接口名称对应personMapper.xml的前缀,因为这样才能映射到这个xml文件上。

    public interface personMapper {
    	Person queryPersonById(int id);
    	void add(Person person);
    	
    }
    

      定义函数名就是对应personMapper.xml文件中每一条数据库操作语句对应的id值,这样通过接口才能映射到xml中的每一个语句。

     然后在测试类中:

     personMapper personmapper = session.getMapper(personMapper.class);
    Person person = personmapper.queryPersonById(1);
    personmapper.add(person);
    

      进行数据库操作,不用再去写statement了。

    二、其次创建普通文件命名为:db.properties,为了将数据库配置进行优化。

     在conf.xml文件中:<configuration>标签下添加标签:<properties resource="db.properties"/>

    然后将数据库配置信息的value值全部换为"${key}",key值为对应前面的name值。

     三、为了命名方便,方便编码,将配置文件中比较长的名可以设置别名。例如将personMapper.xml中的resultType的“org.ruangong.entity.Person”设置为“person”。

    打开conf.xml文件,在<configuretion>标签下添加标签:<settings></settings>

    <!-- 设置单个别名 -->
    	<typeAliases>
    		<typeAlias type="org.ruangong.entity.Person" alias="person"/>
    	</typeAliases>
    

      不区分大小写,就是说虽然设置为person,在resultType=“PerSoN”,依然可以。

    四、Mybatis自带类型处理器

    创建转换器需要实现接口

    创建类,继承BaseTypehanlder:

    public Object getNullableResult(ResultSet arg0, String arg1) throws SQLException {
    		// TODO Auto-generated method stub
    		return null;
    	}//数据库-java
    public void setNonNullParameter(PreparedStatement arg0, int arg1, Object arg2, JdbcType arg3) throws SQLException {
    		// TODO Auto-generated method stub
    		
    	}//JAVA-数据库
    

      t约定:java中为true为男性,false为女性,对应数据库为1和0,在数据库中新增sex列默认值为0。

    在personMapper.xml中添加数据库操作:

    <!-- 使用转换器 -->
    	  <select id="queryone_converter" resultMap="personResult" parameterType="int">
    	  	select * from person where id = #{id}
    	  </select>
    	  <resultMap type="person" id="personResult">
    	  	<id property="id" column="id"/>
    	  	<result property="name" column="name"/>
    	  	<result property="age" column="age"/>
    	  	<result property="persex" column="sex" javaType="boolean" jdbcType="INTEGER"/>
    	  </resultMap>
    

      在select标签中,如果返回值与java实体类定义的数据类型不相同,返回值写成“resultMap”,然后在下面添加标签<resultMap>

    在定义接口中定义方法Person queryone_converter(int id);

    在测试类中测试。

     以上是数据库->java中转换的操作:

    一下是java->数据库,修改数据库的操作:

    若要添加一个人的信息,在java中输入信息:id=3,name="靳--",age=21,sex=true,到数据库中则是id=3,name="靳--",age=21,sex=1

    在personMapper.xml中添加数据库操作。

    <insert id="addone_converter" parameterType="person">
    	  insert into person(id,name,age,sex) value(#{id},#{name},#{age},#{persex,javaType=boolean,jdbcType=INTEGER})
    	  </insert>
    

      此时没有返回值不需要写resultMap,只是在数据库语句中添加转换就行。#{persex,javaType=boolean,jdbcType=INTEGER})

    resultMap可以实现两个功能:

    1、类型转换

    2、属性和字段的映射关系

    当需要对类和表进行映射关系时使用resultMap。

    五、parameterType;

    #{key}会给key值加上单引号'',可以防止sql注入

    ${key}原样输出key

  • 相关阅读:
    《牛客IOI周赛17提高组A》
    《Codeforces Round #645 (Div. 2)》
    《AtCoder Beginner Contest 168 E》思路详解
    《东华大学2020年程序设计竞赛题解》
    《牛客直播课习题1》
    《Codeforces Round #643 (Div. 2)》
    《TOJ5945》区间覆盖问题。
    解决方案、项目、程序集、命名空间
    SQL存储过程前面后面的几句代码是什么意思?
    无法将类型为“IList”的对象强制转换为类型“System.Data.DataRowView” 。的解决方法
  • 原文地址:https://www.cnblogs.com/jccjcc/p/13959829.html
Copyright © 2020-2023  润新知