学习框架工具的最好,也是最快的方法就是通过实例来学习,本实例使用spring和mybatis构建了一个java小程序,该程序没有什么实际的业务功能,只是通过mybatis简单读取数据库的数据。
一、构建数据库
使用navicat工具连接数据库后,创建user表如下:
user表
关于数据库表的创建一般要做以下几点:
- 设定类型:一般常用的类型就是bigint,对应于java中较长的整型如long;varchar,用于储存字符串;int 对应java中的integer。
- 字段的长度:指的是字符长度,并不是计算机储存数据使用的位的长度,如root字段长度为1,则该字段可以填的值为0到9,这些一位数。创建表时字段需要多大就给多长。
- 字段的其他设置:在页面的下方,截图上没有;包括字段的注释(描述字段的作用),整型字段要不要设置为无符号(如果该字段没有负值的话就添上),默认值(varchar类型的默认值需要用单引号括起来)
- 外键:用于关联多张表的字段,如另张成绩表上还有一个字段user_id,该字段的值全部来源于user表上的id字段,就可以在成绩表上添加外键,关联user表上的id字段;
- 表注释:表的注释,描述表的用途,虽然表名能描述出表的用途,但是如果后面业务逻辑变复杂,表变得多起来,添上注释还是有点好处的,也便于维护。
其他的设置就和实际的业务有关了;
二、创建maven项目
使用eclipse右击new - project,选择maven project,选择项目路径,项目类型选择,uqickstart结尾,填写groupid组名,artifactid项目名,finish即可。
创建maven项目的好处就是不用自己去找jar包,把要用到的jar包写在配置文件中即可,项目会自动引入。创建好的项目后分包如下:
项目结构.PNG
- bean:存放所有bean文件,数据库中查询到的结果要转换成java对象;
- config:存放所有的spring,mybatis的配置文件;
- dao:存放mybatis连接数据库要用到的mapper类;相当于存放sql语句的地方;
- mappers:存放mybatis的xml文件,和dao中的文件相对应。
- util:自定义的工具类;
三、配置文件
使用框架工具最麻烦的就是配置文件了,不过配置文件也是大同小异,可以根据自己的需要在别人的配置文件上进行修改,配置文件写好后,业务逻辑的代码就会变得特别简单。
1. maven的pom文件
maven的pom文件就是配置要用到的所有jar包的地方,文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yesongdh</groupId>
<artifactId>springInstance</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springInstance</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j.version>1.7.25</slf4j.version>
<springmvc.version>4.3.12.RELEASE</springmvc.version>
<log4j.version>2.8.2</log4j.version>
<mybatis.version>3.4.5</mybatis.version>
<mybatis.spring.version>1.3.1</mybatis.spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<!-- mysql数据库jdbc驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- mybatis数据持久化框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--mybatis spring 插件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- spring框架包 start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${springmvc.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${springmvc.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.maven/maven-model -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
<!-- 指定项目使用jdk1.7的插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
主要引入了druid数据库连接池、mysql数据库的jdbc驱动、mybatis数据库持久化框架、spring框架包;最后一个是jdk插件,每次建完项目后,项目使用的jdk包都是1.5的,只有在pom文件中添加这一段配置后项目才会使用jdk1.7或者更新的jdk版本。
选中项目右击,选择maven - update project,把项目刷新一下
2. 配置spring和mybatis框架文件
在config文件夹下创建如下两个文件:jdbc.property和mybatis.xml
mybatis配置.PNG
jdbcs.properties主要是数据库连接的相关设置,内容如下:
# MySQL
#============================================================================
#test MySQL
jdbc.mysql.driver = com.mysql.jdbc.Driver
jdbc.mysql.url = jdbc:mysql://localhost:3306/test?useSSL=true
jdbc.mysql.username = root
jdbc.mysql.password = SQL1137660
#mybatis config
#============================================================================
jdbc.initialSize = 10
jdbc.minIdle = 10
jdbc.maxActive = 10
jdbc.testWhileIdle = true
jdbc.timeBetweenEvictionRunsMillis = 30000
jdbc.minEvictableIdleTimeMillis = 60000
jdbc.validationQuery = SELECT 'x'
jdbc.testOnBorrow = false
jdbc.testOnReturn = false
jdbc.poolPreparedStatements = true
jdbc.maxOpenPreparedStatements = 100
mybatis.xml文件内容如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd ">
<!-- 引入jdbc配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:config/jdbcs.properties" />
</bean>
<!-- 引入aliyun的Druid文件链接数据库,并作为数据源 -->
<bean id="aliyunDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.mysql.driver}" />
<property name="url" value="${jdbc.mysql.url}" />
<property name="username" value="${jdbc.mysql.username}" />
<property name="password" value="${jdbc.mysql.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}" />
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}" />
<!-- 获取连接最大等待时间 -->
<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="${jdbc.validationQuery}"/>
<property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
<property name="testOnBorrow" value="${jdbc.testOnBorrow}"/>
<property name="testOnReturn" value="${jdbc.testOnReturn}"/>
<property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}"/>
<property name="maxOpenPreparedStatements" value="${jdbc.maxOpenPreparedStatements}"/>
</bean>
<!-- spring和MyBatis的整合 -->
<bean id="aliyunSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="aliyunDataSource" />
<!-- 自动扫描mapping.xml文件,**表示迭代查找,目录结构改变需要变动 -->
<property name="mapperLocations" value="classpath:mappers/*.xml" />
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 ,包下的类需要使用@MapperScan注解,否则容器注入会失败 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao" /><!-- 目录结构改变需要变动 -->
<property name="sqlSessionFactoryBeanName" value="aliyunSqlSessionFactory" />
</bean>
<!--事务管理器 spring事务管理器,推荐使用 -->
<bean id="aliyunTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="aliyunDataSource"/>
</bean>
<!-- 启动事务注解 -->
<tx:annotation-driven transaction-manager="aliyunTransactionManager"/>
</beans>
mybatis.xml主要是设置数据库的数据源、引入所有mybatis 的dao文件和xml文件、使用spring事务管理。
四、业务代码
1. 创建bean文件和dao文件
- 在bean文件夹下创建user.java;内容如下:
public class User {
private String id;
private String name;
private int sex;
private String phone;
private String email;
private int root;
private String password;
后半部分全是字段的get/set方法,还有改写的tostring方法用于观察最后的打印结构,就不贴出来了。
关于bean类要注意:
bean类所有字段的名称一定要和查询语句的字段名对应;如:select user_id, name from score; 选取了数据库score表的user_id和name字段,这些字段都要填充到user.java类中,那user.java中的字段名必须为user_id和name,不然最后得到的user对象的id字段肯定为空。或者更改sql语句为select user_id as id, name from score;给数据库字段别名。框架可能使用了反射,读取了java对象的所有字段名,根据字段名和数据库的查询结果字段名一一对应,最后通过get和set方法个java对象的字段赋值。
- 在dao文件夹下创建dao文件,文件类型为接口,UserMapper.java,内容如下:
@MapperScan
public interface UserMapper {
@Select("select id, name, sex, phone, email, root, password from user")
List<User> getUsers();
}
注意那个@mapperscan注解和@select注解,mybatis就是扫描那两个注解把文件扫描进springcontext中的。查询结果如果不止一个的话就需要用list,如果只有一个那就填User类型。
其实所有的sql语句也可以写在mappers包的xml中,和dao包这个的类进行关联。如果要对sql语句的复用的话可能就需要把sql语句写在xml文件中比较好,不过我更倾向于写在dao文件中,写代码的时候就可以少打开一个窗口,更方便。
- 在mappers目录创建UserMapper.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="dao.UserMapper">
</mapper>
sql语句可以写在这里,和dao包中的文件通过这里的namespace联系起来,dao包中只提供接口方法,这里提供sql;不过也可以像我一样通过注解的方式,把sql语句写在dao包里,这里就可以什么都不用写。在修改时就不用同时打开三个文件了。
2. App业务代码
app中的代码如下:
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("config/mybatis.xml");
UserMapper userMapper = context.getBean(UserMapper.class);
List<User> users = userMapper.getUsers();
System.out.println(users);
}
}
打印结果如下:
打印结果.PNG
五、打包成可执行文件
java引用程序可以被打包成可执行 jar 文件,eclipse右击选择export,选择 runnable JAR file,在launch config 中选择包含main方法的类,下面是三种对于引用的库的处理方式:把需要的jar包都抽取到生成的jar文件中,打包所有需要的库文件到生成的jar文件中,复制需要的库文件到子目录中;这里选择最后一个;然后finish就可以了。
打包.PNG
jar文件所在位置,shift + 右击运行power shell,输入 java -jar ./springInstance.jar,运行结果如下,和eclipse的运行结果相同:
运行结果.PNG
六、总结
整理一下整个程序的逻辑流程:
在主程序中ClassPathXmlApplicationContext("config/mybatis.xml");读取spring的配置文件,配置文件主要做了三件事:
- 使用com.alibaba.druid.pool.DruidDataSource建立线程池数据源;
- mybatis 扫描mappers文件夹下的mapper.xml文件和dao包下的dao文件,将扫描到的文件加入到spring配置文件中;
- 事务管理器和事务注解管理;其实还可以加入一些从程序一开始就需要运行的初始化程序。
最后主程序从applicationContext中获取dao包中的初始化好的实例,调用dao方法。
个人理解spring是另一种写代码的风格,用配置文件的方式来实例化对象,所有配置文件中的类都可以在applicationContext中找到,很方便。spring和mybatis的配合,mybatis通过扫描注解和文件的方式,把所有的数据库连接对象都添加到spring中进行实例化,在编写业务代码时就可以直接在applicationContex对象中获取,有效地减少了业务代码量。
源码下载:https://pan.baidu.com/s/1fYTIzsT6xpmyjsNZCvlwfg
如果有不对的地方欢迎指正讨论
网友评论