文章目录
Mybatis_resultType&&resultMap属性
-
resultType属性:如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中
-
resultMap属性:如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中
-
编写UserMapper接口
/** * 查询User表中所有用户的方法 * */ public List<User> findAllResultMap();
-
编写UserMapper.xml
<!--id : 标签的唯一标识--> <!--type: 封装后实体类型--> <resultMap id="userResultMap" type="com.code.entity.User"> <!--手动配置映射关系--> <!--id: 用来配置主键--> <id property="id" column="id"></id> <!-- result: 表中普通字段的封装--> <result property="username" column="username"></result> <result property="birthday" column="birthday"></result> <result property="sex" column="sex"></result> <result property="address" column="address"></result> </resultMap> <!--查询所有用户--> <!--resultMap:手动配置实体属性与表中字段的映射关系,完成手动封装--> <select id="findAllResultMap" resultMap="userResultMap"> select * from user </select>
-
编写测试代码
/** * ResutlMap 手动封装属性测试方法 * @throws IOException */ @Test public void findAllResultMap() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> allResultMap = mapper.findAllResultMap(); for (User user : allResultMap) { System.out.println(user); } sqlSession.close(); }
Mybatis多条件查询方式一
根据id和username查询user表
方式一:使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数
-
编写 userMapper接口
/** * 多条件连接查询方式一 * */ public List<User> findByIdAndUsername1(int id, String username);
-
编写 UserMapper.xml
<!--多条件查询:方式一--> <select id="findByIdAndUsername1" resultMap="userResultMap" > <!-- select * from user where id = #{arg0} and username = #{arg1}--> select * from user where id = #{param1} and username = #{param2} </select>
-
编写测试代码
/** * 多条件查询方式一 */ @Test public void findByIdAndUsername1() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.findByIdAndUsername1(1, "子慕"); for (User user : users) { System.out.println(user); } sqlSession.close(); }
Mybatis多条件查询方式二
根据id和username查询user表
方式二:使用注解,引入 @Param() 注解获取参数
-
编写UserMapper接口
/** * 多条件查询方式二 * @param id * @param username * @return */ public List<User> findByIdAndUsername2(@Param("id") int id, @Param("username") String username);
-
编写UserMapper.xml
<!--多条件查询:方式二--> <select id="findByIdAndUsername2" resultMap="userResultMap" > select * from user where id = #{id} and username = #{username} </select>
-
编写测试代码
/** * 多条件查询:方式二 * @throws IOException */ @Test public void findByIdAndUsername2() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.findByIdAndUsername2(1, "子慕"); for (User user : users) { System.out.println(user); } sqlSession.close(); }
Mybatis多条件查询方式三
根据id和username查询user表
方式三:使用JavaBean对象传递参数
-
编写 UserMapper接口
/** * 条件查询方式三 * @param user * @return */ public List<User> findByIdAndUsername3(User user);
-
编写 UserMapper.xml
<!--多条件查询:方式三--> <select id="findByIdAndUsername3" resultMap="userResultMap" parameterType="com.code.entity.User"> select * from user where id = #{id} and username = #{username} </select>
-
编写测试代码
/** * 多条件查询:方式三 * @throws IOException */ @Test public void test5() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user1 = new User(); user1.setId(1); user1.setUsername("子慕"); List<User> users = mapper.findByIdAndUsername3(user1); for (User user : users) { System.out.println(user); } sqlSession.close(); }
Mybatis模糊查询方式一
根据username模糊查询user表
-
编写UserMapper接口
/** * 模糊查询方式一 * @param username * @return */ public List<User> findByUsername(String username);
-
编写UserMapper.xml映射
<!--模糊查询:方式一--> <select id="findByUsername" resultMap="userResultMap" parameterType="string"> <!-- #{}在mybatis中是占位符,引用参数值的时候会自动添加单引号 --> select * from user where username like #{username} </select>
-
测试代码
/** * 模糊查询方式一 * @throws IOException */ @Test public void test6() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.findByUsername("%子%"); for (User user : users) { System.out.println(user); } sqlSession.commit(); sqlSession.close(); }
Mybatis模糊查询方式二
根据username模糊查询user表
-
编写UserMapper接口
/** * 模糊查询方式二 * @param username * @return */ public List<User> findByUsername2(String username);
-
编写 UserMapper.xml 映射
<!--模糊查询:方式二--> <select id="findByUsername2" resultMap="userResultMap" parameterType="string"> <!--parameterType是基本数据类型或者String的时候,${}里面的值只能写value ${}: sql原样拼接 --> select * from user where username like '${value}' </select>
-
编写测试代码
/** * 模糊查询 方式二 * @throws IOException */ @Test public void test7() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.findByUsername2("%子慕%"); for (User user : users) { System.out.println(user); } sqlSession.close(); }
${} 与 #{}区别
- #{} :表示一个占位符号:
- 通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
- #{} 可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值, #{} 括号中名称随便写。
- ${} :表示拼接sql串:
- 通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。
- ${} 可以接收简单类型值或pojo属性值
- 如果parameterType传输单个简单类型值, ${} 括号中只能是value。
Mybatis映射文件_添加用户:获取返回主键:方式一
返回主键:向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的主键值。
-
编写userMapper.
/** * 添加用户:获取返回主键:方式一 * @param user */ public void saveUser(User user);
-
编写userMapper.xml配置文件
<!--添加用户:获取返回主键:方式一--> <!-- useGeneratedKeys: 声明返回主键 keyProperty:把返回主键的值,封装到实体中的那个属性上 --> <insert id="saveUser" parameterType="user" useGeneratedKeys="true" keyProperty="id"> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
-
useGeneratedKeys=“true” 声明返回主键,只适用于主键自增的数据库,mysql和sqlserver支持,oracle不行。
-
编写测试代码
/** * 添加用户返回主键:方式一 * @throws IOException */ @Test public void test8() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("某冰冰"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println(user); mapper.saveUser(user); System.out.println(user); sqlSession.commit(); sqlSession.close(); }
Mybatis映射文件_添加用户:获取返回主键:方式二
-
编写 userMapper
/** * 添加用户:获取返回主键:方式二 * @param user */ public void saveUser2(User user);
-
编写 userMapper.xml
<!--添加用户:获取返回主键:方式二--> <insert id="saveUser2" parameterType="user" > <!-- selectKey : 适用范围更广,支持所有类型的数据库 order="AFTER" : 设置在sql语句执行前(后),执行此语句 keyColumn="id" : 指定主键对应列名 keyProperty="id":把返回主键的值,封装到实体中的那个属性上 resultType="int":指定主键类型 --> <selectKey order="AFTER" keyColumn="id" keyProperty="id" resultType="int"> SELECT LAST_INSERT_ID(); </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
-
编写测试代码
/** * 添加用户:返回主键方式二 */ @Test public void test9() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("汤唯"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println(user); mapper.saveUser2(user); System.out.println(user); sqlSession.commit(); sqlSession.close(); }