传入POJO对象
QueryVo.java
public class QueryVo implements Serializable{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
SQL映射文件
<!-- 传入POJO对象,查询用户 --> <select id="findUserByPOJO" parameterType="QueryVo" resultType="User"> select * from user where id = #{user.id} </select>
测试类
@Test public void func9() throws IOException { // 1.加载配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- // 4.SqlSEssion帮我生成一个实现类(给接口的字节码文件) UserDao mapper = sqlSession.getMapper(UserDao.class); // 创建一个POJO对象 QueryVo vo = new QueryVo(); User u = new User(); u.setId(2); vo.setUser(u); User userByPOJO = mapper.findUserByPOJO(vo); System.out.println(userByPOJO); // ------------------------------------------- }
resultMap(手动指定字段)
数据库表
Order实体文件
public class Order { // 订单id private int id; // 用户id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; get/set。。。 }
SQL映射文件
由于实体和SQL中的userid字段不同,所以要使用resultMap
<resultMap id="jzy" type="Order"> <result column="user_id" property="userId" /> </resultMap> <select id="findOrderById" parameterType="int" resultMap="jzy"> select * from `order` where id = #{id} -- order是关键字,所以要用``包起来 </select>
OrderDao.java
public interface OrderDao { Order findOrderById(int i); }
测试类
public void func() throws IOException { // 1.加载配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- // 4.执行相应的SQL语句 OrderDao mapper = sqlSession.getMapper(OrderDao.class); Order orderById = mapper.findOrderById(1); System.out.println(orderById); // ------------------------------------------- }
一.动态SQL
1)if标签&&where标签
<!-- 根据性别和名字查询用户 where 可以去掉第一个前ANd --> <select id="selectUserBySexAndUsername" parameterType="User" resultType="User"> <where> <if test="sex != null and sex != ‘‘"> and sex = #{sex} </if> <if test="username != null and username != ‘‘"> and username = #{username} </if> </where> </select>
2)foreach标签
a.直接传入数组
UserDao.java
public interface UserDao { List<User> selectUserByIds(int[] ids); }
配置文件
<!-- 多个ID select * from user where id in (1,2,3)--> <select id="selectUserByIds" parameterType="int[]" resultType="User"> <include refid="selector"/> <where> <!--只要是传入的数组,collection就是"array"--> <foreach collection="array" item="id" separator="," open="id in (" close=")"> #{id} </foreach> </where> </select>
测试类
@Test public void func3() throws IOException { // 1.加载配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- // 方法一:直接传入一个数组 int[] ids = {1,2,3}; UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> list = mapper.selectUserByIds(ids); System.out.println(list); // ------------------------------------------- }
b.直接传入集合
<!-- 多个ID select * from user where id in (1,2,3)--> <select id="selectUserByIds" parameterType="Integer" resultType="User"> <include refid="selector"/> <where> <!--只要是传入的集合,collection就是"list"--> <foreach collection="list" item="id" separator="," open="id in (" close=")"> #{id} </foreach> </where> </select>
测试类
// 方法二:直接传入一个集合 List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> list = mapper.selectUserByIds(ids); System.out.println(list);
c.传入一个POJO,里面有集合或者数组
<!-- 多个ID select * from user where id in (1,2,3)--> <select id="selectUserByIds" parameterType="QueryVo" resultType="User"> <include refid="selector"/> <where> <foreach collection="ids" item="id" separator="," open="id in (" close=")"> #{id} </foreach> </where> </select>
测试类
// 方法三:传入一个POJO //List<Integer> ids = new ArrayList<>(); // //ids.add(1); //ids.add(2); //ids.add(3); int[] ids = {1,2,3}; QueryVo vo = new QueryVo(); vo.setIds(ids); UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> list = mapper.selectUserByIds(vo); System.out.println(list);
二.关联查询
1、一对一查询
1)在Order中添加一个user字段并提供get,set方法
2)书写接口
List<Order> findOrderList();
3)书写配置文件
<resultMap id="jbb" type="Order"> <id column="id" property="id"/> <result column="user_id" property="userId" /> <result column="number" property="number" /> <!-- 一对一配置 --> <association property="user" javaType="User"> <id column="user_id" property="id" /> <result column="username" property="username"/> </association> </resultMap> <select id="findOrderList" resultMap="jbb"> select o.id,o.user_id,o.number,o.createtime,u.username from `order` o left join user u on o.user_id=u.id </select>
4)测试类
public void func4() throws IOException { // 1.加载配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- OrderDao mapper = sqlSession.getMapper(OrderDao.class); List<Order> orderList = mapper.findOrderList(); System.out.println(orderList); // ------------------------------------------- }
2、一对多查询
1)在User中添加一个集合,保存Order对象
2)书写接口
List<User> findUserAllOrder();
3)SQL映射文件
<resultMap id="jjj" type="User"> <id column="user_id" property="id"/> <result column="username" property="username"/> <!-- 一对多 --> <collection property="orderList" ofType="Order"> <id column="id" property="id"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="user_id" property="userId"/> </collection> </resultMap> <select id="findUserAllOrder" resultMap="jjj"> select o.id,o.user_id,o.number,o.createtime,u.username from user u left join `order` o on o.user_id=u.id </select>
测试类
@Test public void func5() throws IOException { // 1.加载配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- OrderDao mapper = sqlSession.getMapper(OrderDao.class); List<User> userAllOrderList = mapper.findUserAllOrder(); System.out.println(userAllOrderList); // ------------------------------------------- }