关于mybatis的xml配置方式的个人理解
2013-11-05 11:30
465 查看
学习心得:
学习的时候忌讳墨守陈规,从头学的想法是错误的
学习到了就要先巩固下来
不懂的一定要弄懂,一知半解危害大
1 主配置文件 里面解析
a: properties载入的话可以直接定义,也可以从properties文件读取,也可以混合,都是可以的。下面要用到
b:typeAliases,就是别名的意思,本来可以不用写,但是后面会经常用到,所以写个别名减少了字符串的书写
c:environments 配置了 jdbc数据库连接情况,必填
d:mappers:这个有两种,用resource 就代表用注解的方式了
用class代表用配置文件xml的方式(用了类,类对应xml,xml中定义了明明空间为map类)
2 映射类
3 类User 是最最简单的pojo类,不做描述
4 映射配置文件
b:虽然id类本身为int类型,但是用string类型也是可以的,不报错
c:如果用了简单类型例如string、int就不能让引用include带变量了,因为会找不到,报错,试验下就知道了
d :resultMap 定义了User类的属性和表列名一一对应关系,起了一个id名,和对应的 User类的别名,在主配置文件定义过了
e:命名空间要用类名,这个是用来找类名的,具体mybatis怎么处理是框架处理的,只需记得加上别名即可
f: 定义子句
a: 获取字节流
b:获取sessionfactory
c:获取session
d:后去XXMap
e:调用map方法
6 获取结果:
7 关于使用关联的问题,例如
这里面多了一个 集合List<user>,所以这里在配置时要使用递归。因为XianUser和User存在了关联,所以我放在了同一个UserMapper.java和UserMapper.xml下面
但是还没确认分开是否可以,应该是可以的理论上
这里处理需要添加集合
注意查看集合的使用方式
8 在返回里面有可能是多个值所以
返回最好都用list的值表示
除非你确定了的确只有一个返回值存在
9 mybatis在insert时的操作
10 调用时要提交
11 更新时操作
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>
学习的时候忌讳墨守陈规,从头学的想法是错误的
学习到了就要先巩固下来
不懂的一定要弄懂,一知半解危害大
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>
相关文章推荐
- 关于mybatis两种连接mysql的方式(注解和xml配置)
- 关于XML配置使用的个人感觉
- MyBatis mapper.xml配置一对一关系映射的几种方式整理
- Mybatis中SqlMapConfig.xml的mapper映射器的三种配置方式
- Mybatis学习(3)关于mybatis全局配置文件SqlMapConfig.xml
- 关于Mybatis的XML配置文件的namespace元素的作用。
- 关于MyBatis的配置文件SqlMapConfig.xml的标签说明
- mybatis 解析配置文件(一)之XML的DOM解析方式
- Mybatis SQL语句的两种映射方式 mapper的xml配置和接口两种方式
- 关于springmvc3的web.xml 配置方式归纳
- 关于web.xml配置中的classpath的理解
- 关于Spring框架在web.xml中配置编码时配置的<param-name>forceEncoding</param-name>理解
- Mybatis 通过配置文件generatorConfig.xml生成文件--Maven插件运行方式
- mybatis mapper.xml路径配置方式
- MyBatis mapper.xml配置一对多的两种方式
- Springboot 中同时使用mybatis注解和springbean-xml配置方式
- 关于Linux图形和字符界面切换方式和startx的个人理解
- 关于SpringAOP的XML方式的配置
- 关于XML配置使用的个人感觉
- 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)