(1)SqlMapConfig.xml的配置内容和顺序如下(顺序不能乱):
Properties(属性)
Settings(全局参数设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境信息集合)
environment(单个环境信息)
transactionManager(事物)
dataSource(数据源)
mappers(映射器)
(1)全局配置properties代码:
<properties resource="jdbcInfo.properties">
<property name="jdbc.user" value="123"/>
properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url"
value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
dataSource>
environment>
environments>
(2)数据库配置文件jdbcInfo.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/mybatis
jdbc.user=root
jdbc.password=root
(3)加载的顺序:
a、先加载properties中property标签声明的属性
b、再加载properties标签引入的java配置文件中的属性
c、parameterType的值会和properties的属性值发生冲突
(1)typeAliases:对po类进行别名的定义
(2)全局配置代码:
<typeAliases>
<package name="com.san.model"/>
typeAliases>
(3)映射文件代码:(次数映射文件中的resultType就不需要使用全限定类名,直接使用别名就可以了)
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id=#{id}
select>
(1)使用相对于类路径的资源
<mapper resource=’’/>
(2)使用完全限定路径
<mapper url=’’/>
(3)使用mapper接口的全限定名
注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
<mapper class=’’/>
(4)注册指定包下的所有映射文件(推荐)
注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
<package name=’’/>
(1)问题描述:
综合查询时,可能会根据用户信息、商品信息、订单信息等作为条件进行查询,用户信息中的查询条件由;用户的名称和性别进行查询
(2)编写包装pojo
public class UserQueryvo {
//用户信息
private User user;
private List idList;
public List getIdList() {
return idList;
}
public void setIdList(List idList) {
this.idList = idList;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
(3)编写映射文件:
<select id="findUserList" parameterType="com.san.model.UserQueryvo" resultType="user">
select * from user
<where>
<include refid="whereClause">include>
where>
select>
(4)mapper接口:
public List findUserList(UserQueryvo vo);
(5)编写测试:
@Test
//查询用户列表
public void Test2() throws IOException{
String resource="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//sqlSession,它的内部含有一块数据区域,存在线程不安全,因此声明在方法内部
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMappper对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//执行查询语句
UserQueryvo vo=new UserQueryvo();
User user=new User();
user.setUsername("李四");
user.setSex("1");
vo.setUser(user);
List list=userMapper.findUserList(vo);
System.out.println(list);
//关闭资源
sqlSession.close();
}
(1)映射文件:
<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
select>
(2)测试:
Public void testFindUserByHashmap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件Hashmap对象
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("username", "管理员");
//传递Hashmap对象查询用户列表
List<User>list = userMapper.findUserByHashmap(map);
//关闭session
session.close();
}
(3)异常测试:
传递的map中的key和sql中解析的key不一致
测试结果没有报错,只是通过key获取值为空
(1)使用要求:
a、使用resultType进行结果映射时,需要查询出的列名和映射的对象的属性名一致,才能映射成功。
b、如果查询的列名和对象的属性名全部不一致,那么映射的对象为空。
c、如果查询的列名和对象的属性名有一个一致,那么映射的对象不为空,但是只有映射正确那一个属性才有值。
d、如果查询的sql的列名有别名,那么这个别名就是和属性映射的列名。
(2)映射文件:
<select id="findUserCount" parameterType="com.san.model.UserQueryvo" resultType="int">
select count(*) from user
<where>
<include refid="whereClause">include>
where>
select>
(1)使用要求:
使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。但是需要声明一个resultMap,来对列名和属性名进行映射。
(2)映射文件:
<resultMap type="user" id="UserResMap">
<id column="id_" property="id"/>
<result column="username_" property="username"/>
<result column="sex_" property="sex"/>
resultMap>
<select id="findUserRstMap" parameterType="int" resultMap="UserResMap">
select id id_,username username_,sex sex_ from user where id=#{id}
select>
(1)概述:
在mybatis中,它提供了一些动态sql标签,可以让程序员更快的进行mybatis的开发,这些动态sql可以通过sql的可重用性。
(2)常用的动态sql标签:
if标签、where标签、sql片段、foreach标签
(3)映射文件(总的映射文件):
<mapper namespace="com.san.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id=#{id}
select>
<sql id="whereClause">
<if test="user!=null">
<if test="user.username!=null and user.username!=''">
and username like '%${user.username}%'
if>
<if test="user.sex!=null and user.sex!=''">
and sex=#{user.sex}
if>
if>
<if test="idList!=null">
and id in
<foreach collection="idList" item="id" open="(" close=")" separator=",">
#{id}
foreach>
if>
sql>
<select id="findUserList" parameterType="com.san.model.UserQueryvo" resultType="user">
select * from user
<where>
<include refid="whereClause">include>
where>
select>
<select id="findUserCount" parameterType="com.san.model.UserQueryvo" resultType="int">
select count(*) from user
<where>
<include refid="whereClause">include>
where>
select>
<resultMap type="user" id="UserResMap">
<id column="id_" property="id"/>
<result column="username_" property="username"/>
<result column="sex_" property="sex"/>
resultMap>
<select id="findUserRstMap" parameterType="int" resultMap="UserResMap">
select id id_,username username_,sex sex_ from user where id=#{id}
select>
mapper>