MyBatis学习
Posted miantiao312
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis学习相关的知识,希望对你有一定的参考价值。
1、Mybatis入门Demo实践
A、添加用户
B、更新用户
C、删除用户
重点:mysql自增主键返回
添加用户时候,如何返回自增主键?
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
<!-- selectKey将主键返回,需要再返回
keyProperty:返回的主键存储在pojo中的哪个属性
order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,
所以这里selectKey的执行顺序为after;resultType:返回的主键是什么类型
LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
value(#{username},#{birthday},#{sex},#{address})
</insert>
添加selectKey实现将主键返回
keyProperty:返回的主键存储在pojo中的哪个属性
order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
resultType:返回的主键是什么类型
LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。
Mysql使用 uuid实现主键
<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
select uuid()
</selectKey>
insert into user(username,birthday,sex,address)
value(#{username},#{birthday},#{sex},#{address})
</insert>
注意这里使用的order是"BEFORE"
1、继续操作 User.xml实现用户的删除和更新
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<!-- 更新用户数据 -->
<update id="updateUser" parameterType="com.kid.mybatis.pojo.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
2、测试文件
//创建会话工厂
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void createSqlSessionFactory() throws Exception {
//第一步:创建一个SQLSessionFactoryBuilder对象。
SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
//第二步:加载配置文件。
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//第三步:创建SQLSessionFactory对象
sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
}
@Test //添加用户信息
public void insertTest() {
// 数据库会话实例
SqlSession sqlSession = null;
try {
// 创建数据库会话实例sqlSession
sqlSession = sqlSessionFactory.openSession();
//创建User对象
User user = new User();
user.setUsername("赵云");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("上海");
//插入数据
sqlSession.insert("insertUser",user);
System.out.println(user.getId());
//提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
@Test //删除用户
public void deleteUserById() {
//数据库会话实例
SqlSession sqlSession=null;
try {
// 创建数据库会话实例sqlSession
sqlSession=sqlSessionFactory.openSession();
//删除用户
sqlSession.delete("deleteUserById",16);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
@Test //更新用户数据
public void uodateUserTest() {
// 数据库会话实例
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
// 添加用户信息
User user = new User();
user.setId(26);
user.setUsername("张小明");
user.setAddress("陕西西安");
user.setSex("1");
sqlSession.update("updateUser", user);
// 提交事务
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
总结
1、Mybatis解决jdbc编程的问题
a、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
b、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
c、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
d、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
2、mybatis与hibernate不同
a、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML
或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
b、Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求
不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。
但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
c、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发
可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
以上是关于MyBatis学习的主要内容,如果未能解决你的问题,请参考以下文章
markdown [mybatis参考]关于mybatis #mybatis的一些片段