java程序里面的Mybatis含源码分析.docx
- 文档编号:16705202
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:66
- 大小:2.65MB
java程序里面的Mybatis含源码分析.docx
《java程序里面的Mybatis含源码分析.docx》由会员分享,可在线阅读,更多相关《java程序里面的Mybatis含源码分析.docx(66页珍藏版)》请在冰点文库上搜索。
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"; List 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") publicList @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; privateList publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicList returnstudents; } publicvoidsetStudents(List
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 程序 里面 Mybatis 源码 分析