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

学习心得:

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

   学习到了就要先巩固下来

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


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>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静山晚风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值