mybatis第二天02
1.映射文件之输入输出映射
1.1映射文件之输入映射类型(parameterType)
1.1.1简单类型
当parameterType为简单类型时,我们只需要直接填写“int”、"double"等
入参类型是处于java.lang.*下类型的直接填写并且不区分大小写其中“String”是引用类型但是她也是直接先填写
根据用户id查询用户
映射文件的部分代码
1 6 <select id="findUserById" parameterType="Int" resultType="USER"> 7 SELECT * FROM USER WHERE id=#{id} 8 select>
测试代码:
1 public class UserMapperTest { 2 3 private SqlSessionFactory sqlSessionFactory; 4 @Before 5 public void setUp() throws Exception { 6 //1.给出全局配置文件的文件路径 7 String resource="SqlMapConfig.xml"; 8 //2.读取文件返回一个输入流 9 InputStream inputStream= Resources.getResourceAsStream(resource); 10 sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 11 12 } 13 14 @Test 15 public void testFindUserById() { 16 //1.创建sqlSession会话 17 SqlSession sqlSession = sqlSessionFactory.openSession(); 18 //2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可) 19 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 20 //3.调用实例方法得到封装好的对象 21 User user =userMapper.findUserById(1); 22 System.out.println(user); 23 sqlSession.close(); 24 } 25 }
根据用户名模糊查询用户
入参类型是处于java.lang.*下其中“String”是引用类型但是它也是直接先填写
部分映射文件代码:
1 2 9 <select id="findUsersByUsername" parameterType="String" resultType="user"> 10 SELECT * FROM USER WHERE username like '%${value}%' 11 12 select>
测试代码:
1 public class UserMapperTest { 2 3 private SqlSessionFactory sqlSessionFactory; 4 @Before 5 public void setUp() throws Exception { 6 //1.给出全局配置文件的文件路径 7 String resource="SqlMapConfig.xml"; 8 //2.读取文件返回一个输入流 9 InputStream inputStream= Resources.getResourceAsStream(resource); 10 sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 11 12 } 13 @Test 14 public void testFindUsersByUsername() { 15 //1.创建sqlSession会话 16 SqlSession sqlSession =sqlSessionFactory.openSession(); 17 //2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可) 18 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 19 //3.调用实例方法得到封装好的对象 20 ListuserList = userMapper.findUsersByUsername("小明"); 21 System.out.println(userList); 22 sqlSession.close(); 23 } 24 }
1.1.2POJO类型
添加用户:
parameterType应该为全类名但是我们在全局配置中配置了别名 详情见上一篇介绍的别名设置
1 2 <insert id="addUser" parameterType="user" 3 useGeneratedKeys="true" > 4 5 <selectKey keyProperty="id" resultType="int" order="AFTER"> 6 SELECT LAST_INSERT_ID() 7 selectKey> 8 9 INSERT INTO USER (username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) 10 insert>
测试代码:切记操作后提交事务
1 public class UserMapperTest { 2 3 private SqlSessionFactory sqlSessionFactory; 4 @Before 5 public void setUp() throws Exception { 6 //1.给出全局配置文件的文件路径 7 String resource="SqlMapConfig.xml"; 8 //2.读取文件返回一个输入流 9 InputStream inputStream= Resources.getResourceAsStream(resource); 10 sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 11 12 } 13 @Test 14 public void testAddUser() { 15 //1.创建sqlSession会话 16 SqlSession sqlSession = sqlSessionFactory.openSession(); 17 //2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可) 18 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 19 User user =new User(); 20 user.setUsername("张三三"); 21 user.setBirthday(new Date()); 22 user.setSex("1"); 23 user.setAddress("湖北省仙桃市西流河镇"); 24 int result = userMapper.addUser(user); 25 //插入增删改只要对数据库中进行了改变那么就要提交事务,事务开启在openSession自动打开,也可以在函数中关闭openSession(false)传入false即可 26 sqlSession.commit(); 27 System.out.println(result+","+user.getId()); 28 sqlSession.close(); 29 } 30 31 }
1.1.3包装POJO类型(包装类型)
注意包装类型时参数的写法
包装类的参数写法是:所包装对象的对象名.属性名 ${user.username} #{user.sex}
1 2 <select id="findUserByIdList" parameterType="com.itheima.Po.UserPlus" resultType="user" > 3 SELECT * FROM USER 4 <where> 5 <if test="user.username!=null and user.username!=''"> 6 AND username like '%${user.username}%' 7 if> 8 <if test="user.sex!=null and user.sex!=''"> 9 AND sex=#{user.sex} 10 if> 11 where> 12 13 select>
测试代码:
1 public class UserMapperTest { 2 3 private SqlSessionFactory sqlSessionFactory; 4 @Before 5 public void setUp() throws Exception { 6 //1.给出全局配置文件的文件路径 7 String resource="SqlMapConfig.xml"; 8 //2.读取文件返回一个输入流 9 InputStream inputStream= Resources.getResourceAsStream(resource); 10 sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 11 12 } 13 14 @Test//当加上where if 标签后会生成动态sql会根据所给的条件信息去生成sql语句 15 //SELECT * FROM USER WHERE username like '%小明%' 16 //SELECT * FROM USER WHERE username like '%小明%' AND sex=? 17 public void testFindUserList() { 18 //1.创建sqlSession会话 19 SqlSession sqlSession = sqlSessionFactory.openSession(); 20 //2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可) 21 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 22 UserPlus userPlus =new UserPlus(); 23 User user = new User(); 24 user.setUsername("小明"); 25 // user.setSex("1"); 26 userPlus.setUser(user); 27 28 ListuserList = userMapper.findUserList(userPlus); 29 30 System.out.println(userList); 31 sqlSession.close(); 32 } 33 }
1.1.4Map类型
当传入一个HashMap的参数时的映射文件的写法
1 2 3 <select id="findUserHashMap" parameterType="HashMap" resultType="user"> 4 SELECT * FROM USER WHERE username like '%${username}%' AND sex=#{sex} 5 6 select>
测试代码:
1 public class UserMapperTest { 2 private SqlSessionFactory sqlSessionFactory; 3 @Before 4 public void setUp() throws Exception { 5 //1.给出全局配置文件的文件路径 6 String resource="SqlMapConfig.xml"; 7 //2.读取文件返回一个输入流 8 InputStream inputStream= Resources.getResourceAsStream(resource); 9 sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 10 11 } 12 @Test 13 public void testFindUserHashMap() { 14 //1.创建sqlSession会话 15 SqlSession sqlSession = sqlSessionFactory.openSession(); 16 //2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可) 17 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 18 HashMaphashmap =new HashMap<>(); 19 hashmap.put("username", "小明"); 20 hashmap.put("sex", "1"); 21 List userList = userMapper.findUserHashMap(hashmap); 22 23 System.out.println(userList); 24 sqlSession.close(); 25 } 26 }
1.2映射文件之输出映射类型(resultType)
resultType只能进行简单结果映射不能很好的进行复杂的结果映射如果当进行下一篇讲解的关联关系查询时resultType就不好用了
但是当结果映射为 int、double、String等直接配置为相对应的类型即可而且也可以进行自定义类型映射
但是必须保证查询的列名和JavaBean的属性名完全一致,不然则会映射失败。
当查询时我们会定义列别名 例如 select username t_username from user where id=1;而如果JavaBean里面的属性名为username这时你的t_username就映射不上去
2.映射文件之定义动态sql
2.1动态sql
在mybatis中,它提供了一些动态sql标签,可以让程序员更快的进行mybatis的开发,这些动态sql可以通过sql的可重用性。常用的动态sql标签:if标签、where标签、sql片段、foreach标签
2.1.1 if/where标签的使用
1 <select id="findUserList" parameterType="com.itheima.Po.UserPlus" resultType="user"> 2 3 SELECT * FROM USER 4 7 <where> 8 9 <if test="user.username!=null and user.username!=''"> 10 AND username like '%${user.username}%' 11 if> 12 <if test="user.sex!=null and user.sex!=''"> 13 AND sex=#{user.sex} 14 if> 15 where> 16 17 select>
2.1.2 sql片段
sql片段
1 5 <sql id="whereClause"> 6 9 <where> 10 11 <if test="user.username!=null and user.username!=''"> 12 AND username like '%${user.username}%' 13 if> 14 <if test="user.sex!=null and user.sex!=''"> 15 AND sex=#{user.sex} 16 if> 17 <if test="idList!=null and idList.size>0"> 18 AND id IN 19 <foreach collection="idList" item="id" open="(" close=")" separator=","> 20 #{id} 21 foreach> 22 if> 23 where> 24 sql>
引用sql片段:
1 <select id="findUserList" parameterType="com.itheima.Po.UserPlus" resultType="user"> 2 3 SELECT * FROM USER 4 <include refid="whereClause">include> 5 select>
3.maybatis与hibernate的区别与各自应用场景
Mybatis技术特点:
通过直接编写SQL语句,可以直接对SQL进行性能的优化;
学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
由于直接编写SQL语句,所以灵活多变,代码维护性更好。
不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。
Hibernate技术特点:
标准的orm框架,程序员不需要编写SQL语句。
具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
程序员不能自主的去进行SQL性能优化。
Mybatis应用场景:
需求多变的互联网项目,例如电商项目。
Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。