mybatis第一天学习总结

mybatis是什么?

mybatis是一人持久层框架,mybatis是一个不完全的ORM框架。sql语句需要程序员自己去编写,但是mybatis也有映射(输入参数映射、输出结果映射)。

mybatis入门门槛不高,学习成本低,让程序员把精力放在sql语句上,对sql语句优化非常方便,适用与需求变化较多项目,比如互联网项目。

 

mybatis框架执行过程:

1、配置mybatis的配置文件,SqlMapConfig.xml(名称不固定)

2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂

         SqlSessionFactory在实际使用时按单例方式。

3、通过SqlSessionFactory创建SqlSession

         SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。

4、调用sqlSession的方法去操作数据。

         如果需要提交事务,需要执行SqlSession的commit()方法。

5、释放资源,关闭SqlSession

 

mybatis开发dao的方法:

1、原始dao 的方法

         需要程序员编写dao接口和实现类

         需要在dao实现类中注入一个SqlSessionFactory工厂。

 

2、mapper代理开发方法(建议使用)

         只需要程序员编写mapper接口(就是dao接口)

         程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范:

         1、mapper.xml中namespace就是mapper.java的类全路径。

         2、mapper.xml中statement的id和mapper.java中方法名一致。

         3、mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入 参数类型一致。

         4、mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。

 

SqlMapConfig.xml配置文件:可以配置properties属性、别名、mapper加载。。。

 

输入映射:

         parameterType:指定输入参数类型可以简单类型、pojo、hashmap。。

         对于综合查询,建议parameterType使用包装的pojo,有利于系统 扩展。

 

输出映射:

         resultType:

                   查询到的列名和resultType指定的pojo的属性名一致,才能映射成功。

         reusltMap:

                   可以通过resultMap 完成一些高级映射。

                   如果查询到的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系)。可以完成映射。

                   高级映射:

                            将关联查询的列映射到一个pojo属性中。(一对一)

                            将关联查询的列映射到一个List<pojo>中。(一对多)

 

动态sql:(重点)

         if判断(掌握)

         where

         foreach

         sql片段(掌握)

 

第一天的代码最终实现:

Mapper接口文件:

 1 package cn.cuibusimybatis.mapper;
 2 
 3 import java.util.List;
 4 
 5 import cn.cuibusimybatis.po.User;
 6 import cn.cuibusimybatis.po.UserCustom;
 7 import cn.cuibusimybatis.po.UserQueryVo;
 8 
 9 public interface UserMapper {
10     
11     //resultmap
12     public User findUserByResultMap(int id) throws Exception;
13     
14     //数量
15     public int findUserCount(UserQueryVo userQueryVo) throws Exception;
16     
17     //综合查询
18     public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
19     
20     //根据id查询用户信息
21     public User findUserById(int id) throws Exception;
22     
23     //根据id查询用户信息
24     //public User findUserById(int id) throws Exception;
25     
26     //根据用户名列查询用户列表
27     public List<User> findUserByName(String name) throws Exception;
28         
29     
30     //添加用户信息
31     public void insertUser(User user) throws Exception;
32     
33     //删除用户信息
34     public void deleteUser(int id) throws Exception;
35 }

mapper映射文件 UserMapper.xml

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE mapper
  3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5 
  6 <!-- 命名空间(sql隔离) -->
  7 <mapper namespace="cn.cuibusimybatis.mapper.UserMapper">
  8 
  9 <!-- 定义sql片段
 10     id:sql片段的唯 一标识
 11     
 12     经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高
 13     在sql片段中不要包括 where
 14      -->
 15     <sql id="query_user_where">
 16         <if test="userCustom!=null">
 17             <if test="userCustom.sex!=null and userCustom.sex!=''">
 18                 and user.sex = #{userCustom.sex}
 19             </if>
 20             <if test="userCustom.username!=null and userCustom.username!=''">
 21                 and user.username LIKE '%${userCustom.username}%'
 22             </if>
 23             <if test="ids!=null">
 24             <!-- 使用 foreach遍历传入ids
 25             collection:指定输入 对象中集合属性
 26             item:每个遍历生成对象中
 27             open:开始遍历时拼接的串
 28             close:结束遍历时拼接的串
 29             separator:遍历的两个对象中需要拼接的串
 30              -->
 31              <!-- 使用实现下边的sql拼接:
 32               AND (id=1 OR id=10 OR id=16) 
 33               -->
 34             <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
 35                 <!-- 每个遍历需要拼接的串 -->
 36                 id=#{user_id}
 37             </foreach>
 38             
 39             <!-- 实现  “ and id IN(1,10,16)”拼接 -->
 40             <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=",">
 41                 每个遍历需要拼接的串
 42                 #{user_id}
 43             </foreach> -->
 44             
 45             </if>
 46         </if>
 47     </sql>
 48 
 49 <!-- 定义resultMap
 50     将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系
 51     
 52     type:resultMap最终映射的java对象类型,可以使用别名
 53     id:对resultMap的唯一标识
 54 -->
 55      <resultMap type="user" id="userResultMap">
 56          <!-- id表示查询结果集中唯一标识 
 57          column:查询出来的列名
 58          property:type指定的pojo类型中的属性名
 59          最终resultMap对column和property作一个映射关系 (对应关系)
 60          -->
 61          <id column="id_" property="id"/>
 62          <!-- 
 63          result:对普通名映射定义
 64          column:查询出来的列名
 65          property:type指定的pojo类型中的属性名
 66          最终resultMap对column和property作一个映射关系 (对应关系)
 67           -->
 68          <result column="username_" property="username"/>
 69      </resultMap>
 70     
 71     <!-- 条件查询 -->
 72      <select id="findUserList" parameterType="cn.cuibusimybatis.po.UserQueryVo" resultType="cn.cuibusimybatis.po.UserCustom">
 73         select * from user 
 74         <where>
 75         <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
 76         <include refid="query_user_where"></include>
 77         <!-- 在这里还要引用其它的sql片段  -->
 78     </where>
 79     </select> 
 80     
 81     <!-- 条件查询数 -->
 82      <select id="findUserCount" parameterType="cn.cuibusimybatis.po.UserQueryVo" resultType="int">
 83         select count(*) from user where user.sex = #{userCustom.sex} AND user.username like '%${userCustom.username}%'
 84     </select> 
 85 
 86     <!-- 通过select执行数据库查询  #{}表示占位符 id接受输入的参数
 87     resulttype:输出结果所对应的类型
 88     -->
 89     <select id="findUserById" parameterType="int" resultType="cn.cuibusimybatis.po.User">
 90         select * from USER where id=#{id}
 91     </select>
 92     
 93     <!-- resultMap作为返回值类型 -->
 94     <select id="findUserByResultMap" parameterType="int" resultMap="userResultMap">
 95         select id id_,username username_ from USER where id=#{value}
 96     </select>
 97     
 98     <!-- 根据用户名查询 
 99         ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
100         使用${}拼接sql,引起 sql注入
101         ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
102     -->
103     
104     <select id="findUserByName" parameterType="java.lang.String" resultType="cn.cuibusimybatis.po.User">
105         select * from user where username like '%${value}%'
106     </select>
107     
108     <!-- 添加用户
109     parameterType:指定输入的类型是pojo
110     select LAST_INSERT_ID() 得到刚刚插入的主键,仅适用于自增主键
111      -->
112     <insert id="insertUser" parameterType="cn.cuibusimybatis.po.User">
113         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
114             select LAST_INSERT_ID()
115         </selectKey>
116         insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
117     </insert>
118     
119     <!-- 
120         使用mysql的uuid()生成主键
121         执行过程:
122         首先通过uuid()得到主键,将主键设置到user对象的id属性中
123         其次在insert执行时,从user对象中取出id属性值
124          -->
125         <!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
126             SELECT uuid()
127         </selectKey>
128         insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) 
129         -->
130         
131     <!-- 删除用户 -->
132     <delete id="deleteUser" parameterType="java.lang.Integer">
133         delete from user where id=#{id}
134     </delete>
135     
136     <!-- 根据id更新用户
137     分析:
138     需要传入用户的id
139     需要传入用户的更新信息
140     parameterType指定user对象,包括 id和更新信息,注意:id必须存在
141     #{id}:从输入 user对象中获取id属性值
142      -->
143     <update id="updateUser" parameterType="cn.cuibusimybatis.po.User">
144         update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 
145          where id=#{id}
146     </update>
147 </mapper>

包装类型类  UserQueryVo:


 1 package cn.cuibusimybatis.po;
 2 
 3 import java.util.List;
 4 
 5 /**
 6  *包装类型
 7  */
 8 public class UserQueryVo {
 9     
10     
11     //在这里包装所有的查询条件
12 
13     //传入多个id
14     private List<Integer> ids;
15     public List<Integer> getIds() {
16         return ids;
17     }
18     public void setIds(List<Integer> ids) {
19         this.ids = ids;
20     }
21     
22     //用户的查询条件
23     private UserCustom userCustom;
24     public UserCustom getUserCustom() {
25         return userCustom;
26     }
27     public void setUserCustom(UserCustom userCustom) {
28         this.userCustom = userCustom;
29     }
30     
31 }

 

核心配置文件 SqlMapConfig:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6 
 7     <!-- 加载properties配置文件 -->
 8     <properties resource="db.properties">
 9     <!--properties中还可以配置一些属性名和属性值  -->
10     <!-- <property name="jdbc.driver" value=""/> -->
11     </properties>
12     <!-- 别名定义 -->
13     <typeAliases>
14         <!-- <typeAlias type="cn.cuibusimybatis.po.User" alias="user"/> -->
15         <!-- 批量别名定义 
16         指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
17         -->
18         <package name="cn.cuibusimybatis.po"/>
19         
20     </typeAliases>
21     <!-- 和spring整合后 environments配置将废除-->
22     <environments default="development">
23         <environment id="development">
24         <!-- 使用jdbc事务管理-->
25             <transactionManager type="JDBC" />
26         <!-- 数据库连接池-->
27             <dataSource type="POOLED">
28                 <property name="driver" value="${jdbc.driver}" />
29                 <property name="url" value="${jdbc.url}" />
30                 <property name="username" value="${jdbc.username}" />
31                 <property name="password" value="${jdbc.password}" />
32             </dataSource>
33         </environment>
34     </environments>
35     
36     <!-- 加载映射文件 -->
37     <mappers>
38         <!-- <mapper resource="sqlmap/User.xml"/> -->
39         <!-- <mapper resource="mapper/UserMapper.xml"/> -->
40         
41         <!-- 通过mapper接口加载单个 映射文件
42         遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
43         上边规范的前提是:使用的是mapper代理方法
44          -->
45         <!-- <mapper class="cn.cuibusimybatis.mapper.UserMapper"/> -->
46         <!-- 批量加载mapper
47         指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
48         遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
49         上边规范的前提是:使用的是mapper代理方法
50          -->
51         <package name="cn.cuibusimybatis.mapper"/>
52         
53     </mappers>
54 </configuration>
posted @ 2017-05-06 09:45  崔布斯  阅读(355)  评论(0编辑  收藏  举报