/** * 模拟一个实例工厂,创建业务层实现类 * 此工厂创建对象,必须现有工厂实例对象,再调用方法 */ public class InstanceFactory { public static AccountService createAccountService(){ return new AccountServiceImpl(); } }
public class staticFactory { public static AccountService createAccountService(){ return new AccountServiceImpl(); } } <!-- 此种方式是: 使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器 id 属性:指定 bean 的 id,用于从容器中获取 class 属性:指定静态工厂的全限定类名 factory-method 属性:指定生产对象的静态方法 --> <beanid="accountService"class="cn.hxx.factory.staticFactory"factory-method="createAccountService"></bean>
publicinterfaceUserDao{ /*查询所有用户*/ @Select("select * from user") List<User> findAll(); @Select("select * from user where id = #{id}") User findById(Integer id);
@Insert("insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday})") voidsaveUser(User user);
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id = #{id}") voidupdateUser(User user);
@Delete("delete from user where id = #{id}") voiddeleteById(Integer id);
@Select("select * from user where username like #{name}") List<User>findUserByName(String name);
@Select("select count(*) from user") intfindTotal(); }
<!--定义封装的user1类--> <resultMapid="userAccountsMap"type="user1"> <idcolumn="id"property="id"></id> <resultcolumn="username"property="username"></result> <resultcolumn="sex"property="sex"></result> <resultcolumn="address"property="address"></result> <resultcolumn="birthday"property="birthday"></result> <!--配置user对象中accounts集合的映射--> <!--property写user类所包含的列表集合属性,ofType该列表中成员所属的类--> <collectionproperty="accounts"ofType="Account1"> <idcolumn="aid"property="id"></id> <resultproperty="uid"column="uid"></result> <resultproperty="money"column="money"></result> </collection> </resultMap> <!--该用户可能没有账户,所以要user表左连接account表--> <selectid="findAllAccountsOfUser"resultMap="userAccountsMap"> select u.*,a.id as aid,a.MONEY from user u LEFT JOIN account a on u.id = a.uid; </select>
<selectid="findUserRole"resultMap="UserRolesMap"> select u.*,r.id as rid,r.role_name,r.role_desc from user u left outer join user_role ur on u.id = ur.uid left outer join role r on r.id = ur.rid </select>
<selectid="findRoleUser"resultMap="RoleUsersMap"> select role.id as rid,role.role_name,role.role_desc,user.* from role LEFT OUTER JOIN user_role on role.id = user_role.rid LEFT outer JOIN user on user.id = user_role.uid </select>
我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
If标签
根据条件查询,比如可以根据姓名查询,可以根据ID查询,也可以结合两个一起查询
持久层Dao接口
1
List<User> findByCondition(User user);
持久层Dao映射配置
注意:if标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。比如包装类VoUser类中有一个属性user,如果参数是VoUser的话,就要使用user.username表达式。
关于大小写的问题:如果SQL语句上的内容就不区分大小写,比如select * from user where 1 = 1 、 and username like、and address like 但是涉及到Java中的类的属性就要严格区分大小大写,比如下面的test属性里面的内容:username和address,还有#{username},#{address} 要严格对应User类中的属性如:getUsername对应username
1 2 3 4 5 6 7 8 9
<selectid="findByCondition"parameterType="user"resultType="user"> select * from user where 1 = 1 <iftest="username!=null and username!=''"> and username like #{username} </if> <iftest="address!=null"> and address like #{address} </if> </select>
3.测试
1 2 3 4 5 6 7 8 9 10 11
/*测试findByCondition*/ @Test publicvoidtest7(){ User user = new User(); //user.setUsername("韩晓璇"); user.setAddress("陕西西安"); List<User> userList = mapper.findByCondition(user); for (User u : userList) { System.out.println(u); } }
where标签
在多条件查询时,不需要使用where 1 = 1
1 2 3 4 5 6 7 8 9 10 11
<selectid="findByCondition"parameterType="user"resultType="user"> select * from user <where> <iftest="username!=null and username!=''"> and username like #{username} </if> <iftest="address!=null"> and address like #{address} </if> </where> </select>
foreach标签
SQL 语句:select 字段 from user where id in (?)
foreach标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写 #{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
需求:根据ID集合查询
持久层Dao接口
1
List<User> findByIds(queryVo vo);
持久层Dao映射配置
1 2 3 4 5 6 7 8 9 10
<selectid="findByIds"parameterType="queryVo"resultType="user"> select * from user <where> <iftest="ids!=null and ids.size()>0"> <foreachcollection="ids"open="and id in ("close=")"item="uid"separator=","> #{uid} </foreach> </if> </where> </select>
测试
1 2 3 4 5 6 7 8 9 10 11 12
@Test publicvoidtest8(){ queryVo Vo = new queryVo(); List<Integer> ids = new ArrayList<>(); ids.add(41); ids.add(42); Vo.setIds(ids); List<User> userList = mapper.findByIds(Vo); for (User u : userList) { System.out.println(u); } }
抽取重复的SQL语句
1 2 3 4 5
<sqlid="defaultSql"> select * from user </sql> <!--配置查询所有,id是UserDao的方法名--> <selectid="findAll"resultType="cn.hxx.domain.User"> <includerefid="defaultSql"></include> </select>