您的位置:首页 > 其它

关于mybatis的xml配置方式的个人理解

2013-11-05 11:30 465 查看
学习心得:

   学习的时候忌讳墨守陈规,从头学的想法是错误的

   学习到了就要先巩固下来

   不懂的一定要弄懂,一知半解危害大

1 主配置文件 里面解析

   

<?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">
<configuration>
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
<typeAliases>
<typeAlias type="User" alias="user"/>
</typeAliases>
<environments default="development">
<!-- 配置多个数据库连接环境这里和 db.properties对应 -->
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

<mappers>
<!-- <mapper resource="UserMapper.xml"/> -->
<mapper class="UserMapper"/>
</mappers>

</configuration>
  有几个要点

  a: properties载入的话可以直接定义,也可以从properties文件读取,也可以混合,都是可以的。下面要用到

  b:typeAliases,就是别名的意思,本来可以不用写,但是后面会经常用到,所以写个别名减少了字符串的书写

  c:environments 配置了 jdbc数据库连接情况,必填

  d:mappers:这个有两种,用resource 就代表用注解的方式了

                              用class代表用配置文件xml的方式(用了类,类对应xml,xml中定义了明明空间为map类)

2 映射类

  

public interface UserMapper {

public User findUser(User user);
public User findUserById(String id);
public User findUserByIdForInt(int id);
}
   简单的定义了一个接口,在测试类里会用一个奇特的方式来调用

3 类User 是最最简单的pojo类,不做描述

4 映射配置文件

   

<?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="UserMapper" >
<resultMap type="user" id="baseUserMap" >
<id column="l_id" property="id" jdbcType="INTEGER" />
<result column="l_sex" property="sex" jdbcType="VARCHAR" />
<result column="l_name" property="name" jdbcType="VARCHAR" />
<result column="l_greade" property="grade" jdbcType="VARCHAR" />
</resultMap>

<sql id="searchUser">
<where>
<if test="id!=null">
l_id = #{id}
</if>
<if test="id == null">
l_id is null
</if>
</where>
</sql>

<select id="findUser" parameterType="user" resultMap="baseUserMap">
select * from tb_user
<include refid="searchUser"/>
order by l_grade
</select>
<select id="findUserById" parameterType="string" resultMap="baseUserMap">
select * from tb_user
where l_id = #{id}
order by l_grade
</select>
<select id="findUserByIdForInt" parameterType="int" resultMap="baseUserMap">
select * from tb_user
where l_id = #{id}
order by l_grade
</select>
</mapper>
  a:这里用了三种方式来测试查询语句,根据主类,根据String类型id,根据int类型id

  b:虽然id类本身为int类型,但是用string类型也是可以的,不报错

  c:如果用了简单类型例如string、int就不能让引用include带变量了,因为会找不到,报错,试验下就知道了

  d :resultMap 定义了User类的属性和表列名一一对应关系,起了一个id名,和对应的 User类的别名,在主配置文件定义过了

  e:命名空间要用类名,这个是用来找类名的,具体mybatis怎么处理是框架处理的,只需记得加上别名即可

  f: 定义子句

     

<sql id="searchUser">
<where>
<if test="id!=null">
l_id = #{id}
</if>
<if test="id == null">
l_id is null
</if>
</where>
</sql>
 调用方法

<include refid="searchUser"/>
5 测试语句

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SelectTest {

public static void main(String[] args) {
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream("mybiatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user2 = new User();
user2.setId(1);
User user = mapper.findUser(user2);
System.out.println(user);
System.out.println(mapper.findUserById(String.valueOf(1)));
System.out.println(mapper.findUserByIdForInt(1));
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


a: 获取字节流

b:获取sessionfactory

c:获取session

d:后去XXMap

e:调用map方法

6 获取结果:

User [id=1, name=112, grade=null, sex=333]
User [id=1, name=112, grade=null, sex=333]
User [id=1, name=112, grade=null, sex=333]


7 关于使用关联的问题,例如

import java.util.List;

public class XianUser {

private int id;
private String location;
private List<User> users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String toString() {
return "XianUser [id=" + id + ", location=" + location + ", users="
+ users + "]";
}

}


这里面多了一个 集合List<user>,所以这里在配置时要使用递归。因为XianUser和User存在了关联,所以我放在了同一个UserMapper.java和UserMapper.xml下面

但是还没确认分开是否可以,应该是可以的理论上

这里处理需要添加集合

<resultMap type="xianUser" id="xaUser">
<id column="l_id" property="id" jdbcType="INTEGER"/>
<result column="l_location" property="location" jdbcType="VARCHAR"/>
<collection property="users" ofType="user" column="l_p_id" select="findChildUserById" javaType="java.util.ArrayList"></collection>
<!--<collection property="sysDictVOList" ofType="sysDictVO" column="sd_id"  select="findSysDictTreeByCOde" javaType="java.util.ArrayList"
></collection> -->
</resultMap>
<select id="findAllUserById" resultMap="xaUser" parameterType="int">
select * from tb_xianuser where l_id = #{id}
</select>

<select id="findChildUserById" resultMap="baseUserMap" parameterType="int">
select * from tb_user where l_p_id = #{id}
</select>


注意查看集合的使用方式

8 在返回里面有可能是多个值所以

返回最好都用list的值表示

import java.util.List;

public interface UserMapper {

public User findUser(User user);
public User findUserById(String id);
public User findUserByIdForInt(int id);
public List<XianUser> findAllUserById(int id);
public List<User> findChildUserById(int id);
}


除非你确定了的确只有一个返回值存在

9 mybatis在insert时的操作

<insert id="insertUser" parameterType="User">
insert into tb_user(l_name,l_sex,l_grade) values(#{name},#{sex},#{grade});
</insert>


10 调用时要提交

mapper.insertUser(user);
session.commit();


11 更新时操作

<update id="updateUser" parameterType="user">
update tb_user
<set>
<if test="name!=null">
l_name = #{name}
</if>
</set>
<where>
l_id = #{id}
</where>
</update>


user.setId(2);
user.setName("ok");
mapper.updateUser(user);
session.commit();

12  删除示例

  <delete id="deleteUserById" parameterType="int" >

  delete from tb_user where l_id = #{id}

  </delete>

  13 有的项目配置的时候加上了这个,有时可以不用

<settings>
<!-- 全局映射器启用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查询时,关闭关联对象即时加载以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),
不会加载关联表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允许使用列标签代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 对于批量更新操作缓存SQL以提高性能 -->
<setting name="defaultExecutorType" value="BATCH" />
<!-- 数据库超过25000秒仍未响应则超时 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: