cehkongfumybatis入门.docx
《cehkongfumybatis入门.docx》由会员分享,可在线阅读,更多相关《cehkongfumybatis入门.docx(29页珍藏版)》请在冰豆网上搜索。
cehkongfumybatis入门
以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。
性能也比hibernate好。
而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。
后来项目结束了,我也没写总结文档。
已经过去好久了。
但最近突然又对这个ORM工具感兴趣。
因为接下来自己的项目中很有可能采用这个ORM工具。
所以在此重新温习了一下mybatis,因此就有了这个系列的mybatis教程。
什么是mybatis
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlanOldJavaObjects,普通的Java对象)映射成数据库中的记录.
orm工具的基本思想
无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:
1.从配置文件(通常是XML配置文件中)得到sessionfactory.
2.由sessionfactory 产生session
3.在session中完成对数据的增删改查和事务提交等.
4.在用完之后关闭session。
5.在java对象和数据库之间有做mapping的配置文件,也通常是xml文件。
一、mybatis开发环境搭建
建立一个叫做sm的web工程,将mysql-connector-java-5.1.21.jar,
mybatis-3.2.2.jar两个jar包拷贝到web工程的lib目录下面,创建mysql数据库sm(注意编码为utf-8),并创建user表,并插入几条数据。
createtableuser(
idint(12)primarykey,
userNamevarchar(16),
userAgevarchar(4),
userAddressvarchar(64)
);
INSERTINTOuser(id,userName,userAge,userAddress)VALUES(0,'summer','100','shanghai);
INSERTINTOuser(id,userName,userAge,userAddress)VALUES(1,'张三','21','tsinghua');
INSERTINTOuser(id,userName,userAge,userAddress)VALUES(2,'李四','18','peking');
INSERTINTOuser(id,userName,userAge,userAddress)VALUES(3,'陈真','78','中国人');
INSERTINTOuser(id,userName,userAge,userAddress)VALUES(4,'霍元甲','103','北京');
到此为止,前期准备工作就完成了。
下面开始真正配置sm项目了。
1.在sm里面创建两个源码目录,分别为src_user,test_src
2.设置sm配置文件:
Configuration.xml,在src_user目录下建立此文件,内容如下
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN"
"http:
//mybatis.org/dtd/mybatis-3-config.dtd">
mysql:
//127.0.0.1:
3306/sm"/>
3.建立与数据库对应的javaclass,以及映射文件.
在src_user下建立package:
my.ceh.mybatis.model,并在这个package下建立User类:
packagemy.ceh.mybatis.model;
publicclassUser{
privateintid;
privateStringuserName;
privateStringuserAge;
privateStringuserAddress;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetUserAge(){
returnuserAge;
}
publicvoidsetUserAge(StringuserAge){
this.userAge=userAge;
}
publicStringgetUserAddress(){
returnuserAddress;
}
publicvoidsetUserAddress(StringuserAddress){
this.userAddress=userAddress;
}
}
同时建立这个User的映射文件User.xml:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN"
"http:
//mybatis.org/dtd/mybatis-3-mapper.dtd">
select*fromuserwhereid=#{id}
下面对这几个配置文件解释下:
1.Configuration.xml是mybatis用来建立sessionFactory用的,里面主要包含了数据库连接相关东西,还有java类所对应的别名,比如这个别名非常重要,你在具体的类的映射中,比如User.xml中resultType就是对应这里的。
要保持一致,当然这里的resultType还有另外单独的定义方式,后面再说。
2. Configuration.xml里面的是包含要映射的类的xml配置文件。
3.在User.xml文件里面主要是定义各种SQL语句,以及这些语句的参数,以及要返回的类型等.
开始测试
在test_src源码目录下建立my.ceh.mybatis.test这个package,并建立测试类Test:
packagemy.ceh.mybatis.test;
importjava.io.Reader;
importmy.ceh.mybatis.model.User;
importorg.apache.ibatis.io.Resources;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
publicclassTest{
privatestaticSqlSessionFactorysqlSessionFactory;
privatestaticReaderreader;
static{
try{
reader=Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory=newSqlSessionFactoryBuilder().build(reader);
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticSqlSessionFactorygetSession(){
returnsqlSessionFactory;
}
publicstaticvoidmain(String[]args){
SqlSessionsession=sqlSessionFactory.openSession();
try{
Useruser=(User)session.selectOne(
"my.ceh.mybatis.models.UserMapper.selectUserByID",1);
System.out.println(user.getUserAddress());
System.out.println(user.getUserName());
}finally{
session.close();
}
}
}
现在运行这个程序,是不是得到查询结果了。
恭喜你,环境搭建配置成功,接下来第二章,将讲述基于接口的操作方式,增删改查。
二、以接口的方式编程
session.selectOne("my.ceh.mybatis.models.UserMapper.selectUserByID",1)
其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细过程:
在src_user源码目录下建立my.ceh.mybatis.inter这个包,并建立接口类IUserOperation,内容如下:
packagemy.ceh.mybatis.inter;
importmy.ceh.mybatis.model.User;
publicinterfaceIUserOperation{
publicUserselectUserByID(intid);
}
请注意,这里面有一个方法名selectUserByID必须与User.xml里面配置的select的id对应(测试代码如下:
privatestaticvoidtest02(){
SqlSessionsession=sqlSessionFactory.openSession();
try{
IUserOperationuserOperation=session.getMapper(IUserOperation.class);
Useruser=userOperation.selectUserByID
(1);
System.out.println(user.getUserAddress());
System.out.println(user.getUserName());
}finally{
session.close();
}
}
注意:
User.xml文件此时需要作出相应的修改,mapper标签中的namespace属性需要改成
三、实现数据的增删改查
前面已经讲到用接口的方式编程。
这种方式,要注意的一个地方就是。
在User.xml 的配置文件中,mappernamespace="my.ceh.mybatis.inter.IUserOperation",命名空间非常重要,不能有错,必须与我们定义的package和接口一致。
如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
1.用mybatis查询数据,包括列表
2.用mybatis增加数据
3.用mybatis更新数据.
4.用mybatis删除数据.
查询数据,前面已经讲过简单的,主要看查询出列表的
查询出列表,也就是返回list,在我们这个例子中也就是List,这种方式返回数据,需要在User.xml里面配置返回的类型resultMap,注意不是resultType,而这个resultMap所对应的应该是我们自己配置的
--为了返回list类型而定义的returnMap-->
在User.xml中增加查询列表的语句:
--返回list的select语句,注意resultMap的值是指向前面定义好的-->
select*fromuserwhereuserNamelike#{userName}
在IUserOperation接口中增加方法:
publicListselectUsers(StringuserName);
现在在Test类中做测试
privatestaticvoidtest03(){
getUserList("%");
}
publicstaticvoidgetUserList(StringuserName){
SqlSessionsession=sqlSessionFactory.openSession();
try{
IUserOperationuserOperation=session.getMapper(IUserOperation.class);
Listusers=userOperation.selectUsers(userName);
for(Useruser:
users){
System.out.println(user.getId()+":
"+user.getUserName()+":
"+user.getUserAddress());
}
}finally{
session.close();
}
}
可以看到,结果成功查询出来。
如果是查询单个数据的话,用第二讲用过的方法就可以了。
用mybatis增加数据
在IUserOperation接口中增加方法:
publicvoidaddUser(Useruser);
在User.xml中配置
--
执行增加操作的SQL语句。
id和parameterType分别与IUserOperation接口中的addUser方法的名字和
参数类型一致。
以#{name}的形式引用Student参数的name属性,MyBatis将使用反射读取Student参数
的此属性。
#{name}中name大小写敏感。
引用其他的gender等属性与此一致。
useGeneratedKeys设置
为"true"表明要MyBatis获取由数据库自动生成的主键;keyProperty="id"指定把获取到的主键值注入
到Student的id属性
-->
insertintouser(userName,userAge,userAddress)
values(#{userName},#{userAge},#{userAddress})
然后在Test中写测试方法:
//测试增加,增加后,必须提交事务,否则不会写入到数据库.
publicstaticvoidaddUser(){
Useruser=newUser();
user.setUserAddress("人民广场");
user.setUserName("飞鸟");
user.setUserAge("80");
SqlSessionsession=sqlSessionFactory.openSession();
try{
IUserOperationuserOperation=session.getMapper(IUserOperation.class);
userOperation.addUser(user);
mit();
System.out.println("当前增加的用户id为:
"+user.getId());
}finally{
session.close();
}
}
用mybatis更新数据
方法类似,先在IUserOperation中增加方法:
publicvoidaddUser(Useruser);
然后配置User.xml
updateusersetuserName=#{userName},userAge=#{userAge},userAddress=#{userAddress}whereid=#{id}
Test类总的测试方法如下:
publicstaticvoidupdateUser(){
//先得到用户,然后修改,提交。
SqlSessionsession=sqlSessionFactory.openSession();
try{
IUserOperationuserOperation=session.getMapper(IUserOperation.class);
Useruser=userOperation.selectUserByID(4);
user.setUserAddress("原来是魔都的浦东创新园区");
userOperation.updateUser(user);
mit();
}finally{
session.close();
}
}
用mybatis删除数据
同理,IUserOperation增加方法:
publicvoiddeleteUser(intid);
配置User.xml
deletefromuserwhereid=#{id}
然后在Test类中写测试方法:
/**
*删除数据,删除一定要commit.
*@paramid
*/
publicstaticvoiddeleteUser(intid){
SqlSessionsession=sqlSessionFactory.openSession();
try{
IUserOperationuserOperation=session.getMapper(IUserOperation.class);
userOperation.deleteUser(id);
mit();
}finally{
session.close();
}
}
这样,所有增删改查都完成了,注意在增加,更改,删除的时候要调用mit(),这样才会真正对数据库进行操作,否则是没有提交的。
到此为止,简单的单表操作,应该都会了,接下来的时间讲讲表联合查询,以及结果集的选取。
四、实现关联数据的查询
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。
这些查询是如何处理的呢,这一讲就讲这个问题。
我们首先创建一个Article这个表,并初始化数据.
droptableifexistsarticle;
createtablearticle(
idint(11)notnullauto_increment,
useridint(11)notnull,
titlevarcha