三、基于ssm逆向工程的使用(IDEA)
基于SSM逆向工程的使用(IDEA)是指在IntelliJ IDEA这个集成开发环境中使用MyBatisGenerator工具,根据数据库表结构自动生成对应的实体类、Mapper接口和XML映射文件。这样可以大大减少开发人员的工作量,提高开发效率。
3.1.安装Mybatis generator插件
这一步我们上面已经完成了直接跳过
3.2.配置generatorConfig.xml
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!-- 引入配置文件 --> <properties resource="jdbc.properties"/> <!--指定数据库jdbc驱动jar包的位置--> <classPathEntry location="D:\\initPath\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/> <!-- 一个数据库一个context --> <context id="infoGuardian"> <!-- 注释 --> <commentGenerator> <property name="suppressAllComments" value="true"/><!-- 是否取消注释 --> <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 --> </commentGenerator> <!-- jdbc连接 --> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 01 指定javaBean生成的位置 --> <!-- targetPackage:指定生成的model生成所在的包名 --> <!-- targetProject:指定在该项目下所在的路径 --> <javaModelGenerator targetPackage="com.javaxl.model" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> <!-- 是否对model添加构造函数 --> <property name="constructorBased" value="true"/> <!-- 是否针对string类型的字段在set的时候进行trim调用 --> <property name="trimStrings" value="false"/> <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 --> <property name="immutable" value="false"/> </javaModelGenerator> <!-- 02 指定sql映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.javaxl.mapper" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 03 生成XxxMapper接口 --> <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 --> <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 --> <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <javaClientGenerator targetPackage="com.javaxl.mapper" targetProject="src/main/java" type="XMLMAPPER"> <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 配置表信息 --> <!-- schema即为数据库名 --> <!-- tableName为对应的数据库表 --> <!-- domainObjectName是要生成的实体类 --> <!-- enable*ByExample是否生成 example类 --> <!--<table schema="" tableName="t_book" domainObjectName="Book"--> <!--enableCountByExample="false" enableDeleteByExample="false"--> <!--enableSelectByExample="false" enableUpdateByExample="false">--> <!--<!– 忽略列,不生成bean 字段 –>--> <!--<!– <ignoreColumn column="FRED" /> –>--> <!--<!– 指定列的java数据类型 –>--> <!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>--> <!--</table>--> <table schema="" tableName="t_mvc_Book" domainObjectName="Book" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration>
注意事项:
①修改Mysql驱动的位置
复制到<classPathEntry>的location,注意需要补充一个斜杆。
②修改JavaBean生成的位置
③修改SQL对应的配置文件的生成地址
④修改Dao层代码地址的生成地址
⑤修改指定需要生成增删改查代码对应的表
如果你想一次性生成多个那么你就复制多个table出来即可。
双击我们下载好的插件执行生成代码即可
这时候代码就生成完成了
四、结合Mybatis生成代码完成增删改查
①创建一个util包和一个SessionUtil类
package com.csdn.xw.util; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SessionUtil { private static SqlSessionFactory sessionFactory; private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); static { sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml")); } public static SqlSession openSession() { SqlSession session = threadLocal.get(); if (null == session) { session = sessionFactory.openSession(); threadLocal.set(session); } return session; } public static void main(String[] args) { SqlSession session = openSession(); System.out.println(session.getConnection()); session.close(); } }
小贴士:
- 这个工具类的作用是创建并管理MyBatis的SqlSession对象。它通过读取mybatis.cfg.xml配置文件来初始化一个SqlSessionFactory,然后使用这个工厂创建一个SqlSession。SqlSession对象用于执行数据库操作,如查询、插入、更新和删除。
- 在openSession()方法中,首先检查当前线程是否已经有一个SqlSession对象,如果没有,就创建一个新的SqlSession并将其设置到当前线程。如果已经有一个SqlSession对象,就直接返回这个对象。
- 在main()方法中,调用openSession()方法获取一个SqlSession对象,然后打印出这个对象的连接信息,最后关闭这个SqlSession对象。
②创建biz层和BookBiz接口(直接拷贝mapper生成的即可)
package com.csdn.xw.biz; import com.csdn.xw.model.Book; public interface BookBiz { int deleteByPrimaryKey(Integer bid); int insert(Book record); int insertSelective(Book record); Book selectByPrimaryKey(Integer bid); int updateByPrimaryKeySelective(Book record); int updateByPrimaryKey(Book record); }
③创建impl层用bookbizimpl实现BookBiz
package com.csdn.xw.biz.Impl; import com.csdn.xw.biz.BookBiz; import com.csdn.xw.mapper.BookMapper; import com.csdn.xw.model.Book; /** * @author Java方文山 * @compay csdn_Java方文山 * @create 2023-08-19-13:41 */ public class BookBizImpl implements BookBiz { private BookMapper bookMapper; public BookMapper getBookMapper() { return bookMapper; } public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper; } @Override public int deleteByPrimaryKey(Integer bid) { return bookMapper.deleteByPrimaryKey(bid); } @Override public int insert(Book record) { return bookMapper.insert(record); } @Override public int insertSelective(Book record) { return bookMapper.insertSelective(record); } @Override public Book selectByPrimaryKey(Integer bid) { return bookMapper.selectByPrimaryKey(bid); } @Override public int updateByPrimaryKeySelective(Book record) { return bookMapper.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Book record) { return bookMapper.updateByPrimaryKey(record); } }
注意:需要提供bookMapper的set和get方法
④测试
注释Junit的<scope>
标签用于指定依赖的范围表示该依赖在编译、测试和运行时都有效。
package demo; import com.csdn.xw.biz.Impl.BookBizImpl; import com.csdn.xw.mapper.BookMapper; import com.csdn.xw.util.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author Java方文山 * @compay csdn_Java方文山 * @create 2023-08-19-13:46 */ public class demo1 { private BookBizImpl bookBiz = new BookBizImpl(); SqlSession sqlSession; @Before public void setUp() throws Exception { System.out.println("初始换方法。。。"); //工具类中获取session对象 sqlSession = SessionUtil.openSession(); //从session对象中获取mapper对象 BookMapper mapper = sqlSession.getMapper(BookMapper.class); bookBiz.setBookMapper(mapper); } @After public void tearDown() throws Exception { System.out.println("方法测试结束。。"); } @Test public void deleteByPrimaryKey() { System.out.println("测试删除业务方法"); System.out.println(bookBiz.deleteByPrimaryKey(1)); } @Test public void selectByPrimaryKey() { System.out.println("测试的查询业务方法。。。"); //System.out.println(bookBiz.getBookMapper()); System.out.println(bookBiz.selectByPrimaryKey(44)); } }
这里测试两个代表性的事物,一个删除一个查询
运行报错,说是getMapper没有值,这时候我们想起来,前面因为还没生成代码,为了防止报错我们将<mappers>里面的配置映射文件内容注释掉了,现在我们更改回来。
查询测试结果:
删除测试结果:
我们将编号为1的数据删除
这里返回值是1说明删除成功了,可我们回过头到数据库查看,数据还是在,这是为什么呢?
因为我们Mybatis没有自动提交事物的能力,所以我们在 @After测试方法中编写提交的事物即可
编写完成后我们在进行测试,这时候我们的数据就被删除了。
五、面试题SQLSession的作用
SQLSession是MyBatis框架中的一个接口,它的主要作用是执行SQL语句和管理事务。在MyBatis中,一个SqlSessionFactory实例会创建一个SqlSession实例,每个SqlSession实例都有一个自己的事务,用于执行SQL操作。当多个SqlSession实例并发执行时,它们会共享同一个事务,这样可以保证数据的一致性。
总结一下,SQLSession的作用如下:
- 执行SQL语句;
- 管理事务;
- 支持并发操作。
- sqlsession可以拿到mapper对象
- 作为缓存使用,一级缓存,默认会开启的缓存、
- 出于对性能的考虑,会采用二级缓存,二级缓存需要手动开启
到这里我的分享就结束了,欢迎到评论区探讨交流!!
如果觉得有用的话还请点个赞吧 ♥ ♥