学习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

posted @ 2020-11-11 17:38  Double晨  阅读(271)  评论(0编辑  收藏  举报