1. sql中传参表示的两种方式
- 占位符:表示方式 #{} 推荐使用
- select * from t_user where username = #{username}
- 字符串拼接:表示方式 '${}' 注意一定有单引号
- select * from t_user where username = '${username}'
2. 数据查询
1. sql中存在一个参数
直接用表中属性名即可
<select id="getUserByUsername" resultType="user">
SELECT * FROM t_user WHERE username = #{username};
</select>
2. sql存在多个参数
存在多个参数的时候,Mybatis会创建map集合,并使用arg0,arg1........,param0,param1........来表示Key,参数值为value。
User checkLogin(String username, String password);
<select id="checkLogin" resultType="user">
SELECT * FROM t_user WHERE username = #{param1} and password = #{param2};
</select>
<select id="checkLogin" resultType="user">
SELECT * FROM t_user WHERE username = #{arg0} and password = #{arg1};
</select>
3. 用map装载参数
可直接用map进行参数传递,sql语句中可以写任意值,不局限于argX和paramX
User username = #{param1} and password = #{param2};
<select id="checkLoginByMap" resultType="user">
SELECT * FROM t_user WHERE username = #{username} and password = #{password};
</select>
4. 单个实体类POJO推荐使用
void insertUser(User user);
<select id="insertUser">
INSERT INTO t_user VALUES (NULL, #{username}, #{password}, #{age}, #{gender}, #{email})
</select>
5. 多个实体类推荐使用
通过List泛型
List<User> userList();
<!--多条数据查询至map-->
<select id="userList" resultType="user">
select * from t_user
</select>
6. @Param处理sql存在单个或多个参数推荐使用
其会替换argXX,即你只能用 {username, param1, password, param2 } 这四个在配置文件当中。
也就是注解上的替换了argx
User checkLogin(@Param("username") String username, @Param("password") String password);
<select id="checkLogin" resultType="user">
SELECT * FROM t_user WHERE username = #{username} and password = #{password};
</select>
3. 查询功能详解
1. 返回为实体类POJO
1. 单个实体类
User user
User getUserById(@Param("id") String id);
<select id="getUserById" resultType="user">
SELECT * FROM t_user WHERE id = #{id}
</select>
2.多实体类泛型
List<User> userlist
List<User> userList();
<!--多条数据查询至map-->
<select id="userList" resultType="user">
select * from t_user
</select>
2. 没有对应的实体类返回(返回不是实体类)
查询的结果没有对应的实体类的时候,就可以使用Map集合。 resultType 设置成 map 即可.
查询多个时注意注解
多个的话用List<Map<String,Object>> userList=XXX
@MapKey("id") //将表中的某个字段作为每条map集合的键 查询单行时不写也可以,那就没有键
Map<String,Object> countUserByMap(@Param("id") int id);
@MapKey("id") //查询多行时必须写
Map<String,Object> countUsersByMap();
3. 单行单列
查询有多少行数据
- count(*)查询所有
- count(1)查询所有
- count("XX")查询XX字段的所有数据 会忽略值为null的行
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
<!--
在mybatis为java中常见的数据类型设置了别名
Integer:integer int Int
int:_int _integer
Map:map
String :string
-->
<select id="countUsers" resultType="_int">
select count(*) from t_user
</select>