重要因素.jpg,2、创建Mybatis配置文件使用Idea集成

2019-10-06 作者:编程   |   浏览(184)

简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。[1]

本文将演示Mybatis的基本用法,通过XML或接口类对数据库的增删改查。

小鱼儿玄机30码,Servlet 是在服务器上运行的小程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。

代理模式:通过代理间接的调用被代理对象的方法,结构如下:

小鱼儿玄机30码 1快捷键, 是提高编程速度的, 重要因素.jpg

创建Mybatis项目

1、使用Idea创建一个maven项目,依赖包内容如下

 <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> </dependencies>

2、创建Mybatis配置文件使用Idea集成开发环境,可以下载Mybatis plugin,然后可更好的使用mybatis。关于mybatis的破解过程,参考附录的mybatis plugin 破解

小鱼儿玄机30码 2新建Mybatis配置文件

1、在resource目录下增加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> <properties> <property name="jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="jdbc.user" value="aihe" /> <property name="jdbc.pass" value="123456" /> <property name="jdbc.url" value="jdbc:mysql://localhost:3306/test" /> </properties> <settings> <!-- Globally enables or disables any caches configured in any mapper under this configuration --> <setting name="cacheEnabled" value="true"/> <!-- Sets the number of seconds the driver will wait for a response from the database --> <setting name="defaultStatementTimeout" value="3000"/> <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- Allows JDBC support for generated keys. A compatible driver is required. This setting forces generated keys to be used if set to true, as some drivers deny compatibility but still work --> <setting name="useGeneratedKeys" value="true"/> </settings> <!--便于后面解析对象--> <typeAliases> <package name="me.aihe" /> </typeAliases> <!-- Continue going here --> <environments default="dev"> <environment > <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.pass}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="BlogMapper.xml" /> </mappers></configuration>

2、在resource目录下增加BlogMapper.xml文件,内容如下

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="me.aihe.dao.BlogMapper"> <select resultType="me.aihe.Blog"> select * from Blog where id = #{id} </select> <insert parameterType="Blog"> insert into Blog  values (#{id},#{title}) </insert> <update parameterType="Blog"> UPDATE Blog SET title=#{title} WHERE id=#{id} </update> <delete parameterType="integer"> DELETE FROM BLOG WHERE id=#{id} </delete></mapper>

3、新建Blog对象

package me.aihe;public class Blog { int id; String title; public int getId() { return id; } public void setId { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "Blog{"   ", title='"   title   '''   '}'; }}

4、新建主文件,Tutorial.java,并进行测试。当前我们的数据表内容如下

小鱼儿玄机30码 3新建数据表

5、Tutorial.java文件内容如下

package me.aihe;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 java.io.IOException;import java.io.InputStream;import java.util.Random;public class Tutorial { public static void main(String[] args) { SqlSession sqlSession = null; try { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 查询数据库内容 sqlSession = sqlSessionFactory.openSession(); Blog blog = sqlSession.selectOne("me.aihe.dao.BlogMapper.selectBlog",1); System.out.println; // 插入数据库内容 Blog b = new Blog(); b.setTitle("Insert Value"   new Random().nextInt; int row = sqlSession.insert("me.aihe.dao.BlogMapper.insertBlog",b); System.out.println; sqlSession.commit(); // 更新数据库内容 b.setId; row = sqlSession.update("me.aihe.dao.BlogMapper.updateBlog",b); System.out.println; sqlSession.commit(); //删除数据库内容 row = sqlSession.delete("me.aihe.dao.BlogMapper.deleteBlog",1); System.out.println; sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally { if (sqlSession != null) { sqlSession.close(); } } }}

最终的项目结构如下

小鱼儿玄机30码 4项目结构

6、运行结果

Blog{id=1, title='Hello Mybatis'}111

查看当前数据表的内容,可见查询了id为1的数据,插入了一条心的数据,更新了id为2 的数据,删除了id为1的数据。

小鱼儿玄机30码 5演示后数据表内容

本文内容:

小鱼儿玄机30码 6image.png

Ctrl 1 快速修复Ctrl D: 删除当前行Ctrl Q 定位到最后编辑的地方Ctrl L 定位在某行Ctrl O 快速显示 OutLineCtrl T 快速显示当前类的继承结构Ctrl W 关闭当前EditerCtrl K 快速定位到下一个Ctrl E 快速显示当前Editer的下拉列表Ctrl J 正向增量查找(按下Ctrl J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,)Ctrl Z 返回到修改前的状态Ctrl Y 与上面的操作相反Ctrl / 注释当前行,再按则取消注释Ctrl D删除当前行。Ctrl Q跳到最后一次的编辑处Ctrl M切换窗口的大小Ctrl I格式化激活的元素Format Active Elements。Ctrl F6切换到下一个EditorCtrl F7切换到下一个PerspectiveCtrl F8切换到下一个View

Ctrl Shift E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)Ctrl Shift / 自动注释代码Ctrl Shift 自动取消已经注释的代码Ctrl Shift O 自动引导类包Ctrl Shift J 反向增量查找(和上条相同,只不过是从后往前查)Ctrl Shift F4 关闭所有打开的EditerCtrl Shift X 把当前选中的文本全部变为小写Ctrl Shift Y 把当前选中的文本全部变为小写Ctrl Shift F 格式化当前代码Ctrl Shift M(先把光标放在需导入包的类名上) 作用是加Import语句Ctrl Shift P 定位到对于的匹配符 (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)Ctrl Shift F格式化文件Format Document。Ctrl Shift O作用是缺少的Import语句被加入,多余的Import语句被删除。Ctrl Shift S保存所有未保存的文件。Ctrl Shift / 在代码窗口中是这种/*~*/注释,在JSP文件窗口中是 。Shift Ctrl Enter 在当前行插入空行

Alt / 代码助手完成一些代码的插入 ,自动显示提示信息Alt ↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt ↑ 当前行和上面一行交互位置Alt ← 前一个编辑的页面Alt → 下一个编辑的页面(当然是针对上面那条来说了)Alt Enter 显示当前选择资源(工程,or 文件 or文件)的属性

Alt CTRL ↓ 复制当前行到下一行Alt CTRL ↑ 复制当前行到上一行

Alt Shift R 重命名Alt Shift M 抽取方法Alt Shift C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)Alt Shift L 抽取本地变量Alt Shift F 把Class中的local变量变为field变量Alt Shift I 合并变量Alt Shift V 移动函数和变量Alt Shift Z 重构的后悔药 Shift Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)Alt Shift O(或点击工具栏中的Toggle Mark Occurrences按钮) 当点击某个标记时可使本页面中其他地方的此标记黄色凸显,并且窗口的右边框会出现白色的方块,点击此方块会跳到此标记处。

总结

这篇文章主要简单的演示了通过xml配置Mybatis,对数据库的增删改查。使用接口注解的方式类似,可自行查阅。关于更多高级用法,请听下回分解。

可扩充部分

  • 接口注解增删改查
  • Mybatis配置属性详细介绍
  • 更好的组织项目结构

小鱼儿玄机30码 7

Java的反射包提供了一个Porxy类和InvokationHandler接口。它们结合在一起后可以创建动态代理类。Porxy类基于传递的参数创建动态代理类。InvokationHandler则用于激发动态代理类的方法。这个过程是在程序执行过程中动态生成与处理的,所以叫动态代理。分析一下

注意:一般重构的快捷键都是Alt Shift开头的了

错误汇总

1、mybatis-config.xml属性顺序错误

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 50; columnNumber: 17; 元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"

解决方案:mybatis-config.xml文件按照(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)进行顺序排列。

小鱼儿玄机30码 8mybatis配置顺序

2、不能找到某个类文件

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may exist in BlogMapper.xml### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'Blog'. Cause: java.lang.ClassNotFoundException: Cannot find class: Blog

解决方案:两者选其一即可1、在Mapper文件的resultType中返回为全路径

小鱼儿玄机30码 9解决方案1

2、添加TypeAlias

小鱼儿玄机30码 10解决方案2

学习Servlet,我们先看一下Servlet程序怎么开发,大体上可以分为五步,如下所示:

Porxy类

Porxy类提供了一个静态方法创建动态代理类。

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)throws IllegalArgumentException

1、ClassLoader:ClassLoader会定义动态代理类,ClassLoader可以通过类或者接口获得,如果我们想通过接口获得,调用方法如下。

 Task.class.getClassLoader()

如果通过类来获得,加入我们有一个类TaskImpl实现了Task接口,我们有个TaskImpl的对象ob,然后ClassLoader获取方法如下

 ob.getClassLoader()

2、 Class<?>[] interfaces:动态代理类需要实现的接口3、InvocationHandler:传递一个实现了InvokationHandler接口的类的实例

F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Description。F3跳到声明或定义的地方。F5单步调试进入函数内部。F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的。F7由函数内部返回到调用处。F8一直执行到下一个断点。

附录

  • Mybatis视频教程
  • Mybatis官方文档
  • Idea Mybatis plugin破解

小鱼儿玄机30码 11

InvokationHandler

InvokationHandler是Java 反射包里面的一个接口。InvokationHandler通过用户类来实现,来激发一个动态代理类的方法。它只有一个方法:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

1、Object:实现方法的代理对象2、Method:代理实例激发的方法,Porxy参数中的接口方法3、Object[]:传递给方法的一系列参数

1、我们提供一个接口

package me.aihe;public interface Task { void setData(String data); int getCalData;}

2、实现这个接口

package me.aihe;public class TaskImpl implements Task { @Override public void setData(String data) { System.out.println(data  " Data is saved"); } @Override public int getCalData { return x * 10; }}

3、定义自己的InvokationHandler类,并且实现InvokationHandler接口的Invoke方法

package me.aihe;import java.lang.reflect.InvocationHandler;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class MyInvokationHandler implements InvocationHandler { private Object obj; public MyInvokationHandler(Object object){ this.obj = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result; if(method.getName().contains{ System.out.println("...get Method Executing..."); }else{ System.out.println("...set Method Executing..."); } result = method.invoke(obj, args); return result; }}

4、创建一个工厂类获取动态代理类:

package me.aihe;import java.lang.reflect.Proxy;public class ProxyFactory { public static Object newInstance(Object ob) { return Proxy.newProxyInstance(ob.getClass().getClassLoader(), new Class<?>[] { Task.class }, new MyInvokationHandler; }}

5、提供我们的测试类

package me.aihe;public class Test { public static void main(String[] args) { Task task = ProxyFactory.newInstance(new TaskImpl; task.setData; System.out.println("============"); System.out.println(task.getCalData; }}

看到程序的输出结果:

...set Method Executing...Test Data is saved============...get Method Executing...50

动态代理的实现流程:1、创建一个接口2、提供一个实现这个接口的类3、创建一个实现了InvokationHandler接口的类,实现Invoke方法。传递参数:实现接口的类4、可选:创建一个代理工厂。返回值传递参数:ClassLoader,实现的接口,实现接口的类

参考:

本文由小鱼儿玄机30码发布于编程,转载请注明出处:重要因素.jpg,2、创建Mybatis配置文件使用Idea集成

关键词: 小鱼儿玄机30码