XML配置开发
sql映射(sql mapper) 可以把数据库表中的一行数据 映射为 一个Java对象
在当前文件中,可以使用特定的标签,表示数据库的特定操作
- :表示执行查询 放的是select语句
- :表示更新数据库的操作 放的是update语句
- :表示插入 放的是insert语句
- :表示删除,放的是delete语句
xml配置开的主配置文件: 注解开发就是 class=“xxx”
<mappers>
<mapper resource="cn/com/dao/IUserDao.xml"/>
</mappers>
<select id="findAll" resultType="cn.Ycy.com.mybatis.dao.userDao">
select * from user;
</select>
- id:是要执行的sql语法的唯一标识, mybatis会使用这个id的值来找到要执行的sql语句,可以自定义,id的值类似实现接口中的方法名
- resultType:表示结果类型的,是sql语句执行后的得到的ResultSet,遍历这个ResultSet得到的Java对象类型。就是保存这个对象的全限定名称 ,对应着一般实现implement的执行sql后的返回类型resultType
代码展示:
//在接口中
List<user>selectAll4(Integer min, Integer max);
//在mapper文件:
<select id="selectAll4" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id between #{0} and #{1};
</select>
//在测试类中:
@Test
public void testSelectAll4(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
userDao user = sqlSession.getMapper(userDao.class);
List<user> userList = user.selectAll2(50,100);
for(user users: userList){
System.out.println(users);
}
sqlSession.close();
}
xml配置开发的动态SQL
定义:sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化。
动态sql的实现:使用的是mybatis提供的标签 < if > < where > < foreach >
- < if >是判断条件的
语法: < if test=“判断Java对象的属性值”>
部分sql语句
< /if>
代码演示:
接口中:
//动态sql if的使用
List<user>selectIf(user user);
mapper中:
<select id="selectIf" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user
where
<if test="username !=null and username !=''">
username=#{username}
</if>
<if test=" id > 10">
or id > #{id}
</if>
</select>
测试类中:
@Test
public void testIf(){
userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
user user1 = new user();
user1.setUsername("王武");
user1.setId(11);
List<user> u = users.selectIf(user1);
for(user user: u){
System.out.println(user);
}
}
代码分析:
当我们的第一个if不符合要求时,sql语句就是
select * from user where or id > 11;就会出现错误
解决方法:
解决方法:
<select id="selectIf" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user
where 1 > 0
<if test="username !=null and username !=''">
and username=#{username}
</if>
<if test=" id > 10">
or id > #{id}
</if>
</select>
加上恒成立的条件
- < where > 用来包含多个 当多个if有一个成立,会自动增加一个where关键字并去掉 if中多余的 and or等
代码如下:
接口中:
//where 的使用
List<user>selectWhere(user user);
mapper中:
<!-- where的使用 -->
<select id="selectWhere" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user
<where>
<if test="username !=null and username != ''">
username=#{username}
</if>
<if test="id > 20">
or id > #{id}
</if>
</where>
</select>
测试类中:
//测试where
@Test
public void testWhere(){
userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
user user1 = new user();
// user1.setUsername("王武");
user1.setId(21);
List<user> u = users.selectWhere(user1);
for(user user: u){
System.out.println(user);
}
}
- < foreach > 循环java中的数组、List集合的,主要在sql的in语句中
学生的id 是1000 1001 1002 的三个学生
select * from user id in(1000,1001,1002);
< foreach collection=“list” item=“mylist” open="(" close=")" separator=",">
#{mylist}
< /foreach >
collection:表示接口的方法参数的类型,如果是数组就是用array,如果是list集合就使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
接口中:
//foreach 的用法1
List<user>selectForeach(List<Integer>list);
mapper中:
<select id="selectForeach" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id in
<foreach collection="list" item="mylist" open="(" close=")" separator=",">
#{mylist}
</foreach>
</select>
测试类中:
//foreach的用法1的测试
@Test
public void testForeach1(){
userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
List<Integer>list = new ArrayList<>();
list.add(29);
list.add(30);
list.add(31);
list.add(32);
List<user> u = users.selectForeach(list);
for(user user: u){
System.out.println(user);
}
}