mybatis第一天02

mybatis第二天02

1.映射文件之输入输出映射

1.1映射文件之输入映射类型(parameterType)

1.1.1简单类型

  当parameterType为简单类型时,我们只需要直接填写“int”、"double"等

入参类型是处于java.lang.*下类型的直接填写并且不区分大小写其中“String”是引用类型但是她也是直接先填写

根据用户id查询用户

映射文件的部分代码

1 <!-- 
2       id :statement的id要求在命名空间内唯一,为了实现Mapper代理这里的id名称切记要和方法名一致
3       parameterType:入参类型简单类型直接填写并且不区分大小写
4       resultType:结果类型需要对应相应的Java类型
5   -->
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     <!-- 
 3         [${}]:表示拼接SQL字符串,即不加解释的原样输出
 4          [${value}]:表示要拼接的是简单类型参数。
 5          注意:
 6         1、如果参数为简单类型时,${}里面的参数名称必须为value 
 7         2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
 8     -->
 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         List<User> userList = userMapper.findUsersByUsername("小明");
21         System.out.println(userList);
22         sqlSession.close();
23     }
24 }

1.1.2POJO类型

添加用户:

parameterType应该为全类名但是我们在全局配置中配置了别名<package name="com.itheima.Po"/> 详情见上一篇介绍的别名设置
 1 <!--执行添加操作时因为数据库设置的主键自增策略,useGeneratedKeys=“true”表示数据库为主键自增策略 如果用户要自己添加主键时一定要确保数据库中有没有指定主键自增-->
 2 <insert id="addUser" parameterType="user" 
 3         useGeneratedKeys="true" >
 4  <!--  SELECT LAST_INSERT_ID()是用来查询主键的 keyProperty表示主键的列名  resultType表示主键返回的结果类型 order="AFTER"表示在插入操作执行后执行 -->
 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 <!--如果是条件查询我们不知道用户会填写哪一个条件所以我们使用where标签和if标签,where标签会去掉第一个条件的AND如果没有条件则会省去where,if标签是属于判断作用,判断这个条件是否满足-->
 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         List<User> userList = userMapper.findUserList(userPlus);
29         
30         System.out.println(userList);
31         sqlSession.close();
32     }
33 }

1.1.4Map类型

当传入一个HashMap的参数时的映射文件的写法

1  <!-- parameterType="HashMap"通过这里可以看出只要不是自定义的数据类型 都可以使用简单名称不用谢完全类名且不区分大小写 -->
2  <!-- 通过map集合传参  可以发现和普通PO类传参是一样的操作-->
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         HashMap<String, Object> hashmap =new HashMap<>();
19         hashmap.put("username", "小明");
20         hashmap.put("sex", "1");
21         List<User> 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  <!--${xxx} #{xxx}中的参数名称要和包装pojo中的对象层级一致,并且属性名称要一致-->
 3  SELECT * FROM USER 
 4 <!-- mybatis提供 where if foreach 等标签来帮助优化sql 也就是生成动态SQL这样可以方便优化条件查询 
 5  where 标签会将条件中的第一个AND 给自动去掉 ,如果一个参数都没有则会省去where
 6  -->
 7 <where>
 8  <!-- if标签对条件进行判断 test属性为判断表达式而且里面支持and字符串 -->
 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></sql>标签定义可重用的sql片段 id为这个sql片段的唯一标识

sql片段

 1 <!-- 自定义sql片段提高sql代码的可重用性  id标识sql片段的唯一引用
 2  sql片段:可以声明sql语句的任何一部分
 3  SQL片段:尽量不要将select或where等关键字放在片段里面,这样有利于其他代码的重用
 4  -->
 5 <sql id="whereClause">
 6  <!-- mybatis提供 where if foreach 等标签来帮助优化sql 也就是生成动态SQL这样可以方便优化条件查询 
 7  where 标签会将条件中的第一个AND 给自动去掉 ,如果一个参数都没有则会省去where
 8  -->
 9  <where>
10  <!-- if标签对条件进行判断 test属性为判断表达式而且里面支持and字符串 -->
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  <!--${xxx} #{xxx}中的参数名称要和包装pojo中的对象层级一致,并且属性名称要一致-->
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项目等。

 

原文地址:https://www.cnblogs.com/zwxbky/p/12310102.html