Mybatis框架实验报告
java mybatis 案例
java mybatis 案例摘要:1.Java MyBatis 简介2.MyBatis 的优势和应用场景3.Java MyBatis 案例:电商系统用户订单查询4.案例实现:数据库表设计、实体类、Mapper 接口、Mapper XML 文件、Service 层、Controller 层5.总结与展望正文:Java MyBatis 是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集,可以让开发者专注于SQL 本身,提高了开发效率。
它主要适用于数据访问复杂、需要根据不同业务场景定制SQL 的应用程序。
在众多Java Web 项目中,电商系统是一个典型应用场景。
本文将通过一个简单的电商系统用户订单查询案例,介绍如何使用Java MyBatis 进行开发。
首先,设计数据库表。
我们创建一个名为“orders”的表,包含以下字段:id(主键)、user_id(用户ID)、product_id(商品ID)、order_status (订单状态)、create_time(创建时间)和update_time(更新时间)。
接下来,创建对应的实体类。
在Java 项目中,创建一个名为“Order”的类,包含与数据库表对应的属性,并使用getter 和setter 方法。
然后,创建Mapper 接口。
在项目中创建一个名为“OrderMapper”的接口,定义如下方法:```javaList<Order> findOrdersByUserId(Integer userId);```接着,创建Mapper XML 文件。
在项目中创建一个名为“OrderMapper.xml”的文件,编写SQL 映射语句:```xml<mapper namespace="com.example.mapper.OrderMapper"> <select id="findOrdersByUserId"resultType="com.example.entity.Order">SELECT * FROM orders WHERE user_id = #{userId} </select></mapper>```接下来,创建Service 层。
mybatis数据库开发实验总结
mybatis数据库开发实验总结MyBatis数据库开发实验总结一、引言MyBatis是一种Java持久化框架,它简化了数据库操作的开发过程。
在本次实验中,我们使用MyBatis进行了数据库开发,通过对实验过程的总结,可以对MyBatis的使用方法和注意事项有更深入的了解。
二、实验目的本次实验的目的是熟悉MyBatis的基本用法,掌握MyBatis的配置和使用方法。
具体来说,我们需要完成以下几个任务:1. 创建数据库表并插入数据;2. 编写实体类和映射文件;3. 配置MyBatis的数据库连接信息;4. 编写数据库操作接口和SQL语句;5. 测试数据库操作功能。
三、实验步骤1. 安装MyBatis并配置开发环境。
2. 创建数据库表,包括表结构和数据。
3. 编写实体类,对应数据库表的字段。
4. 创建映射文件,配置实体类和数据库表的映射关系。
5. 配置MyBatis的数据库连接信息,包括数据库驱动、连接URL、用户名和密码。
6. 编写数据库操作接口,定义数据库操作的方法。
7. 编写SQL语句,包括插入、更新、删除和查询等操作。
8. 测试数据库操作功能,验证数据库操作的正确性和可靠性。
四、实验结果与分析经过实验,我们成功完成了数据库的创建和数据的插入。
通过编写实体类和映射文件,我们实现了实体类和数据库表的映射关系。
在数据库操作接口中,我们定义了各种数据库操作的方法,并在SQL 语句中实现了这些操作。
最后,通过测试数据库操作功能,我们验证了数据库操作的正确性和可靠性。
五、实验总结通过本次实验,我对MyBatis的使用方法和注意事项有了更深入的了解。
首先,我们需要正确配置MyBatis的数据库连接信息,包括数据库驱动、连接URL、用户名和密码。
其次,我们需要编写实体类和映射文件,对应数据库表的字段和映射关系。
在数据库操作接口中,我们定义了各种数据库操作的方法,并在SQL语句中实现了这些操作。
最后,通过测试数据库操作功能,我们验证了数据库操作的正确性和可靠性。
mybatis实验心得
mybatis实验心得MyBatis是一种流行的持久层框架,它简化了Java程序与关系数据库之间的交互。
在进行了两周的MyBatis实验后,我对该框架有了深入的了解,并在这份心得体会文章中与大家分享一下。
首先,我要说的是MyBatis的优点之一是它提供了易于理解和使用的SQL映射语言。
通过将SQL语句与Java代码分离,使得代码更加整洁和可维护。
我们可以使用注解或者XML来编写SQL语句,这取决于个人的喜好和项目的需求。
在我的实验中,我选择了XML方式编写SQL语句,因为我觉得这样更加直观和清晰。
其次,MyBatis具有出色的性能。
它采用了预编译的语句和缓存技术,可以有效地提高数据库访问的速度。
在实验中,我对比了使用MyBatis和直接使用JDBC的性能差异,结果表明使用MyBatis的性能要明显优于直接使用JDBC。
这是因为MyBatis使用数据库连接池来管理数据库连接,避免了频繁的连接和断开操作,从而降低了应用程序的开销。
另外,MyBatis还支持动态SQL语句的编写,这在实际开发中非常有用。
通过使用动态SQL,我们可以根据条件来动态地生成不同的SQL语句,从而实现更加灵活和可扩展的查询。
在我的实验中,我使用动态SQL实现了一个根据多个条件进行检索的功能,这对于满足不同的查询需求非常有帮助。
总的来说,通过这次实验,我对MyBatis的使用有了更深入的了解。
我认为MyBatis是一种非常实用的持久层框架。
它简化了数据库操作的代码,提高了开发效率。
同时,它也具有出色的性能和灵活的查询能力。
通过使用MyBatis,我们可以更加专注于业务逻辑的开发,而不需要过多地关注数据库操作的细节。
当然,MyBatis也存在一些不足之处。
首先,由于MyBatis采用了基于字符串的SQL语句编写方式,因此在编写SQL语句时容易出现拼写错误或者语法错误。
这对于开发人员来说是一个潜在的风险。
其次,MyBatis的学习曲线相对较陡峭,需要花费一定的时间和精力去学习和掌握它的使用。
【Java】关于MyBatis框架的总结
【Java】关于MyBatis框架的总结最近在学习MyBatis框架,我在这⾥记录⼀下学习MyBatis过程中的⼼得体会。
Mybatis是什么?使⽤它我们可以做什么?MyBatis是⼀个开源的数据持久层框架,它内部封装了通过JDBC访问数据库的操作,⽀持普通的SQL查询、存储过程和⾼级映射,⼏乎消除了所有的JDBC代码和参数的⼿⼯设置以及结果集的检索。
MyBatis作为持久层框架,其主要思想是将程序中⼤量SQL语句剥离出来,配置在配置⽂件中,实现SQL的灵活配置。
这样做的好处是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置⽂件中修改SQL。
Mybatis通过简单的XML或者注解进⾏配置和原始映射,将实体类和SQL语句之间建⽴映射关系,是⼀种半⾃动化的ORM实现。
MyBatis环境搭建这⾥我们使⽤的编译程序以Eclipse为例。
下载jar包==>部署jar包==>编写configuration核⼼配置⽂件==>创建pojo实体类==>创建DAO接⼝==>创建SQL映射⽂件==>编写测试类需要的jar包:创建MyBatis核⼼配置⽂件configuration.xmlMyBatis核⼼配置⽂件主要⽤于配置数据库连接和MyBatis运⾏时所需的各种特性,包含了设置和影响MyBatis⾏为的属性MyBatis的核⼼接⼝和类1)每个MyBatis的应⽤程序都以⼀个SqlSessionFactory对象的实例为核⼼。
2)⾸先获取SqlSessionFactoryBuilder对象,可以根据XML配置⽂件或Configuration类的实例构建该对象。
3)然后获取SqlSessionFactory对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获得。
4)使⽤SqlSessionFactory对象获取SqlSession实例。
SqlSessionFactoryBuilder负责构建SqlSessionFactory,提供多个build()⽅法的重载,主要分为三个:build(Reader reader,String environment,Properties properties)build(InputStream inputStream,String environment,Properties properties)build(Configuration config)最⼤的特点是⽤过即丢,⼀旦创建了SqlSessionFactory对象之后,这个类就不再需要存在了,因此SqlSessionFactoryBuilder的最佳作⽤范围就是存在于⽅法体内,也就是局部变量。
基于mybatis的学生信息管理系统实训总结
基于mybatis的学生信息管理系统实训总结学生信息管理系统是一个常见的基于数据库的管理系统,通过MyBatis等框架的实现,可以实现对学生的信息管理、查询、修改和删除等操作。
以下是学生信息管理系统的实训总结:1、数据库设计和建模:首先需要进行数据库设计和建模,确定学生信息的数据结构,包括学生的基本信息(姓名、学号、性别等)和选课信息(课程名称、成绩等)。
同时需要确定数据表之间的关系,如学生和课程之间的关系。
2、MyBatis框架的配置和基本使用:MyBatis是一款优秀的ORM 框架,可以实现数据库操作和对象之间的映射。
在实训中需要掌握MyBatis框架的配置和使用方法,包括定义Mapper接口和XML映射文件,以及使用MyBatis进行数据库的增删改查操作。
3、学生信息管理功能的实现:学生信息管理是系统的核心功能,包括学生的基本信息查询、修改和删除,以及学生选课信息的查询和修改。
在实训中需要掌握如何使用MyBatis进行数据的查询和更新操作,以及如何通过前端界面实现对学生信息的操作和管理。
4、用户权限管理:学生信息管理系统需要设置用户权限管理,以保证学生信息的安全性和保密性。
在实训中需要实现用户注册、登录、权限分配等功能,同时需要保证用户信息的安全性和验证机制。
5、系统测试和调试:最后需要对系统进行测试和调试,确保系统的稳定性和正确性。
在实训中需要对系统的各个功能模块进行测试,并记录测试结果,及时发现和解决问题,确保系统的质量。
在实现学生信息管理系统时,需要注意以下几点:1、数据库设计和建模是系统的基础,需要充分考虑数据结构和关系的设计。
2、MyBatis框架的配置和使用是系统的关键,需要熟练掌握ORM 框架的基本原理和使用方法。
3、功能模块的实现需要注重代码的可读性和可维护性,遵循面向对象编程的基本原则。
4、用户权限管理是系统的安全保障,需要充分考虑用户验证、授权和安全保护机制的实现。
5、系统测试和调试是保证系统质量的重要环节,需要充分测试各个功能模块的正确性和稳定性。
mybatis原理及sqlsession 实验总结
MyBatis 原理及 SQLSession 实验总结MyBatis 原理:MyBatis 是一款基于 Java 的持久层框架,它主要解决了关系型数据库和 Java 对象之间的映射问题。
以下是 MyBatis 的核心原理:1.配置文件:–MyBatis 的配置文件是 XML 格式的文件,包含了数据库连接信息、映射文件路径、插件配置等。
2.映射文件:–映射文件定义了 SQL 语句和 Java 对象之间的映射关系。
每个 SQL 语句都可以在映射文件中找到对应的配置。
3.SqlSessionFactory:–SqlSessionFactory 是 MyBatis 的核心接口之一,它的作用是创建SqlSession 实例。
SqlSessionFactory 的实例一般通过 XML 配置文件或者 Java 代码创建。
4.SqlSession:–SqlSession 是与数据库交互的主要接口,提供了执行 SQL 语句、获取映射器(Mapper)、提交事务等方法。
SqlSession 的实例是由SqlSessionFactory 创建的。
5.Mapper 接口:–Mapper 接口是定义 SQL 语句和 Java 方法之间映射关系的接口。
MyBatis 会根据映射文件的配置生成 Mapper 接口的实现类。
6.Executor:–Executor 负责执行 SQL 语句,它有两个实现类:SimpleExecutor 和ReuseExecutor。
SimpleExecutor 每次都创建新的 Statement 对象,而ReuseExecutor 会复用 Statement 对象。
7.ResultHandler 和 RowBounds:–ResultHandler 用于处理查询结果,RowBounds 用于分页。
SQLSession 实验总结:在实验中,有以下关于 SQLSession 的重要知识点:1.SqlSession 的生命周期:–SqlSession 是线程不安全的,应该在方法体内创建和关闭。
TKmybatis的框架介绍和原理分析及Mybatis新特性
TKmybatis的框架介绍和原理分析及Mybatis新特性tkmybatis是在mybatis框架的基础上提供了很多⼯具,让开发更加⾼效,下⾯来看看这个框架的基本使⽤,后⾯会对相关源码进⾏分析,感兴趣的同学可以看⼀下,挺不错的⼀个⼯具实现对员⼯表的增删改查的代码java的dao层接⼝1. public interface WorkerMapper extends Mapper<Worker> {2. }xml映射⽂件1. <?xml version="1.0" encoding="UTF-8"?>2. <!DOCTYPE mapper PUBLIC "-////DTD Mapper3.0//EN" "/dtd/mybatis-3-mapper.dtd">3. <mapper namespace="com.jjs.kaiwen.dao.WorkerMapper">4. <resultMap id="BaseResultMap" type="com.jjs.kaiwen.model.Worker">5. <!--6. WARNING - @mbggenerated7. -->8. <id column="id" jdbcType="INTEGER" property="id" />9. <result column="worker_id" jdbcType="VARCHAR" property="workerId" />10. <result column="name" jdbcType="VARCHAR" property="name" />11. <result column="org_id" jdbcType="INTEGER" property="orgId" />12. <result column="status" jdbcType="VARCHAR" property="status" />13. <result column="role_id" property="roleId" jdbcType="INTEGER" />14. </resultMap>15. </mapper>实体对象1. @Table(name = "worker")2. public class Worker {3. @Id4. @GeneratedValue(strategy = GenerationType.IDENTITY)5. private Integer id;6.7. @Column(name = "worker_id")8. private String workerId;9.10. private String name;11.12. @Column(name = "org_id")13. private Integer orgId;14.15. private String status;16.17. @Column(name = "role_id")18. private Integer roleId;19.20. // getters and setters ...21. }以上就是实现对Worker进⾏增删改查的所有代码,包括选择性更新、插⼊、删除等,所有的⽅法列表如下以后对表字段的添加或修改只需要更改实体对象的注解,不需要修改xml映射⽂件,如将worker_id改成worker_no1. @Column(name = "worker_no")2. private String workerNo;数据源的配置,只需要将org.mybatis.spring.mapper.MapperScannerConfigurer改成tk.mybatis.spring.mapper.MapperScannerConfigurer,然后加⼀个属性,也可不加,因为框架提供了默认实现1. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">2. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />3. <property name="basePackage" value="com.jjs.zanbi.dao" />4. <property name="properties">5. <value>6. mappers=mon.Mapper7. </value>8. </property>9. </bean>⽤这个库之后写代码感觉在飞…….如果只是简单的了解此框架到这⾥就可以了,下⾯是对框架实现原理的分析原理的简单分析此框架为我们实现这些功能所有的改动都在Mapper层⾯,所有的Mapper都继承了mon.Mapperpublic interface WorkerMapper extends Mapper<Worker> {}Mapper接⼝的声明如下,可以看到Mapper接⼝实现了所有常⽤的⽅法1. public interface Mapper<T> extends2. BaseMapper<T>,3. ExampleMapper<T>,4. RowBoundsMapper<T>,5. Marker {6.7. }看⼀下完整的UML图,太⼤了,可以⽤新窗⼝打开,放⼤之后再看这⾥选择⼀个接⼝:SelectOneMapper接⼝,对于源码进⾏简单分析,此接⼝声明如下:4. * 根据实体中的属性进⾏查询,只能有⼀个返回值,有多个结果是抛出异常,查询条件使⽤等号5. *6. * @param record7. * @return8. */9. @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")10. T selectOne(T record);11.12. }@SelectProvider是mybatis3之后提供的,⽤于灵活的设置sql来源,这⾥设置了服务提供类和⽅法,但这个库并没有直接⽤method指定的⽅法来返回sql,⽽是在运⾏时进⾏解析的,代码如下1. public class BaseSelectProvider extends MapperTemplate {2.3. public String selectOne(MappedStatement ms) {4. Class<?> entityClass = getEntityClass(ms);5. //修改返回值类型为实体类型6. setResultType(ms, entityClass);7. StringBuilder sql = new StringBuilder();8. sql.append(SqlHelper.selectAllColumns(entityClass));9. sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));10. sql.append(SqlHelper.whereAllIfColumns(entityClass, isNotEmpty()));11. return sql.toString();12. }13. }到这⾥我们就⼤概知道了这个库为我们提供便利的原理了,总的来说就是这个库帮我们提供了对表的基本操作的sql,帮我们省了很多⼯作量,⽽且维护起来也很⽅便,否则我们的xml⽂件动不动就⼏百⾏甚⾄上千⾏对源码的探索不能到这⾥停⽌,最起码要分析到与另⼀个框架的整合点我们知道,mybatis的mapper接⼝是在启动的时候被框架以JdkProxy的形式封装了的,具体对应的类是MapperFactoryBean,这个类中有⼀个checkDaoConfig()⽅法,是从⽗类继承并重写了该⽅法,继承结构如下MapperFactoryBean -> SqlSessionDaoSupport -> DaoSupport这⾥的DaoSupport就是spring提供的Dao的抽象,代码如下1. public abstract class DaoSupport implements InitializingBean {2.3. // spring 完成属性设置后会调⽤此⽅法4. @Override5. public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {6. // 这⾥提供了接⼝供⼦类去实现7. checkDaoConfig();8.9. // Let concrete implementations initialize themselves.10. try {11. initDao();12. }13. catch (Exception ex) {14. throw new BeanInitializationException("Initialization of DAO failed", ex);15. }16. }17.18. protected abstract void checkDaoConfig() throws IllegalArgumentException;19.20. protected void initDao() throws Exception {21. }22.23. }框架⾃定义的MapperFactoryBean重写了checkDaoConfig()⽅法,完成对所有sql语句的设置,代码如下1. @Override2. protected void checkDaoConfig() {3. super.checkDaoConfig();4. //通⽤Mapper5. if (mapperHelper.isExtendCommonMapper(getObjectType())) {6. //这⾥去处理该类所对应的MappedStatement,封装在helper类中处理7. mapperHelper.processConfiguration(getSqlSession().getConfiguration(), getObjectType());8. }9. }MapperHelper的processConfiguration⽅法如下1. public void processConfiguration(Configuration configuration, Class<?> mapperInterface) {2. String prefix;3. if (mapperInterface != null) {4. prefix = mapperInterface.getCanonicalName();5. } else {6. prefix = "";7. }8. for (Object object : new ArrayList<Object>(configuration.getMappedStatements())) {9. if (object instanceof MappedStatement) {10. MappedStatement ms = (MappedStatement) object;11. //检查这个MappedStatement是否属于此映射对象12. if (ms.getId().startsWith(prefix) && isMapperMethod(ms.getId())) {13. if (ms.getSqlSource() instanceof ProviderSqlSource) {14. //去设置该statement的sql语句15. setSqlSource(ms);16. }17. }18. }19. }20. }设置sql的逻辑,提供了⼏种不同类型的sqlsource1. public void setSqlSource(MappedStatement ms) throws Exception {6. try {7. //第⼀种,直接操作ms,不需要返回值8. if (method.getReturnType() == Void.TYPE) {9. method.invoke(this, ms);10. }11. //第⼆种,返回SqlNode12. else if (SqlNode.class.isAssignableFrom(method.getReturnType())) {13. SqlNode sqlNode = (SqlNode) method.invoke(this, ms);14. DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(ms.getConfiguration(), sqlNode);15. setSqlSource(ms, dynamicSqlSource);16. }17. //第三种,返回xml形式的sql字符串18. else if (String.class.equals(method.getReturnType())) {19. String xmlSql = (String) method.invoke(this, ms);20. SqlSource sqlSource = createSqlSource(ms, xmlSql);21. //替换原有的SqlSource22. setSqlSource(ms, sqlSource);到这⾥整个sql的获取流程就分析完了,本⼈⽤这个库写过⼀个⼩项⽬,确实节省了开发的⼯作量,⽽且DAO层的结构更加清晰简洁了关于mybatis新特性从3.4.0开始,mybatis提供对外部表的alias引⽤⽅法,多表联合查询就⽅便多了,我们先看原始的⽅式是怎样做的1. select a.id,,b.bid,b.bname .....2. from user a3. left join room b原始的⽅式是将所有的表字段列出来,再来看⽤新特性怎样做1. select id="selectUsers" resultType="map">2. select3. <include refid="user_col_sql_id"><property name="alias" value="t1"/>,4. <include refid="room_col_sql_id"><property name="alias" value="t2"/>5. from user t16. left join room t27. </select>这⾥主要就是对基本的sql进⾏了复⽤,如果对表进⾏了修改只要在原始的sql节点修改就可以了,就算是5个表的联合查询,sql也是清晰易懂,维护起来会更轻松新版本的mybatis对于对象映射也提供了更友好的⽅式,直接使⽤外部的ResultMap再加上查询语句中的别名就映射完成了1. <resultMap id="workerResultMap" type="com.jjs.kaiwen.model.Worker" extends="BaseResultMap">2. <association property="room" columnPrefix="b_" resultMap="Mapper.BaseResultMap"/>3. </resultMap>更进⼀步敏锐的程序员可能会提出问题,如当多表查询的时候可能会存在字段名称相同的情况,这⾥的解决⽅案是给include添加另⼀个属性1. <include refid="user_col_sql_id_with_alias">2. <property name="alias" value="t"/>3. <property name="prefix" value="t_"/>4. </include>包含prefix的sqlNode如下1. <sql id="base_column_with_alias">2. ${alias}.ID as ${prefix}ID,3. ${alias}.WORKER_ID as ${prefix}WORKER_ID,4. ${alias}.NAME as ${prefix}NAME,5. ${alias}.ZB_ROLE_ID as ${prefix}ZB_ROLE_ID,6. ${alias}.ORG_ID as ${prefix}ORG_ID,7. ${alias}.STATUS as ${prefix}STATUS8. </sql>如果说觉得⼿动写包含alias和prefix的字段⿇烦,可以⽤,mybatis代码⽣成器的插件的⽅式实现,我⾃⼰写了⼀个⽣成器的插件,可以通⽤Service类1. /**2. * Created by Kaiwen3. */4. @Service5. public abstract class CommonServiceImpl<T,PK extends Serializable> implements CommonService<T,PK> {6. /**7. * 泛型注⼊8. */9. @Autowired10. private Mapper<T> mapper;11.12. public T selectByPrimaryKey(PK entityId) {13.14. return mapper.selectByPrimaryKey(entityId);15. }16.17. public int deleteByPrimaryKey(PK entityId) {18. return mapper.deleteByPrimaryKey(entityId);19. }20.21. public int insert(T record) {22. return mapper.insert(record);23. }24.25. public int insertSelective(T record) {26. return mapper.insertSelective(record);27. }28.29. public int updateByPrimaryKeySelective(T record) {30. return mapper.updateByPrimaryKeySelective(record);31. }32.33. public int updateByPrimaryKey(T record) {38. return mapper.selectByExample(example);39. }40. }注⼊⽅式区别1. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">2. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />3. <property name="basePackage" value="com.jjshome.esf.core.dao.school" />4. <property name="properties">5. <value>6. mappers=mon.Mapper7. </value>8. </property>9. </bean>10.11.12. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">13. <property name="basePackage" value="munity,com.jjshome.esf.core.dao.hsl"/>14. </bean><实体类1. package mon.entity.school;2.3. import java.util.Date;4. import javax.persistence.*;5.6. @Table(name = "XQ_SCHOOL_AREA")7. public class SchoolArea {8. /**9. * 主键ID10. */11. @Id12. @Column(name = "ID")13. private Integer id;14.15. /**16. * 城市编码17. */18. @Column(name = "CITY_CODE")19. private String cityCode;20.21. /**22. * 学区名称23. */24. @Column(name = "NAME")25. private String name;26.27. /**28. * 学区名称拼⾳29. */30. @Column(name = "NAME_SPELL")31. private String nameSpell;32.33. /**34. * 状态,1:正常,0:删除35. */36. @Column(name = "STATUS")37. private Byte status;38.39. /**40. * 添加⼈41. */42. @Column(name = "CREATE_ID")43. private String createId;44.45.46. @Transient47. private Integer primaryCount; //⼩学数量48. @Transient49. private Integer middleCount; //初中数量50. @Transient51. private Integer highCount;//⾼中数量TK mybatis Mapper⽂件内容1. <?xml version="1.0" encoding="UTF-8" ?>2. <!DOCTYPE mapper PUBLIC "-////DTD Mapper3.0//EN" "/dtd/mybatis-3-mapper.dtd" >3. <mapper namespace="com.jjshome.esf.core.dao.school.ISchoolAreaDAO" >4. <resultMap id="BaseResultMap" type="mon.entity.school.SchoolArea" >5. <!--6. WARNING - @mbggenerated7. -->8. <id column="ID" property="id" jdbcType="INTEGER" />9. <result column="CITY_CODE" property="cityCode" jdbcType="VARCHAR" />10. <result column="NAME" property="name" jdbcType="VARCHAR" />11. <result column="NAME_SPELL" property="nameSpell" jdbcType="VARCHAR" />12. <result column="STATUS" property="status" jdbcType="TINYINT" />13. <result column="CREATE_ID" property="createId" jdbcType="VARCHAR" />14. <result column="CREATE_DATE" property="createDate" jdbcType="TIMESTAMP" />15. <result column="UPDATE_ID" property="updateId" jdbcType="VARCHAR" />16. <result column="UPDATE_DATE" property="updateDate" jdbcType="TIMESTAMP" />17. <result column="CITY_NAME" property="cityName"/>18. <result column="PRIMARY_COUNT" property="primaryCount"/>19. <result column="MIDDLE_COUNT" property="middleCount"/>20. <result column="HIGH_COUNT" property="highCount"/>21. </resultMap>22.23. <resultMap id="SchoolDetailArea" type="mon.entity.school.SchoolAreaDetail"24. extends="com.jjshome.esf.core.dao.school.ISchoolInfoDAO.SchoolInfo">30. SELECT A.*, AS CITY_NAME,31. (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='553' AND B.STATUS = 1 ) AS PRIMARY_COUNT,32. (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='554' AND B.STATUS = 1 ) AS MIDDLE_COUNT,33. (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='555' AND B.STATUS = 1 ) AS HIGH_COUNT34. FROM XQ_SCHOOL_AREA A35. LEFT JOIN YW_CITY_SETTING C ON A.CITY_CODE = C.CODE36. <where>37. <if test="name != null and name != '' "> LIKE CONCAT('%',#{NAME},'%') </if>38. <if test="areaCityCode != null and areaCityCode != '' "> A.CITY_CODE = #{areaCityCode} </if>39. <if test="keywords != null and keywords != '' ">40. ( LIKE CONCAT('%',#{keywords},'%')41. )42. </if>43. </where>44. </select>45.46.47. <select id="selectAreaIdAndKeyWord" parameterType="java.util.Map" resultMap="BaseResultMap">48. SELECT49. *50. FROM51. XQ_SCHOOL_AREA52. WHERE53. 1=154. <if test="cityId != null">55. AND CITY_CODE=#{cityId}56. </if>57. <if test="key != null and key!=''">58. AND (NAME like CONCAT(#{key},'%' ) or NAME_SPELL like CONCAT(#{key},'%' ))59. </if>60. AND61. STATUS=162. <if test="pageSize != null">63. limit #{pageSize}64. </if>65. </select>66.67.68. <!--查询学区详情列表-->69. <select id="selectAreaDetailByPage" parameterType="map" resultMap="SchoolDetailArea">70.71. SELECT A.* , AS SCHOOL_AREA_NAME , AS CITY_NAME, AS AREA_NAME FROM XQ_SCHOOL_INFO A72. LEFT JOIN XQ_SCHOOL_AREA B ON A.AREA_ID = B.ID73. LEFT JOIN YW_CITY_SETTING C ON A.CITY_CODE = C.CODE74. LEFT JOIN YW_CITY_SETTING D ON A.AREA_CODE = D.CODE75.76. WHERE A.STATUS = 1 AND B.STATUS =177. <if test="areaId != null and areaId.length() > 0"> AND A.AREA_ID = #{areaId} </if>78. <if test="typeList != null and typeList.size > 0">79. AND80. A.TYPE IN81. <foreach collection="typeList" item="item" index="index" open="(" close=")" separator=",">82. #{item}83. </foreach>84. </if>85. <if test="name != null and name != '' "> AND LIKE CONCAT('%',#{name},'%') </if>86. </select>87.88. </mapper>普通mybatisMapper⽂件1. <?xml version="1.0" encoding="UTF-8" ?>2. <!DOCTYPE mapper PUBLIC "-////DTD Mapper3.0//EN" "/dtd/mybatis-3-mapper.dtd" >3. <mapper namespace="com.jjshome.esf.core.dao.school.ISchoolInfoDAO">4. <resultMap id="SchoolInfo" type="mon.entity.school.SchoolInfo">5. <id column="ID" property="id"/>6. <result column="NAME" property="name"/>7. <result column="NAME_SPELL" property="nameSpell"/>8. <result column="ALIAS" property="alias"/>9. <result column="ALIAS_SPELL" property="aliasSpell"/>10. <result column="TYPE" property="type" typeHandler="ponent.handler.DictValueTypeHandler"/>11. <result column="AREA_ID" property="areaId"/>12. <result column="CITY_CODE" property="cityCode"/>13. <result column="AREA_CODE" property="areaCode"/>14. <result column="ADDR" property="addr"/>15. <result column="START_TIME" property="startTime"/>16. <result column="MOTTO" property="motto"/>17. <result column="WEB_SITE" property="webSite"/>18. <result column="PHONE" property="phone"/>19. <result column="FEATURE" property="feature" typeHandler="ponent.handler.DictValueListTypeHandler"/>20. <result column="LNG" property="lng"/>21. <result column="LAT" property="lat"/>22. <result column="UNIT_PRICE" property="unitPrice"/>23. <result column="SALE_PRICE" property="salePrice"/>24. <result column="NATURE_TYPE" property="natureType" typeHandler="ponent.handler.DictValueTypeHandler"/>25. <result column="NATURE_CITY" property="natureCity" typeHandler="ponent.handler.DictValueTypeHandler"/>26. <result column="SCHOOL_DEGREE" property="schoolDegree"/>27. <result column="ENROL_DEGREE" property="enrolDegree"/>28. <result column="IMG_DEGREE" property="imgDegree"/>29. <result column="STATUS" property="status"/>30. <result column="CREATE_ID" property="createId"/>31. <result column="CREATE_DATE" property="createDate"/>32. <result column="UPDATE_ID" property="updateId"/>33. <result column="UPDATE_DATE" property="updateDate"/>34.35. <result column="CITY_NAME" property="cityName" />36. <result column="AREA_NAME" property="areaName" />37. <result column="SCHOOL_DISTRICT_NAME" property="schoolDistrictName" />38. <result column="SALE_COUNT" property="saleCount" />39. </resultMap>40.41. <sql id="Base_Column_List">46. ALIAS_SPELL,47. TYPE,48. AREA_ID,49. CITY_CODE,50. AREA_CODE,51. ADDR,52. START_TIME,53. MOTTO,54. WEB_SITE,55. PHONE,56. FEATURE,57. LNG,58. LAT,59. UNIT_PRICE,60. SALE_PRICE,61. NATURE_TYPE,62. NATURE_CITY,63. SCHOOL_DEGREE,64. ENROL_DEGREE,65. IMG_DEGREE,66. STATUS,67. CREATE_ID,68. CREATE_DATE,69. UPDATE_ID,70. UPDATE_DATE,71. SALE_COUNT,72. SALE_COUNT73. </sql>74.75. <select id="selectById" resultMap="SchoolInfo" parameterType="ng.Integer">76. SELECT77. i.*,78. as 'CITY_NAME',79. as 'AREA_NAME',80. as 'SCHOOL_DISTRICT_NAME'81. FROM82. XQ_SCHOOL_INFO i83. LEFT JOIN YW_CITY_SETTING yc ON i.CITY_CODE = yc.CODE84. LEFT JOIN YW_CITY_SETTING ya ON i.AREA_CODE = ya.CODE85. LEFT JOIN XQ_SCHOOL_AREA xq ON i.AREA_ID = xq.ID86. WHERE87. i.ID = #{id,jdbcType=INTEGER}88. </select>89.90. <delete id="deleteById" parameterType="java.util.Map">91. UPDATE92. XQ_SCHOOL_INFO93. SET94. STATUS = 0,95. UPDATE_ID = #{updateId},96. UPDATE_DATE = NOW()97. WHERE98. ID = #{id,jdbcType=INTEGER}99. </delete>100.101. <delete id="batchDeleteByIds" parameterType="java.util.Map">102. UPDATE103. XQ_SCHOOL_INFO104. SET105. STATUS = 0,106. UPDATE_ID = #{updateId},107. UPDATE_DATE = NOW()108. WHERE109. ID IN (${ids})110. </delete>111.112. <update id="deleteAreaRelation" parameterType="mon.entity.school.SchoolInfo"> 113. update XQ_SCHOOL_INFO114. SET AREA_ID = NULL,115. UPDATE_DATE = NOW()116. WHERE117. ID = #{id}118. </update>119.120. <insert id="insert" parameterType="mon.entity.school.SchoolInfo">121. <selectKey resultType="Integer" keyProperty="id">122. SELECT LAST_INSERT_ID()123. </selectKey>124. INSERT INTO XQ_SCHOOL_INFO125. (NAME,126. NAME_SPELL,127. ALIAS,128. ALIAS_SPELL,129. TYPE,130. AREA_ID,131. CITY_CODE,132. AREA_CODE,133. ADDR,134. START_TIME,135. MOTTO,136. WEB_SITE,137. PHONE,138. FEATURE,139. LNG,140. LAT,141. UNIT_PRICE,142. SALE_PRICE,143. NATURE_TYPE,144. NATURE_CITY,145. SCHOOL_DEGREE,146. ENROL_DEGREE,147. IMG_DEGREE,148. STATUS,154. (#{name,jdbcType=VARCHAR},155. #{nameSpell,jdbcType=VARCHAR},156. #{alias,jdbcType=VARCHAR},157. #{aliasSpell,jdbcType=VARCHAR},158. #{type,jdbcType=INTEGER},159. #{areaId,jdbcType=INTEGER},160. #{cityCode,jdbcType=VARCHAR},161. #{areaCode,jdbcType=VARCHAR},162. #{addr,jdbcType=VARCHAR},163. #{startTime,jdbcType=DATE},164. #{motto,jdbcType=VARCHAR},165. #{webSite,jdbcType=VARCHAR},166. #{phone,jdbcType=VARCHAR},167. #{feature,jdbcType=VARCHAR},168. #{lng,jdbcType=DECIMAL},169. #{lat,jdbcType=DECIMAL},170. #{unitPrice},171. #{salePrice},172. #{natureType,jdbcType=INTEGER},173. #{natureCity,jdbcType=INTEGER},174. #{schoolDegree,jdbcType=INTEGER},175. #{enrolDegree,jdbcType=INTEGER},176. #{imgDegree,jdbcType=INTEGER},177. #{status,jdbcType=TINYINT},178. #{createId,jdbcType=VARCHAR},179. #{createDate,jdbcType=DATE},180. #{updateId,jdbcType=VARCHAR},181. #{updateDate,jdbcType=DATE})182. </insert>183. <insert id="insertSelective" parameterType="mon.entity.school.SchoolInfo"> 184. <selectKey resultType="Integer" keyProperty="id">185. SELECT LAST_INSERT_ID()186. </selectKey>187. INSERT INTO XQ_SCHOOL_INFO188. <trim prefix="(" suffix=")" suffixOverrides=",">189. <if test="name != null">190. NAME,191. </if>192. <if test="nameSpell != null">193. NAME_SPELL,194. </if>195. <if test="alias != null">196. ALIAS,197. </if>198. <if test="aliasSpell != null">199. ALIAS_SPELL,200. </if>201. <if test="type != null">202. TYPE,203. </if>204. <if test="areaId != null">205. AREA_ID,206. </if>207. <if test="cityCode != null">208. CITY_CODE,209. </if>210. <if test="areaCode != null">211. AREA_CODE,212. </if>213. <if test="addr != null">214. ADDR,215. </if>216. <if test="startTime != null">217. START_TIME,218. </if>219. <if test="motto != null">220. MOTTO,221. </if>222. <if test="webSite != null">223. WEB_SITE,224. </if>225. <if test="phone != null">226. PHONE,227. </if>228. <if test="feature != null">229. FEATURE,230. </if>231. <if test="lng != null">232. LNG,233. </if>234. <if test="lat != null">235. LAT,236. </if>237. <if test="UNIT_PRICE != null">238. UNIT_PRICE,239. </if>240. <if test="SALE_PRICE != null ">241. SALE_PRICE,242. </if>243. <if test="natureType != null">244. NATURE_TYPE,245. </if>246. <if test="natureCity != null">247. NATURE_CITY,248. </if>249. <if test="schoolDegree != null">250. SCHOOL_DEGREE,251. </if>252. <if test="enrolDegree != null">253. ENROL_DEGREE,254. </if>255. <if test="imgDegree != null">261. <if test="createId != null">262. CREATE_ID,263. </if>264. <if test="createDate != null">265. CREATE_DATE,266. </if>267. <if test="updateId != null">268. UPDATE_ID,269. </if>270. <if test="updateDate != null">271. UPDATE_DATE,272. </if>273. </trim>274. <trim prefix="VALUES (" suffix=")" suffixOverrides=",">275. <if test="name != null">276. #{name,jdbcType=VARCHAR},277. </if>278. <if test="nameSpell != null">279. #{nameSpell,jdbcType=VARCHAR},280. </if>281. <if test="alias != null">282. #{alias,jdbcType=VARCHAR},283. </if>284. <if test="aliasSpell != null">285. #{aliasSpell,jdbcType=VARCHAR},286. </if>287. <if test="type != null">288. #{type,jdbcType=INTEGER},289. </if>290. <if test="areaId != null">291. #{areaId,jdbcType=INTEGER},292. </if>293. <if test="cityCode != null">294. #{cityCode,jdbcType=VARCHAR},295. </if>296. <if test="areaCode != null">297. #{areaCode,jdbcType=VARCHAR},298. </if>299. <if test="addr != null">300. #{addr,jdbcType=VARCHAR},301. </if>302. <if test="startTime != null">303. #{startTime,jdbcType=DATE},304. </if>305. <if test="motto != null">306. #{motto,jdbcType=VARCHAR},307. </if>308. <if test="webSite != null">309. #{webSite,jdbcType=VARCHAR},310. </if>311. <if test="phone != null">312. #{phone,jdbcType=VARCHAR},313. </if>314. <if test="feature != null">315. #{feature,jdbcType=VARCHAR},316. </if>317. <if test="lng != null">318. #{lng,jdbcType=DECIMAL},319. </if>320. <if test="lat != null">321. #{lat,jdbcType=DECIMAL},322. </if>323. <if test="unitPrice ! =null">324. #{unitPrice},325. </if>326. <if test="salePrice">327. #{salePrice},328. </if>329. <if test="natureType != null">330. #{natureType,jdbcType=INTEGER},331. </if>332. <if test="natureCity != null">333. #{natureCity,jdbcType=INTEGER},334. </if>335. <if test="schoolDegree != null">336. #{schoolDegree,jdbcType=INTEGER},337. </if>338. <if test="enrolDegree != null">339. #{enrolDegree,jdbcType=INTEGER},340. </if>341. <if test="imgDegree != null">342. #{imgDegree,jdbcType=INTEGER},343. </if>344. <if test="status != null">345. #{status,jdbcType=TINYINT},346. </if>347. <if test="createId != null">348. #{createId,jdbcType=VARCHAR},349. </if>350. <if test="createDate != null">351. #{createDate,jdbcType=DATE},352. </if>353. <if test="updateId != null">354. #{updateId,jdbcType=VARCHAR},355. </if>356. <if test="updateDate != null">357. #{updateDate,jdbcType=DATE},358. </if>359. </trim>360. </insert>361. <update id="updateSelective" parameterType="mon.entity.school.SchoolInfo"> 362. UPDATE XQ_SCHOOL_INFO。
实训-mybatis-经验总结
实训-mybatis-经验总结只要⽂件在有符号的src包下,就不必写src 这节⽬录// 假如我将mybatis-config.xml放到comm.icss.control包下,那么我就得// String config = "com/icss/control/mybatis-config.xml"; (省略src)String config = "mybatis-config.xml";//官⽹模板String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(config);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession openSession = sqlSessionFactory.openSession();Object oneUser = openSession.selectOne("getUserById", 1);System.out.println(oneUser);2. 执⾏xml哪个SQL语句并先知道它的idSqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession openSession = sqlSessionFactory.openSession();Object oneUser = openSession.selectOne("getUserById", 1);// Object oneUser = openSession.selectOne("er.getUserById", 1); 这样就更加精准了,更唯⼀了,因为如果只写"getUserById",可能还有⼀个XML⾥的SQL id也叫这个getUserById System.out.println(oneUser);3. XML ⾥SQL的标签 #{} 等于JDBC的占位符 ?//resultType->查询后返回的结果是什么类型, parameterType表⽰查询是传⼊的参数是什么类型,<select id="getUserById" resultType="er" parameterType="int">select * from user where id=#{id}</select>//parameterType表⽰传⼊占位符#{}的是User类型。
mybatis的注解开发实验报告总结
mybatis的注解开发实验报告总结在本次实验中,我深入学习了Mybatis注解开发的相关知识,并进行了实验和总结。
通过该实验,我了解到了注解开发的优点以及如何在Mybatis框架中应用注解进行数据库操作。
首先,注解开发相对于XML配置文件的方式更加简洁和便利。
注解可以直接应用在Java代码上,通过在类或方法上添加注解,我们可以实现与数据库的交互操作,无需编写繁琐的XML配置文件。
这种方式能够提高开发效率,减少代码量,并且更直观地展示数据库操作。
其次,Mybatis提供了许多与注解相关的注解类,如@Select、@Insert、@Update和@Delete等。
这些注解可以直接应用在接口的方法上,实现对数据库的增删改查操作。
在实验中,我通过创建一个接口,使用注解方式定义SQL语句,并在测试类中调用接口的方法,完成了数据库的操作。
这种方式能够简化代码结构,提高可读性,并且能够根据方法的不同注解实现灵活的数据库操作。
此外,我还学习了如何使用注解进行动态SQL的编写。
Mybatis提供了@SelectProvider、@InsertProvider、@UpdateProvider和@DeleteProvider等注解,通过这些注解,我们可以在注解中编写动态SQL语句,根据不同的条件生成不同的SQL。
这种方式能够有效地处理复杂的查询需求,并实现灵活的数据库操作。
总之,通过本次实验,我深入了解了Mybatis注解开发的相关知识,并通过实践掌握了注解的基本使用方法和原理。
注解开发方式简洁高效,能够提高开发效率,并且能够灵活应对不同的数据库操作需求。
我相信在以后的项目开发中,使用注解开发将会给我带来更多的便利和效益。
mybatis总结
mybatis总结Mybatis总结。
Mybatis是一款优秀的持久层框架,它简化了数据库操作的过程,提高了开发效率。
在实际项目中,我们经常会用到Mybatis来进行数据库操作,因此对Mybatis的总结和学习是非常重要的。
接下来,我将对Mybatis进行一些总结和介绍。
首先,Mybatis的核心是SQL映射文件。
在这个文件中,我们可以编写SQL语句,以及定义参数和返回结果的映射关系。
这样一来,我们就可以通过调用Mybatis的API来执行这些SQL语句,从而实现对数据库的操作。
这种将SQL语句和Java代码分离的方式,使得我们可以更加灵活地管理和维护SQL语句,也更容易进行数据库的迁移和优化。
其次,Mybatis提供了丰富的映射功能。
我们可以通过配置文件来定义各种复杂的映射关系,包括一对一、一对多、多对一、多对多等关系。
这样一来,我们就可以很方便地进行对象之间的关联查询,而不必手动编写复杂的SQL语句。
同时,Mybatis还支持动态SQL,可以根据条件动态拼接SQL语句,大大提高了SQL语句的复用性和可维护性。
另外,Mybatis还提供了缓存功能。
在实际项目中,我们经常会遇到一些需要频繁访问的数据,如果每次都去数据库查询,会影响系统的性能。
而Mybatis的缓存功能可以将查询结果缓存起来,当下次再次查询相同的数据时,就可以直接从缓存中获取,避免了对数据库的频繁访问,提高了系统的性能。
最后,Mybatis还支持插件功能。
通过插件,我们可以在Mybatis的执行过程中加入自定义的逻辑,比如对SQL语句进行拦截修改,对查询结果进行加工处理等。
这样一来,我们就可以很方便地扩展Mybatis的功能,满足项目中的特定需求。
总的来说,Mybatis是一个功能强大、灵活性高的持久层框架,它的设计理念和丰富的功能使得我们在实际项目中能够更加高效地进行数据库操作。
通过对Mybatis的总结和学习,我们可以更加深入地理解它的原理和使用方法,从而更好地应用到实际项目中去。
Mybatis总结
Mybatis总结Mybatis总结mybatis基础1、mybatis:解决数据持久化问题的框架2、mybatis是基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句的编写,⽆需关注加载驱动,创建链接,创建statement等过程3、采⽤ORM的思想实现javabean和数据库的映射4、映射配置xml⽂件⽬录结构和持久层接⼝⽬录结构和名称相同(不需要写持久层接⼝的实现类)添加依赖:<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!-- mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version><scope>runtime</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency></dependencies>编写映射配置⽂件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.wfq.dao.IUserDao"><!-- 配置查询所有操作 --><select id="findAll" resultType="er">select * from user</select>5、编写 SqlMapConfig.xml 配置⽂件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!-- 配置 mybatis 的环境 --><environments default="mysql"><!-- 配置 mysql 的环境 --><environment id="mysql"><!-- 配置事务的类型 --><transactionManager type="JDBC"></transactionManager><!-- 配置连接数据库的信息:⽤的是数据源(连接池) --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="1234"/></dataSource></environment></environments><!-- 告知 mybatis 映射配置的位置 --><mappers><mapper resource="com/wfq/dao/IUserDao.xml"/></mappers><!--注解配置--><mappers><mapper class="com.wfq.dao.IUserDao"/></mappers></configuration>6、测试类://1.读取配置⽂件InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建 SqlSessionFactory 的构建者对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//3.使⽤构建者创建⼯⼚对象 SqlSessionFactorySqlSessionFactory factory = builder.build(in);//4.使⽤ SqlSessionFactory ⽣产 SqlSession 对象SqlSession session = factory.openSession();//5.使⽤ SqlSession 创建 dao 接⼝的代理对象IUserDao userDao = session.getMapper(IUserDao.class);//6.使⽤代理对象执⾏查询所有⽅法List<User> users = userDao.findAll();for(User user : users) {System.out.println(user);}//7.释放资源session.close();in.close();}sql 语句中使⽤#{}字符:它代表占位符,相当于原来 jdbc 部分所学的?,都是⽤于执⾏语句时替换实际的数据。
基于mybatis的学生信息管理系统实训总结
基于mybatis的学生信息管理系统实训总结学生信息管理系统是一种用于管理学生信息的软件系统。
近年来,随着互联网技术的发展,学生信息管理系统在高校和教育机构中得到了广泛应用。
本次实训中,我们使用mybatis作为ORM(Object-Relational Mapping)框架开发了一个基于Web的学生信息管理系统。
在这个实训总结中,我将对实训过程进行总结和反思,并对系统的功能和性能进行评估。
在实训开始之前,我们首先进行了对mybatis框架的学习和了解。
Mybatis是一个开源的Java持久层框架,它简化了传统的JDBC编程模型。
通过配置文件和Java注解的方式,我们可以实现数据库表和Java 对象的映射,从而达到方便操作数据库的目的。
在实际开发过程中,我们首先进行了需求分析和数据库设计。
我们通过与教务部门进行沟通,了解了他们对学生信息管理系统的实际需求。
根据需求,我们设计了数据库表结构,并使用mysql数据库进行建表。
然后,我们开始进行编码工作。
在编码过程中,我们首先配置了mybatis的相关文件,包括mybatis-config.xml和mapper.xml。
同时,我们也使用了Spring框架进行依赖注入和事务管理。
通过这些配置文件,我们可以方便地进行数据库操作,并且保证了数据的一致性和完整性。
在编码过程中,我们遵循了面向对象的编程原则,将实体类与数据库表进行了映射,同时定义了相应的DAO(Data Access Object)接口和实现类。
通过这种方式,我们可以方便地对数据库进行增删改查的操作。
在编码过程中,我们还对系统的安全性和性能进行了考虑。
我们使用了Spring Security框架对系统进行了安全验证,并对敏感信息进行了加密处理。
我们还进行了性能测试,通过使用JMeter等测试工具,模拟了多用户并发访问系统的场景,发现了系统的性能瓶颈,并进行了优化。
在整个实训过程中,我学到了很多知识和技能。
手写mybatis 渐进式源码实践
手写mybatis 渐进式源码实践在Java开发中,使用MyBatis作为持久化框架已经是一个比较普遍的选择。
MyBatis提供灵活的SQL编写和映射配置方案,而且易于掌握和使用。
不过,真正理解MyBatis需要去逐步探究其源码实现。
本文将逐步讲述手写MyBatis的全过程,包括从环境搭建、到XML解析、再到Mapper接口调用等流程,希望读者能够深入理解MyBatis的实现原理。
首先,我们需要准备的环境,包括JDK、Maven以及MyBatis源码。
可以通过官网下载MyBatis的源码包,然后解压到本地,使用Maven构建项目。
随后,在项目中添加数据库配置文件,以及Mapper映射文件。
这里以MySQL使用,示例的数据库名为mybatis_test,数据表为user_info,用户信息包括id、name和age等字段。
接下来,我们需要编写基础的Java代码,包括实体类和Mapper接口。
实体类需要实现Serializable接口,且必须与Mapper接口中定义的SQL语句中所涉及到的字段保持一致。
Mapper接口中需要定义相应的CRUD操作方法,并且使用@Param注解指定方法中的参数,以便MyBatis能够正确解析。
例如:public interface UserInfoMapper {UserInfo selectById(@Param("id") Long id);int insert(UserInfo userInfo);int update(UserInfo userInfo);int deleteById(@Param("id") Long id);}接下来,需要编写Mybatis的核心类,SqlSession。
SqlSession主要负责管理Mapper接口的调用过程,以及与数据源的交互。
MyBatis提供了多种SqlSession实现方式,包括DefaultSqlSession、SqlSessionTemplate等。
基于mybatis的学生信息管理系统实训总结(一)
基于mybatis的学生信息管理系统实训总结(一)前言本文是针对基于MyBatis的学生信息管理系统实训的总结文稿。
在这次实训中,作为一名资深的创作者,我将从前言、正文和结尾三个方面进行总结。
正文实训目标•了解MyBatis框架的使用和原理•掌握使用MyBatis进行数据库操作的方法•设计并实现一个学生信息管理系统•培养团队合作和问题解决能力实训过程1.学习MyBatis框架–学习MyBatis的基本概念和相关原理–了解MyBatis的配置文件和映射文件的编写方式–学习使用注解和XML配置两种方式进行SQL映射2.设计数据库结构–根据需求分析,设计学生信息管理系统的数据库结构–创建数据库表,定义各字段的数据类型和约束3.编写实体类和接口–根据数据库表的结构,编写Java实体类–设计接口,定义数据库操作的CRUD方法4.编写MyBatis映射文件/注解–根据接口中定义的方法,编写SQL语句的映射–使用MyBatis的注解方式,替代XML配置文件进行SQL映射5.编写服务层和控制层代码–实现接口中定义的方法,进行数据库操作–设计服务层和控制层的类和方法,实现业务逻辑和控制流程6.测试和调试–使用JUnit框架编写单元测试代码,对系统进行功能测试–进行系统整体调试,解决可能出现的bug和问题结尾通过这次基于MyBatis的学生信息管理系统实训,我深入了解了MyBatis框架的使用和原理,掌握了使用MyBatis进行数据库操作的方法。
在实践中,我设计并实现了一个完整的学生信息管理系统,提升了自己的团队合作和问题解决能力。
我相信,通过这次实训,我在软件开发领域的技术能力得到了进一步的提升,为以后的职业发展奠定了坚实的基础。
我会继续保持对新技术的学习和探索,不断提高自己,为创作更好的作品做出更大的贡献。
前言本文是针对基于MyBatis的学生信息管理系统实训的总结文稿。
在这次实训中,作为一名资深的创作者,我将从前言、正文和结尾三个方面进行总结。
实训-mybatis-经验总结2
实训-mybatis-经验总结2今天上课⼀点⼩收益,今天和昨天的mybatis最⼤改变就是,昨天写完dao接⼝还要继续写dao的实现类。
⽽今天只要有写dao接⼝即可,让mybatis帮我们⾃动制造出dao的实现类另外补充⼀点⼩知识<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.icss.dao.CustomerDao"><!-- 这个resultType 决定了你执⾏session.selectOne("id:XX",2) 的返回值 --><!-- 注意下⾯的 resultType 正常来说肯定要写带完整包名的,com.icss.entity.Customer --><!-- 能这样写的原因是因为在总XML⽂件中设置了⼀样东西 --><select id="getCustomerById" parameterType="int" resultType="Customer">select * from customer where id=#{id}</select>另外,假如想要在总XML 通过配置⽂件来设连接数据库的信息可以这样resource 后⾯的地址是相对路径,因为jdbc.properties和mybatis-config.xml都属于同级⽬录,所以我就直接写jdbc.properties今天由于在实验室电脑和⾃⼰宿舍电脑转来转去的,遇到个问题就是实验室⾥是有tomcat的servlet-api.jar 和jsp.jar包,⽽将整个项⽬拷会⾃⼰电脑时,就会没有依赖。
mybastis数据关系映射实验报告
mybastis数据关系映射实验报告MyBatis数据关系映射实验报告一、实验目的本次实验旨在通过使用MyBatis框架,实现数据关系映射,掌握MyBatis的基本使用方法和原理。
二、实验环境1. 操作系统:Windows 102. 开发工具:IntelliJ IDEA3. 数据库:MySQL4. 编程语言:Java三、实验步骤1. 创建数据库和数据表首先,我们在MySQL中创建一个名为"mybatis_demo"的数据库,并在该数据库中创建一个名为"student"的数据表。
数据表包含三个字段:id(主键,自增)、name(学生姓名)和age(学生年龄)。
2. 导入MyBatis依赖在项目的pom.xml文件中,添加MyBatis的依赖项。
这样,我们就可以在项目中使用MyBatis框架了。
3. 创建实体类在Java项目中,创建一个名为"Student"的实体类,该类的属性与数据表中的字段对应。
4. 创建映射文件在resources目录下创建一个名为"StudentMapper.xml"的映射文件。
在该文件中,我们定义了与数据表对应的SQL语句,包括插入、删除、更新和查询等操作。
5. 创建接口在Java项目中,创建一个名为"StudentMapper"的接口,该接口定义了与映射文件中SQL语句对应的方法。
6. 配置MyBatis在resources目录下创建一个名为"mybatis-config.xml"的配置文件,配置MyBatis的相关信息,包括数据库连接信息、映射文件路径等。
7. 编写测试代码在Java项目中,编写一个名为"Main"的测试类,通过调用接口中的方法,实现对数据库的增删改查操作。
四、实验结果经过以上步骤,我们成功地实现了数据关系映射,并通过MyBatis框架实现了对数据库的增删改查操作。
Mybatis环境搭建及测试
Mybatis环境搭建及测试1、新建java project,导⼊相应jar包本次使⽤到的mybatis-3.2.7版本mybatis需要jar包:mybatis-3.2.7.jar、lib⽂件下的依赖jarmysql驱动jar包:mysql-connector-java-5.1.7.-bin.jar2、创建数据库数据库名:mybatis数据表:user3、配置mybaits核⼼配置⽂件SqlMapConfig.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!-- 和spring整合后 environments配置将废除--><environments default="development"><environment id="development"><!-- type="JDBC" 代表使⽤JDBC的提交和回滚来管理事务 --><transactionManager type="JDBC"/><!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI --><!-- POOLED 表⽰⽀持JDBC数据源连接池 --><!-- UNPOOLED 表⽰不⽀持数据源连接池 --><!-- JNDI 表⽰⽀持外部数据源连接池 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/><property name="username" value="root"/><property name="password" value="mysqladmin"/></dataSource></environment></environments><mappers><mapper resource="User.xml"/></mappers></configuration>SqlMapConfig.xml放⼊项⽬中config源⽂件下4、创建对应数据表的java实体类User.javapackage cn.itheima.pojo;import java.util.Date;public class User {private int id;private String username;// ⽤户姓名private String sex;// 性别private Date birthday;// ⽣⽇private String address;// 地址public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]";}}5、创建对应的映射⽂件User.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><!-- namespace:命名空间,做sql隔离 --><mapper namespace="test">id:sql语句唯⼀标识parameterType:指定传⼊参数类型(pojo类中对应的类型,不是数据库中的类型)resultType:返回结果集类型#{}:占位符,如果传⼊的类型是基本类型(string,long,double,int,boolean,float等),那么#{}中变量名称可以任意--><select id="findUserById" parameterType="ng.Integer" resultType="er">SELECT * FROM user WHERE id=#{id}</select><!--如果返回的结果为集合,resultType中也是配置为集合中泛型的类型,即resultType="er"${}:拼接符,如果传⼊的类型是基本类型(string,long,double,int,boolean,float等),那么${}中变量名称必须是value --><select id="findUserByUserName" parameterType="ng.String" resultType="er">SELECT * FROM user WHERE username LIKE '%${value}%'</select><!--如果传⼊的是pojo类型,则#{}中变量名称必须是pojo中对应的属性.属性.属性......如果要返回数据库⾃增主键,可以使⽤SELECT LAST_INSERT_ID()--><insert id="insertUser" parameterType="er"><!-- 执⾏SELECT LAST_INSERT_ID()数据库函数,返回⾃增的主键keyProperty:将返回的主键放⼊传⼊的参数的Id中保存(保存到user对象中的id属性)order:当前函数相对于insert语句的执⾏顺序,在insert前执⾏⽤BEFORE,在insert后执⾏⽤AFTERresultType:id的类型,也就是keyProperty中属性类型--><selectKey keyProperty="id" order="AFTER" resultType="ng.Integer">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO user (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})</insert><delete id="deleteUserById" parameterType="ng.Integer">DELETE FROM user WHERE id=#{id}</delete><update id="updateUserById" parameterType="er">UPDATE user SET username=#{username} WHERE id=#{id}</update></mapper>⼆、测试package mybatis0523;import java.io.InputStream;import java.util.Date;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import er;public class UserTest {@Testpublic void testFindUserById() throws Exception {String resource = "SqlMapConfig.xml";// 通过流将核⼼配置⽂件读取进来InputStream inputStream = Resources.getResourceAsStream(resource);// 通过核⼼配置⽂件创建会话⼯⼚SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);// 通过会话⼯⼚创建会话SqlSession session = factory.openSession();User user = session.selectOne("test.findUserById", 1);System.out.println(user);}@Testpublic void testFindUserByUserName() throws Exception {String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = factory.openSession();List<User> list = session.selectList("test.findUserByUserName", "王");System.out.println(list);}@Testpublic void testInsertUser() throws Exception {String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = factory.openSession();User user = new User();user.setUsername("赵四");user.setBirthday(new Date());user.setSex("1");user.setAddress("北京昌平");System.out.println(user.getId());session.insert("test.insertUser", user);// mybatis中事务默认是开启的,所以在mybatis中不需要显式开启事务,只需要显式提交事务 // 提交事务mit();System.out.println(user.getId());}@Testpublic void testDeleteUserById() throws Exception {String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = factory.openSession();session.delete("test.deleteUserById", 27);mit();}@Testpublic void testUpdateUserById() throws Exception {String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = factory.openSession();User user = new User();user.setUsername("赵四");user.setId(24);session.update("test.updateUserById", user);mit();}}简单的mybatis环境搭建和测试已完成,整个⽬录结构如下。
Mybatis框架实验报告
3、对user 表添加数据, 并保存实验:Mybatis 框架年纪:2016级实验目的: 基本掌握mybatis 持久层框架,对数据库进行操作实验环境:tomcat9・0 ecl ip se Mybatis 、mysq 、Navicat for Mysql windowslOOS JDK1.8.0实验内容: 一、数据库操作 1、新建数据库 mybatis ,UTF-8字符集 2、新建表user= "建冒龄Z 存角<4 .型吨应 吨磁在位 吨BM 艇伍王趙 *上棋*卞橹■E 应 寧别卜錘K 轴网汪再 SQL 预掘整度4谥点 T>nullint 11 C0 -'1 Uacrhi'artl?var<l dr 255 0□ UEerAgeint11 0 □ userAddressvarchjr緒n学号: 222016CCCCCCCC姓名:CCCC 班级:专业: 计算机科学与技术罔 U5e 「@nnyb alls [Steve nLx]-B 諳注F T 鋒选卷导入曲导cd userAge user Address 12些業昌 m 重京茉昌二、Java 项目 1、创建 Web 工程mybatisdemo 并拷贝jar 包:V 启 Web ContentC? META-INF V —W 匚 AINF V 匕 lib血J mybd-tis-S/i.G.jarmy-tql-connector-java-SJJ3jar2、在src 下建立Configuration.xml文件,文件代码如下:<?xml versio n="1.0" en codi ng="UTF-8"?>v!DOCT YPE con figuration P UBLIC "-////DTD Config 3.0//EN" "htt p:///dtd/mybatis-3-co nfig.dtd"> vcon figuratio n> vtyp eAliases>vtyp eAlias alias="User" typ e="swu.wxg.doma in .User"/> v/typ eAliases> ven vir onments default="develo pmen t">ven vir onment id="develo pmen t"><tra nsactio nMan ager typ e="JDBC"/> vdataSourcetyp e=" PO OLED"> vprop erty n ame="driver" value="com.mysql.jdbc.Driver"/> vproperty name="url"____value="jdbc:mysql://127.0.0.1:3306/mybatis?usfiUnjcodB=true& ;characterE ncod in g=utf-8" />vprop erty n ame="user name" value="root"/> vproperty name=" password" value="123456"/> v/dataSource> v/en vir onment> v/en vir onmen ts>= &开始殊 id userName卜虻<mappers><ma pper resource="swu/wxg/mappin g/userMa ppin g.xml"/> </mappers> v/con figuratio n></cvnfifurflti9n>3、在 src 目录下建立一个 swu.xxj.domian 包,并在 domian 包下建立User 类并输入代码;在输入好的代码下右键选择 source ,选择 getterand setter toStri ng,并勾选全部。
Mybatis入门程序实验
广州学院Java EE 实验报告专业班级计科181 实验日期2021.5.10 姓名张三学号201814252 实验名称Mybatis入门程序指导教师张三国(报告内容包括实验目的、实验设备及器材、实验步骤、程序框图、代码、运行结果、实验小结等)一、实验目的1.了解mybatis的工作原理;2. 掌握Mybatis环境搭建;3.掌握基于Mybatis框架实现数据查询。
二、实验要求根据ID查询信息:使用Navicat创建数据库和表;搭建Mybatis环境;创建POJO;创建mapper文件;Mybatis核心对象的使用;log4j调试和测试方法。
三、实验内容1.在MySQL数据库中,参加一个mybatisde 数据库,并且创建一个t_customer 表,同事插入几条数据。
mysql> create database mybatis;mysql> create table t_customer (-> id int(32) primary key auto_increment,-> username varchar(50),-> jobs varchar(50),-> phone varchar(16));mysql> insert into t_customer values ('1','joy','doctor','122224233'); Query OK, 1 row affectedmysql> insert into t_customer values('2','jack','teacher','122224233');Query OK, 1 row affectedmysql> insert into t_customer values ('3','tom','worker','1353524233'); Query OK, 1 row affected2、在src目录下,创建一个com.itheima.po包,在该包下创建持久化类Customer,并在类中声明id、username、jobs、phone属性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验:Mybatis框架
学号: 222016CCCCCCCC 姓名:CCCC
班级:二年纪:2016级
专业:计算机科学与技术
实验目的:
基本掌握mybatis持久层框架,对数据库进行操作
实验环境:tomcat9.0、eclipse、Mybatis、mysql、Navicat for Mysql、windows10OS、JDK1.8.0
实验内容:
一、数据库操作
1、新建数据库mybatis,UTF-8字符集
2、新建表user
3、对user表添加数据,并保存
二、Java项目
1、创建Web工程mybatisdemo并拷贝jar包:
2、在src下建立Configuration.xml文件,文件代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN"
"/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="User" type="er"/> </typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver"
value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true& ;characterEncoding=utf-8" />
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="swu/wxg/mapping/userMapping.xml"/> </mappers>
</configuration>
3、在src目录下建立一个swu.xxj.domian包,并在domian包下建立User类并输入代码;在输入好的代码下右键选择source,选择getter and setter toString,并勾选全部。
4、在src下建立swu.xxj.mapping包并在包下建一个userMapping.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
5、在Configuration.xml下找到<mappers></mappers>,在中间加入代码:<mapper resource=”swu/dc/mapping/userMapping.xml”/>
在userMapping.xml中输入代码:
<mapper namespace=”erMapping”>
在userMapping.xml中输入如下代码
6、在src下建立swu.xxj.Test包,在包下建Test类
package swu.xxj.test;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import er;
public class Test {
public static void main(String[] args) {
//定义配置文件的位置
String rs="Configuration.xml";
//加载配置文件
InputStream
is=Test.class.getClassLoader().getResourceAsStream(rs);
//构建mybatis的工厂
SqlSessionFactory sessionfactory=new SqlSessionFactoryBuilder().build(is);
SqlSession session=sessionfactory.openSession();
String str1="erMapping.getAllUser";
List<User> myuser=session.selectList(str1);
for(User user:myuser){
System.out.println(user);
}
String str2="erMapping.getUser";
User user1=session.selectOne(str2,"李四");
System.out.println(user1);
}
}
增加记录:
二.运行结果截图:。