听说鱼儿的记忆只有七秒,好奇,那我的记忆可以保存多长时间那?不晓得,只晓得以前学的知识点有些生疏了。某天吃饭,听到邻座某人说,人呐,要学会总结。对的,我们学过的知识点,我们经历的一些事,懂得的一些人生道理,不都需要我们好好总结下吗?于是,马上开通博客,总结。若某些知识点搞错,请评论指出,谢谢
怎样让java程序访问数据库那,我们用jdbc吧。
首先需要注册驱动和数据库信息、操作Connection、通过statement对象执行SQL,然后将结果返回给resultSet,然后从resultSet中读取数据并转换为pojo对象,最后需要关闭数据库相关资源。而且还需要自己对jdbc过程的异常进行捕获处理。
好麻烦是不是,好多重复性的代码真的不想敲啊?那么有没有个足够灵活的持久层解决方案那
Mybatis是一个开源的数据持久层框架,它内部封装了jdbc访问数据库的操作,支持普通的sql查询,存储过程和高级映射,几乎消除了所有的jdbc代码和参数的手工设置以及结果集的检索。其主要思想就是将程序中的大量sql语句与程序分离,配置在配置文件中,实现mybatis的灵活配置。
ORM(对象关系映射),它是一种数据持久化技术。它在对象模型和关系型数据库之间建立对应关系,并且停供一种机制,通过javaBean对象去操作数据库表中的数据。其实mybatis就是一种半自动化的ORM实现,通过简单的xml或者注解来进行配置和原始映射,将实体类和sql语句间建立映射关系。
首先先把mybatis的框架搭起来
- 下载部署所需要的jar包
- 创建mybatis的核心配置文件mybatis-config.xml
-
<?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> <!-- 引入database.properties文件 --> <properties resource="database.properties" /> <!--配置mybatis的log实现为LOG4J --> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <!-- 设置类的别名 --> <!-- <typeAliases> <typeAlias alias="User" type="com.wu.pojo.User"/> 这用可以简化代码量 <package name="com.wu.pojo"/> </typeAliases> --> <environments default="development"> <environment id="development"> <!-- 配置事务管理 ,采用JDBC管理事务 --> <transactionManager type="JDBC" /> <!-- POOLED是mybatis的 数据源 , JNDI是基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${user}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- pojo的映射文件UserMapper引入到配入到配置文件中 --> <mappers> <!-- resource要写成路径 --> <mapper resource="com/bdqn/mybatis2/dao/DayUserMapper.xml" /> <!-- <package name=""/> --><!-- ???用处??? --> </mappers> </configuration>
- 创建持久化类pojo
- 创建dao接口
- 创建sql映射文件
- 编写测试类,跑起来吧,mybatis
-
@Test public void test1(){ SqlSession session=null; try { //将配置文件读取到输入流 InputStream is=Resources.getResourceAsStream("mybatis-config.xml"); //创建过程中,解析xml配置文件,读取全部的mapper映射文件,进行具体方法的解析 SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is); //SqlSession:每个线程都有自己的sqlSession实例,不共享,线程不安全, session=factory.openSession(); DayUser user=new DayUser(); user.setUsername("小明ming"); int result=session.getMapper(DayUserMapper.class).insert(user); session.commit(); System.out.println("=====:"+result); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ //关闭 if(null != session) session.close(); } }
pojo,dao层接口,映射文件不想写咋办。别急,mybatis给了解决方案,使用mybati代码生成器,自动生成pojo,crud基本方法和相关映射文件。
我使用的是在eclipse集成生成器插件,配置generatorConfig.xml。不想集成插件,可以maven配置生成器插件(文艺小青年的博客:https://yq.aliyun.com/articles/371726)
<?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="database.properties"/> <!-- 在MBG工作的时候,需要额外加载的依赖包 location属性指明加载jar/zip包的全路径 <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" /> --> <!-- context:生成一组对象的环境 defaultModelType:指定生成对象的样式 2,flat:所有内容(主键,blob)等全部生成在一个对象中; targetRuntime: 1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample; 2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample; --> <context id="mysql" defaultModelType="flat" targetRuntime="MyBatis3Simple" > <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表; 一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 --> <property name="autoDelimitKeywords" value="false"/> <!-- 生成的Java文件的编码 --> <property name="javaFileEncoding" value="UTF-8"/> <!-- 格式化java代码 --> <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <!-- 格式化XML代码 --> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; --> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!-- 注释 --> <commentGenerator > <property name="suppressAllComments" value="true"/><!-- 是否取消注释 --> <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳--> <property name="addRemarkComments" value="true"/><!-- 是否生成数据库备注信息 --> </commentGenerator> <!-- 必须要有的,使用这个配置链接数据库 @TODO:是否可以扩展 --> <jdbcConnection driverClass="${driver}" connectionURL="${url}" userId="${user}" password="${password}" /> <!-- java类型处理器 用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl; 注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型; --> <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl"> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- java模型创建器,是必须要的元素 targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制; targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录 --> <javaModelGenerator targetPackage="com.bdqn.mybatis2.pojo" targetProject="MyBatis2"> <!-- for MyBatis3/MyBatis3Simple 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter; --> <property name="constructorBased" value="false"/> <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false --> <property name="enableSubPackages" value="true"/> <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成SQL map的XML文件生成器, 注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口), 或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置 targetPackage/targetProject:同javaModelGenerator --> <sqlMapGenerator targetPackage="com.bdqn.mybatis2.dao" targetProject="MyBatis2"> <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false --> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口 targetPackage/targetProject:同javaModelGenerator src/main/java type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下): 1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML; 2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中; 3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML; 注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER --> <javaClientGenerator targetPackage="com.bdqn.mybatis2.dao" type="XMLMAPPER" targetProject="MyBatis2"> <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false --> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 选择一个table来生成相关文件,可以有一个或多个table,必须要有table元素 选择的table会生成一下文件: 1,SQL map文件 --> <table tableName="day_user" > <!-- 参考 javaModelGenerator 的 constructorBased属性--> <property name="constructorBased" value="false"/> <!-- 默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema; --> <property name="ignoreQualifiersAtRuntime" value="false"/> <!-- 参考 javaModelGenerator 的 immutable 属性 --> <property name="immutable" value="false"/> <!-- 指定是否只生成domain类,如果设置为true,只生成domain类,如果还配置了sqlMapGenerator,那么在mapper XML文件中,只生成resultMap元素 --> <property name="modelOnly" value="false"/> <!-- 如果设置为true,生成的model类会直接使用column本身的名字,而不会再使用驼峰命名方法,比如BORN_DATE,生成的属性名字就是BORN_DATE,而不会是bornDate --> <property name="useActualColumnNames" value="false"/> </table> </context> </generatorConfiguration>
在该配置文件右键,看到有小鸟图标的选项点击,等着生成。(没有小鸟选项,你的eclipse没有集成生成器插件);