java程序里面的Mybatis含源码分析.docx

上传人:b****8 文档编号:28870019 上传时间:2023-07-20 格式:DOCX 页数:66 大小:2.65MB
下载 相关 举报
java程序里面的Mybatis含源码分析.docx_第1页
第1页 / 共66页
java程序里面的Mybatis含源码分析.docx_第2页
第2页 / 共66页
java程序里面的Mybatis含源码分析.docx_第3页
第3页 / 共66页
java程序里面的Mybatis含源码分析.docx_第4页
第4页 / 共66页
java程序里面的Mybatis含源码分析.docx_第5页
第5页 / 共66页
点击查看更多>>
下载资源
资源描述

java程序里面的Mybatis含源码分析.docx

《java程序里面的Mybatis含源码分析.docx》由会员分享,可在线阅读,更多相关《java程序里面的Mybatis含源码分析.docx(66页珍藏版)》请在冰豆网上搜索。

java程序里面的Mybatis含源码分析.docx

java程序里面的Mybatis含源码分析

Mybatis

配置:

1、引入mybatis-3.1.1.jar

2、新建conf.xml放到src下

conf.xml内容:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN"

"http:

//mybatis.org/dtd/mybatis-3-config.dtd">

mysql:

//localhost:

3306/mybatis"/>

其中environments是环境,可以包含多个environment,默认使用default属性对应的。

transactionManager是事务管理配置,可以是JDBC或者MANAGED。

JDBC表示事务用jdbc来管理

MANAGED表示事务交给spring等容器管理。

dataSourcetype="POOLED"是使用连接池。

mappers指定映射文件的位置。

3、创建实体类

packagecom.test;

publicclassUser{

privateIntegerid;

privateStringname;

privateIntegerage;

publicIntegergetId(){

returnid;

}

publicvoidsetId(Integerid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicIntegergetAge(){

returnage;

}

publicvoidsetAge(Integerage){

this.age=age;

}

}

4、创建映射文件

/MybatisDemo/src/com/test/userMapper.xml

内容:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http:

//mybatis.org/dtd/mybatis-3-mapper.dtd">

select*fromuserswhereid=#{aaa}

其中#{aaa}是占位符,由于只有一个参数,所以名字可以任意取,这里是aaa。

5、客户端调用

packagecom.test;

importjava.io.InputStream;

importorg.apache.ibatis.session.SqlSession;

importorg.apache.ibatis.session.SqlSessionFactory;

importorg.apache.ibatis.session.SqlSessionFactoryBuilder;

publicclassTest{

publicstaticvoidmain(String[]args){

//取得conf.xml总体配置文件的输入流

InputStreamis=Test.class.getClassLoader().getResourceAsStream("conf.xml");

//构建sessionFactory

SqlSessionFactorysessionFactory=newSqlSessionFactoryBuilder().build(is);

//取得session

SqlSessionsqlSession=sessionFactory.openSession();

//statement对应userMapper.xml中的namesapce+标签id

Stringstatement="com.test.userMapper.queryUser";

//查询

Useruser=sqlSession.selectOne(statement,1);

System.out.println(user.getName());//输出Tom

}

}

其中statement也可以是"queryUser"短名称,它会自动去找命名空间,但这样不太好,如果2个命名空间都有id为queryUser的标签,这里就会报错,因此还是建议使用全名。

增删改查操作

userMapper.xml配置:

--新增,parameterType指定传入参数类型-->

insertintousers(name,age)

values(#{name},#{age})

--更新,parameterType指定传入参数类型-->

updateusers

setname=#{name},age=#{age}

whereid=#{id}

--删除,parameterType指定传入参数类型-->

deletefromusers

whereid=#{id}

--查询列表,resultType指定返回列表的元素类型-->

select*fromusers

增删改查的标签对应不同的sql语句,其实标签只是为了可读性,运行的时候只会看里面的语句,不会因为是update标签就一定执行update操作,例如update标签里面可以使insert语句,执行insert操作。

标签起一定的检查作用,例如update标签就必须配置parameterType属性,否则运行报错。

对应测试代码:

@Test

publicvoidtestInsert(){

SqlSessionsqlSession=MybatisUtils.getFactory().openSession();

Stringstatement="com.test.userMapper.addUser";

Useruser=newUser();

user.setName("hello");

user.setAge(99);

sqlSession.insert(statement,user);

sqlSmit();

}

@Test

publicvoidtestUpdate(){

SqlSessionsqlSession=MybatisUtils.getFactory().openSession();

Stringstatement="com.test.userMapper.updateUser";

Useruser=newUser();

user.setName("test2");

user.setAge(105);

user.setId

(2);

sqlSession.update(statement,user);

sqlSmit();

}

@Test

publicvoidtestDelete(){

SqlSessionsqlSession=MybatisUtils.getFactory().openSession();

Stringstatement="com.test.userMapper.deleteUser";

sqlSession.delete(statement,4);

sqlSmit();

}

@Test

publicvoidtestQueryAllUsers(){

SqlSessionsqlSession=MybatisUtils.getFactory().openSession();

Stringstatement="com.test.userMapper.queryAllUsers";

Listusers=sqlSession.selectList(statement);

System.out.println(users);

}

其中sqlSmit();是提交事务,openSession()取得的session默认不自动提交事务,如果是openSession(true)会自动提交

使用注解方式(很少用,只用于简单查询的情况)

1、创建接口

packagecom.test;

importjava.util.List;

importorg.apache.ibatis.annotations.Delete;

importorg.apache.ibatis.annotations.Insert;

importorg.apache.ibatis.annotations.Select;

importorg.apache.ibatis.annotations.Update;

publicinterfaceUserMapper{

@Insert("insertintousers(name,age)values(#{name},#{age})")

publicintinsertUser(Useruser);

@Update("updateuserssetname=#{name},age=#{age}whereid=#{id}")

publicintupdateUser(Useruser);

@Delete("deletefromuserswhereid=#{id}")

publicintdeleteUser(intid);

@Select("select*fromusers")

publicListqueryAllUsers();

@Select("select*fromuserswhereid=#{aaa}")

publicUserqueryById(intid);

}

2、conf.xml引入

3、测试代码

@Test

publicvoidtestAnnotation(){

SqlSessionsqlSession=MybatisUtils.getFactory().openSession();

UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);

System.out.println(userMapper.queryAllUsers());

}

其实就是用UserMapper接口代替了xml文件。

用log4j打印Sql语句等日志

1、引入log4j-1.2.16.jar

2、src下新建log4j.xml(也可以是log4j.properties),内容:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPElog4j:

configurationSYSTEM"log4j.dtd">

configurationxmlns:

log4j="http:

//jakarta.apache.org/log4j/">

value="%-5p%d{MM-ddHH:

mm:

ss,SSS}%m(%F:

%L)\n"/>

configuration>

此时即可打印出sql语句:

用resultMap映射实体类属性与表字段名

如果数据库表字段名与实体类属性名不一致,则需要建立映射,一种方法是select语句中为字段起别名,如:

selectuser_idasidfromusers

另一种是使用mybatis的resultMap映射,如:

--查询列表,resultType指定返回列表的元素类型-->

select*fromusers

--映射实体类属性名与表字段名-->

其中resultMap="UserResultMap"与resultMap标签的id对应。

resultMap标签内部的id标签和result标签可以互换,用id或者result只是为了方便阅读,一般id就是主键。

用association标签处理一对一、多对一封装(封装对象属性)

association在resultMap标签内,用于封装实体类属性的映射,当实体对象间有引用关系时,可以用association处理,如:

实体类

publicclassTeacher{

privateintid;

privateStringname;

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

}

publicclassClasses{

privateintid;

privateStringname;

privateTeacherteacher;

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicTeachergetTeacher(){

returnteacher;

}

publicvoidsetTeacher(Teacherteacher){

this.teacher=teacher;

}

}

这里Classes类有Teacher属性。

关联表查询方式(也叫嵌套结果)

通过关联表查询,一条sql查询出结果,如:

映射文件配置:

select*fromclassa,teacherb

wherea.teacher_id=b.t_id

--映射实体类属性名与表字段名-->

其中association用于封装对象属性,property是属性名称,javaType是封装后的类型,需要跟property属性的类型一致。

association内部的id和result就是Teacher的属性,association就相当于Classes中Teacher属性的映射。

多次查询方式(也叫嵌套查询)

先查询出Classes信息,然后再查Classes对应的Teacher信息,如:

select*fromteacherwheret_id=#{id}

select*fromclass

--映射实体类属性名与表字段名-->

这里的select="queryTeacher"会去找queryTeacher标签查询Teacher,传入column="teacher_id"列对应的值(column指定的相当于外键字段)

用collection标签处理一对多封装(封装List、Set等属性)

实体类

publicclassClasses{

privateintid;

privateStringname;

privateListstudents;

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicListgetStudents(){

returnstudents;

}

publicvoidsetStudents(List

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1