Mybatis02-CRUD操作及配置解析
CURD操作
xml配置
- 在前文中,已经分析了Mybatis如何简单的连接数据库并根据配置进进行操作,后面进行CRUD操作的简单使用极其优化。
- xml文件
<mapper namespace="com.byx.dao.UserDao">
<select id="getUserList" resultType="com.byx.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.byx.pojo.User">
select * from user where id = #{id}
</select>
<!--values直接填入id,name,pwd,自动的取出传入参数User的id,name,pwd -->
<insert id="addUser" parameterType="com.byx.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.byx.pojo.User">
update user set name = #{name},pwd=#{pwd} where id=#{id};
</update>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id};
</delete>
</mapper>
-
如上,对xml文件进行增删改配置。
- 在addUser方法中,传入为User对象,在sql语句中values()中各参数填入User的属性,就可直接取到传入User的值。
-
存在问题:若一个对象的属性过多,而操作只需要对个别属性进行操作。但是构造对象时,若对象的属性不能为空,那么一般情况还是构造了一个包含所有属性的对象,这样做可能没有必要。
-
解决方法:通过map来传入参数,直接在sql中取出Key即可
-
代码示例:
xml改进对比:addUser传入为User,addUser2传入为map
<!--values直接填入id,name,pwd,自动的取出传入参数User的id,name,pwd -->
<insert id="addUser" parameterType="com.byx.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<insert id="addUser2" parameterType="map">
insert into user (id,name,pwd) values (#{userId},#{userName},#{userPwd})
</insert>
javaTest改进对比
@Test
public void addTest(){
int number = userDao.updateUser(new User(4, "呵呵", "222"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void addTest2(){
Map<String, Object> map = new HashMap<>();
map.put("userId",4);
map.put("userName","卡卡");
map.put("userPwd", 123);
userDao.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
如上述所示,两种方式都进行数据的增加。
- 总结:
- map传递参数,直接在sql中取出即可
- 对象传递参数,直接在sql中取对象的属性即可
- 只有一个基本类型参数,可以直接在sql中取到
- 多个参数用Map,或者注解。
模糊查询如何实现?
- java代码执行的时候,传通配符
List<User> userList = userDao.getUserLick("%李%");
- 在sql中使用通配符
select * from user where name like "%"#{value}"%"
配置解析
- MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。其中需要掌握的为红色框圈中的部分,其余了解即可
属性(properties)
- 可以通过properties属性来实现引入配置文件。
- 在核心配置文件中使用properties标签来引入。注意:标签顺序不能随便写入,必须按照规定的顺序来写。
<properties resource="db.properties"/>
- 直接引入外部配置文件db.properties
类型别名(typeAliases)
- 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如在方法中,返回值类型为xx.xx.xx.xx,此名称太过于繁琐,可以起别名。
- 方式1:通过tyoeAlies
- mybaties-config.xml与UserMpper.xml
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.byx.pojo.User" alias="User"/>
</typeAliases>
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
可以看出起了别名之后,返回值类型可以用别名来替代。
- 方法2:通过package。指定一个报名,Mybatis会在包名下搜索需要的javaBean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值(如下所示)。
<!--可以给实体类起别名-->
<typeAliases>
<package name="com.byx.pojo"/>
</typeAliases>
<select id="getUserList" resultType="user">
select * from mybatis.user
</select>
@Alias("\user")
public class User{
...
}
通过这样的方式,也可实现别名。
映射器(mappers)
- MpperRegistry:注册绑定我们的Mapper文件
- 方式1:推荐使用
<mappers>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
- 方式2:
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
- 方式2注意点:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
- others可以看官方文档。
生命周期和作用域
- SqlSessionFactoryBuilder:作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
- SqlSessionFactory:一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。因此SqlSessionFactory 的最佳作用域是应用作用域。
- SqlSession:如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。所以SqlSession 的最佳的作用域是请求或方法作用域