一、在昨天的基础上,在测试类中
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