本文共 7477 字,大约阅读时间需要 24 分钟。
文件目录
本质:就是实现sql语言的动态拼接
下面让我们来解析一下这四个函数吧
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=UTF-8&useUnicode=trueusername=rootpassword=981216
package com.qin.pojo;public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; }}
package com.qin.utils;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;public class MybatisUtils { public static SqlSessionFactory sqlSessionFactory; //使用静态方法,是为了能够在类加载时,跟着一起启动 static{ try { String resource = "mybatis-config.xml"; InputStream inputStream = null; inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //以后想要使用sqlSession,只需要调用这个类的这个方法即可 public SqlSession getSqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; }}
package com.qin.mapper;import com.qin.pojo.User;import java.util.List;import java.util.Map;public interface DynamicUserMapper { //输入id就查询指定用户,不输入id就查询全部用户 ListqueryDynamicUser(Map map);}
我们来理解一下,当test里面的id不为空时sql语句怎么写,为空时怎么写的
显而易见我们把后面的 and id 在不同输入情况下,把他拼接了
package com.qin.mapper;import com.qin.pojo.User;import com.qin.utils.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import java.util.HashMap;import java.util.List;public class DynamicUserMapperTest { @Test public void queryDynamicUserTest(){ SqlSession sqlSession = new MybatisUtils().getSqlSession(); DynamicUserMapper mapper = sqlSession.getMapper(DynamicUserMapper.class); //new 一个HashMap,实现传参 HashMap map = new HashMap(); map.put("id","1"); //当我们把这句代码注释掉,输入为空,查询所有用户,当我们不注释掉查找id为1的用户,就是这样实现了sql的动态拼接 ListuserList = mapper.queryDynamicUser(map); for (User user : userList) { System.out.println(user); } sqlSession.close(); }}
package com.qin.mapper;import com.qin.pojo.User;import java.util.List;import java.util.Map;public interface DynamicUserMapper { //不同的输入条件,实现不同的查询 ListqueryChooseUser(Map map);}
package com.qin.mapper;import com.qin.pojo.User;import com.qin.utils.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import java.util.HashMap;import java.util.List;public class DynamicUserMapperTest { @Test public void queryDynamicUserTest(){ SqlSession sqlSession = new MybatisUtils().getSqlSession(); DynamicUserMapper mapper = sqlSession.getMapper(DynamicUserMapper.class); HashMap map = new HashMap(); //当把这两行注释掉,查询全部用 //当把id注释掉,查询名字为秦刚的信息 //当把name注释掉,查询id为1 的信息 //当id 和 name 都不注释掉,查询id,先到先得,switch case map.put("id",1); map.put("name","秦刚"); ListuserList = mapper.queryChooseUser(map); for (User user : userList) { System.out.println(user); } sqlSession.close(); }}
这里我们借鉴mybatis官方文档的例子
where标签会自动帮我们把and加上或者不加上,会自动帮我们把where加上或者不加上
update Author where id=#{id} username=#{username}, password=#{password}, email=#{email}, bio=#{bio}
set 标签解决了哪些问题呢?
先写一个sql给大家看看
select * from blog where (id = 1 or id =2 or id =3)这句sql的意思是我要查询blog表的 id 为 1 或者为2 再或者为3 的blog的信息
但是我们怎么在xml文件中写呢!!似乎不太好写,foreach替我们解决了//查询第一二三号的记录的博客 ListqueryBlogForeach(Map map);
### 编写测试类(重要)
@Test public void queryBlogForeach(){ SqlSession sqlSession = new MybatisUtils().getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); HashMap map = new HashMap(); //因为是集合所以要用数组 ArrayListids = new ArrayList<>(); ids.add(1); //当着两行被注释掉查询所有博客 ids.add(2); //不注释掉查询id为1和2的博客 map.put("ids",ids); //"ids" 对应xml文件的collection的ids 第二个ids 指的是上面ArrayList的ids 也就是传递的参数 List blogs = mapper.queryBlogForeach(map); for (Blog blog : blogs) { System.out.println(blog); } sqlSession.close(); }
转载地址:http://mhnki.baihongyu.com/