mybatis——逆向工程以及案例
逆向工程的作用:
可以使用它通过数据库中的表来自动生成Mapper接口和映射文件和Po类
注:这里的映射文件只包含单表增删改查等操作
第一部分:自动生成的方法
第一步:
(1)创建一个Java工程
(2)再导入的jar包,如下:
提醒一下:这些包还是根据自己的版本来,以上就是我包的版本。
第二步:将所导入的包,手动添加环境,方法如下:
选中导入的jar包——》右击——》Build Path——》最后点击Add to Build Path即可,效果如下:
加载成功的话,会有以下效果,如下:
第三步:Mapper生成配置文件
需要在根目录(注:不是在src下创建)下创建generatorConfig.xml(也可以取别的,不一定也要跟我取得一样)中配置mapper生成的详细信息,需要注意以下几点:
(1)添加要生成的数据库
(2)po文件所在包路径
(3)mapper文件所在包路径
配置文件如下:
<?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> <!--指定数据库驱动jar包位置--> <classPathEntry location="E:\code\mysql\mysql-connector-java-8.0.17.jar"/><!--这里数据驱动位置修改自己的路径 --> <!--id:自定义--> <context id="mybatisConfig" targetRuntime="MyBatis3"> <!--禁用注释--> <commentGenerator> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> </commentGenerator> <!--连接数据库,useSSL=false解决jdbd与mysql版本兼容问题--> <!-- 如果出现时区问题,就在数据库名后面加?serverTimezone=UTC --> <!-- jdbcConnection中的userId和password修改成自己的用户名和密码 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/day?serverTimezone=UTC" userId="root" password="123456"/> <!--生成entity类--> <!--这里的targetPackage包名可以修改,最好是这里的包名和所创的类中类名可以一致 --> <javaModelGenerator targetPackage="com.mybatis.mapper" targetProject=".\src"/><!-- 注意:targetProject在写路径时,不要写死了,最好写成为.\src这个路径 --> <!--xml映射文件--> <sqlMapGenerator targetPackage="com.mybatis.mapper.app" targetProject=".\src"/> <!--mapper接口--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.mybatis.mapper.app" targetProject=".\src"/> <!--table配置,指定数据库中t_user表生成对应的User实体类--> <table tableName="book"/><!-- 这里是我填写的表名 --> <table tableName="publisher"/><!--这里是我填写的表名 --> <!-- <table tableName="t_tag" domainObjectName="Tag"/> <table tableName="t_movie" domainObjectName="Movie"/> --> </context> </generatorConfiguration>
第四步:使用Java生成mapper文件
(1)创建类,这里我的类名为“text.java”
//这是自己所创建的类 package com.mapper.app; import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; public class text { public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; //指向逆向工程配置文件 File configFile = new File("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback, warnings); myBatisGenerator.generate(null); } public static void main(String[] args) throws Exception { try { text generatorSqlmap = new text(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } } }
运行的效果如下:
注:运行以后,说明已经生成了,如果看不到的话,请刷新该项目,千万不要重复生成,重复生成看不到,也没法用,需要注意一下。
(2)生成以后,有增加了两个包名(这里包可以修改,但需要在刚刚所创建的“generatorConfig.xml里面进行修改”,以下包自己取得,也可以自取),效果如下:
第二部分:使用逆向工程对单表进行增删改查等操作
第一步:创建一个项目,在src同级下创建主配置文件、创建配置文件
(1)想要对数据库进行增删改查等操作,就需要导入以下的jar包(跟着自己的版本来),如下:
(2)创建主配置文件,配置如下(只写一种方式):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!--数据库连接池 --> <dataSource type="POOLED"> <!--解析:这里是添加驱动,还需要注意:这里我的mysql版本是8点多版本,所以在添加驱动时,还需要添加cj。 如果版本不是那么高的话,驱动就这样的写(com.mysql.cj.jdbc.Driver),反正根据自己的来 --> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <!--这里属于所访问的地址,还是需要注意一下:下面是由于我的mysql是8点多的版本,需要添加“?serverTimezone=UTC”这个, 因为这个是解决时区的问题,出现时区的问题,就加上,如果没有,就不加 。介绍:day是我的数据库,还是根据自己的来 --> <property name="url" value="jdbc:mysql://localhost:3306/day?serverTimezone=UTC" /> <!--用户 --> <property name="username" value="root" /> <!--这是mysql的密码,反正还是根据自己的mysql的密码 --> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <!--这里是主配置文件(SqlMapConfig.xml)调用映射文件(BookMapper.xml),配置如下 --> <mapper resource="com/mybatis/mapper/app/BookMapper.xml" /> </mappers> </configuration>
(3) 创建配置文件,配置如下:
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
第二步:把逆向工程里所生成的那两个包复制到现在这个项目目录下,效果如下:
第三步:创建测试类
package com.mapper.app; import java.io.InputStream; import java.util.Iterator; 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 com.mybatis.mapper.Book; import com.mybatis.mapper.BookExample; import com.mybatis.mapper.BookExample.Criteria; import com.mybatis.mapper.app.BookMapper; public class test { public static void main(String [] args) throws Exception { test te=new test(); te.selectBook(); } public void selectBook() throws Exception { //获取主配置文件 String sql="SqlMapConfig.xml"; //获取配置文件 InputStream inputStream=Resources.getResourceAsStream(sql); //创建会话 SqlSessionFactory sqlsession=new SqlSessionFactoryBuilder().build(inputStream); SqlSession session=sqlsession.openSession(); //BookMapper是生成文件中的接口 BookMapper mapper =session.getMapper(BookMapper.class);//getMapper方法是获取接口的字节码文件 //创建BookExample对象 BookExample bookExample=new BookExample(); //通过BookExample对象创建查询条件封装对象() Criteria createCriteria = bookExample.createCriteria(); //加入查询条件 //createCriteria.andIdEqualTo(1); //模糊查询 //name只含有西,则返回信息,如果没有,则不返回 createCriteria.andNameLike("%西%"); //获取BookExample对象的对象名 List<Book> selectByExample = mapper.selectByExample(bookExample); //使用迭代器 Iterator<Book> iterator = selectByExample.iterator(); while (iterator.hasNext()) { Book book = (Book) iterator.next(); System.out.println("序号:"+book.getId()+"\t"+"书名:"+book.getName()+"\t"+"出版社:"+book.getpId()); } //释放资源 session.close(); } }
最终效果:
提醒一下:
只要以后想要对数据库进行单表增删改查等操作,都可以使用逆向工程来完成,比较简单。反正还是要看自己怎么选择