mybatis的CRUD操作:
1.定义接口方法:
总结:增加、修改、删除方法返回值类型一般为int;
两种查询方法:查询所有--返回值类型为实体对象的集合类型
按条件查询--返回值类型为实体类型
List<User> findAll();
User findById(Integer id);
int addUser(User user);
int deleteUser(Integer id);
int updateUser(User user);
2.配置mapper.xml映射文件
增删改查标签:<select> <insert> <update> <delete>
id属性:值为接口的方法名
resultType属性:指定返回值的类型
动态参数的获取:#{参数名} (参数名一般和实体类的属性名相同)
单表查询事例:
<select id="findById" resultType="com.mybatis.model.User"> select * from user where id=#{id} </select>
<!-- 增加一个用户 -->
<insert id="addUser"> insert into user(name,sex,username,pwd,tel) values(#{name},#{sex},#{username},#{pwd},#{tel}) </insert>
<!-- 根据id删除一个用户 --> <delete id="dropUser" parameterType="Integer"> delete from user where id=#{id} </delete>
<!-- 根据id修改用户 --> <update id="updateUser"> update user set name=#{name},sex=#{sex},username=#{username},pwd=#{pwd},tel=#{tel} where id=#{id} </update>
多表查询事例:
<!-- 根据用户id查询订单的详细信息 --> <select id="findOrdersByUserId" resultType="com.mybatis.model.Orders"> SELECT orders.ordername,orders.ordermoney,orders.orderdate,orders.ordernum FROM orders JOIN user ON orders.orderuser=user.id WHERE user.id=#{id} </select>
<!-- 查询包含用户名的订单的详细信息 --> <select id="findOrdersAllInfo" resultType="com.mybatis.model.Orders"> SELECT orders.ordername,orders.ordermoney, orders.orderdate,orders.ordernum,user.name as 'user.name' FROM orders JOIN user ON orders.orderuser=user.id </select>
3.测试类中读取mybatis-config.xml配置文件,步骤如上:结构测试
映射器方法多参数传递:(重点)
使用场景:
当我们执行crud操作的时候需要多个条件才能完成,这个时候我们需要传递多个参数;
方式一:直接传递多个参数
1.在接口类中定义多个参数的接口方法;
参数个数:一般为2到4个参数,常见的为2个
栗子:User findByNameAndSex(String name,String sex);
2.配置映射文件:
传入的动态参数必须使用mybatis内部提供的名称;分别为arg0,arg1,param1,param2栗子:<!-- 查询出名字叫“郭靖”的男用户 --> <select id="findByNameAndSex" resultType="com.mybatis.model.User"> SELECT * from `user` WHERE `name`=#{arg0} AND sex=#{arg1} </select>
注意:Mybatis映射器XML对于多个参数,默认情况下只识别arg0、arg1、paraml和param2这种内部定义的名称,
所以将参数名定义为#{arg0}和#{arg1}或者#{param1}和#{param2}即可解决错误错误提示:当出现多个参数传递的时候,我们只能按照mybatis内部给我们定义的名称,
其他的自定义名称都会报错;
报错方式如下:
### Error querying database.
Cause: org.apache.ibatis.binding.BindingException:
Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]
方式二:使用map集合传递多个参数
1.在接口类中定义map参数的接口
栗子:User findByNameAndSex1(Map<String, Object> map);
2.配置映射文件:
动态SQL的参数名字必须和map集合的key键的名称相同;如果名称不匹配,则传递参数无法获取
核心代码:
Map<String, Object> map=new HashMap<String, Object>();
map.put("name", "郭靖");
map.put("sex", "男");
<!-- 查询出名字叫“郭靖”的男用户 -->
<select id="findByNameAndSex1" resultType="com.mybatis.model.User">
SELECT * from `user` WHERE `name`=#{name} AND sex=#{sex}
</select>
#使用注解的方式执行mybatis的crud操作:(了解)
使用:
1. 在接口方法上添加crud的注解:@select,@insert,@update,@delete;
并在注解括号中编写SQL语句,SQL语句和映射配置文件的SQL写法一样
栗子:
@Select("select * from user")
List<User> findAllAnnotaion();
@Select("select * from user where id=#{id}")
User findById(Integer id);
2. 在mybatis的配置文件中配置接口类路径的映射;
配置位置:
<mappers>
<mapper class="com.mybatis.mapper.UserMapper2"/>
</mappers>
常见错误:无法在mybatis的配置文件中找到接口类
org.apache.ibatis.binding.BindingException: Type interface com.mybatis.mapper.UserMapper2 is not known to the MapperRegistry.
解决方法:
在mybatis的配置文件的<mappers>标签中添加接口类的全限定路径:com.mybatis.mapper.UserMapper2
并且<mapper>中的属性为class,用.隔开。
1.重新搭建mybatis框架
2.mybatis配置文件中使用取别名配置
作用:为全限定类名重新配置一个简单的名字,方便后面的引用,减少代码的冗余
用法:
<!-- 配置全局类型的简写别名 -->
<typeAliases>
<typeAlias type="com.mybatis.model.User" alias="user"/>
<typeAlias type="com.mybatis.model.Orders" alias="orders"/>
</typeAliases>
3.数据源的三种参数配置
UNPOOLED:这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,
但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。
性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形
POOLED(重点):这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,
避免了创建新的连接实例时所必需的初始化和认证时间。
这种处理方式很流行,能使并发 Web 应用快速响应请求。
JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,
容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
4.开启驼峰命名映射:mapUnderscoreToCamelCase
用在哪:当数据库的字段名和实体类属性名不相同,并且命名没有按照驼峰命名规则;
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
value值:
true:开启驼峰命名映射
false: 不开启驼峰命名映射
注意:该配置需要放在第一位,否则报错。