简单粗暴JavaWeb-第六篇:使用mybatis框架代替纯jdbc访问数据库
2017-11-16 21:11
639 查看
前面说到为了方便,一些sql语句采用了硬编码,但是这种方式在工程逐渐变大的情况下很不方便,我就打算尽量用些变量来替换硬编码。写了两个方法来产生insert语句和select语句,如下:
StringBuilder keys = new StringBuilder();
StringBuilder values = new StringBuilder();
for (String key:maps.keySet()){
keys.append(key+",");
values.append("\'"+maps.get(key)+"\'"+",");
}
String keyStr = keys.substring(0,keys.length()-1);
String valueStr = values.substring(0,values.length()-1);
StringBuilder sql = new StringBuilder()
.append("insert into ")
.append(table)
.append(" (")
.append(keyStr)
.append(") values (")
.append(valueStr)
.append(");");
return sql.toString();
}
public String genSelectSql(String database, Set<String> colSets, Map<String,String> valueMaps){
StringBuilder colSetsStrBuild = new StringBuilder();
for (String str:colSets){
System.out.println(str);
colSetsStrBuild.append(str)
.append(",");
}
String colSetsStr = colSetsStrBuild.substring(0,colSetsStrBuild.length()-1);
StringBuilder valueMapsStrBuild = new StringBuilder();
for (String key:valueMaps.keySet()){
System.out.println(key);
valueMapsStrBuild.append(key+"=\'"+valueMaps.get(key)+"\' and ");
}
String valueMapsStr = valueMapsStrBuild.substring(0,valueMapsStrBuild.length()-5);
StringBuilder sql = new StringBuilder()
.append("select ")
.append(colSetsStr)
.append(" from ")
.append(database)
.append(" where ")
.append(valueMapsStr)
.append(";");
return sql.toString();
}
看起来就很复杂就很头疼,因而我写完之后就打算上mybatis了,所以,以上代码完全不用看。
<!--myBatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
由于之前我们已经引入了jdbc链接mysql的包,就不用引入了。
2
上一步配置maven依赖,更新后会惊奇的发现,在resource文件夹下已经帮我们建立了一个mybatis-config.xml文件,是mybatis的配置文件,配置内容如下
那么我们建立一个相应的model类,叫做UserInfo
代码如下
package HelloSpringMvc.model;
/**
* Created by yuhan.shen on 2017/11/3.
*/
public class UserInfo {
private Integer id;
private String userName;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}其实就是一个pojo方法
我们可以在之前自动建立的mybatis文件夹中建立一个mapper文件夹,用来放我们要写的mapper文件
内容如下:
<?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="UserInfoMapper">
<resultMap id="UserInfoMap" type="HelloSpringMvc.model.UserInfo">
<result column="id" property="id" jdbcType="BIGINT" />
<result column="user_name" property="userName" jdbcType="VARCHAR" />
<result column="id" property="id" jdbcType="VARCHAR" />
</resultMap>
<select id="selectUserByID" resultMap="UserInfoMap">
select * from tbl_user_info where id = '1'
</select>
</mapper>
重点是一定要将resultMap与type对应起来,最后,我们将此mapper在mybatis-config.xml进行一下声明,在mybatis-config.xml文件中加上以下代码
经过以上几个步骤,我们就可以进行一下测试了,写一个测试类,如下
import HelloSpringMvc.model.UserInfo;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
/**
* Created by yuhan.shen on 2017/11/3.
*/
public class TestUserInfo {
/**
* SqlSessionFactory是用来创建SqlSession的工厂,SqlSession会执行映射的语句,进行事物提交、回滚等。
* @return
*/
public SqlSessionFactory getSqlSessionFactory() {
Reader reader = null;
SqlSessionFactory sqlSessionFactory = null;
try {
reader = Resources.getResourceAsReader("mybatis/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Test
public void selectTest(){
SqlSession session = getSqlSessionFactory().openSession();
try {
UserInfo userInfo = (UserInfo) session .selectOne("UserInfoMapper.selectUserByID");
System.out.println(userInfo.getPassword());
} finally {
session.close();
}
}
}
执行Test单元测试,就能得到结果。
其实,我们可以将session相关方法封装起来,使得自己要写的持久层代码(dao)层进一步简化,这种方式比jdbc简单很多,最重要的是不用去拼装sql啊!
1、纯jdbc下的插入、选择语句
public String genInsertSql(String table, Map<String,String> maps){StringBuilder keys = new StringBuilder();
StringBuilder values = new StringBuilder();
for (String key:maps.keySet()){
keys.append(key+",");
values.append("\'"+maps.get(key)+"\'"+",");
}
String keyStr = keys.substring(0,keys.length()-1);
String valueStr = values.substring(0,values.length()-1);
StringBuilder sql = new StringBuilder()
.append("insert into ")
.append(table)
.append(" (")
.append(keyStr)
.append(") values (")
.append(valueStr)
.append(");");
return sql.toString();
}
public String genSelectSql(String database, Set<String> colSets, Map<String,String> valueMaps){
StringBuilder colSetsStrBuild = new StringBuilder();
for (String str:colSets){
System.out.println(str);
colSetsStrBuild.append(str)
.append(",");
}
String colSetsStr = colSetsStrBuild.substring(0,colSetsStrBuild.length()-1);
StringBuilder valueMapsStrBuild = new StringBuilder();
for (String key:valueMaps.keySet()){
System.out.println(key);
valueMapsStrBuild.append(key+"=\'"+valueMaps.get(key)+"\' and ");
}
String valueMapsStr = valueMapsStrBuild.substring(0,valueMapsStrBuild.length()-5);
StringBuilder sql = new StringBuilder()
.append("select ")
.append(colSetsStr)
.append(" from ")
.append(database)
.append(" where ")
.append(valueMapsStr)
.append(";");
return sql.toString();
}
看起来就很复杂就很头疼,因而我写完之后就打算上mybatis了,所以,以上代码完全不用看。
2、配置mybatis
2.1 在pom中引入mybatis和mybatis-spring包
如下<!--myBatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
由于之前我们已经引入了jdbc链接mysql的包,就不用引入了。
2
4000
.2 配置mybatis-config.xml文件
上一步配置maven依赖,更新后会惊奇的发现,在resource文件夹下已经帮我们建立了一个mybatis-config.xml文件,是mybatis的配置文件,配置内容如下<?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"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/ahellospringmvcdemodb" /> <property name="username" value="root" /> <property name="password" value="123" /> </dataSource> </environment> </environments> </configuration>
2.3 设置一个数据库model类
在mybatis中,对应一张数据表的列信息,我们可以建立一个相应的model类进行匹配,比如表tbl_user_info那么我们建立一个相应的model类,叫做UserInfo
代码如下
package HelloSpringMvc.model;
/**
* Created by yuhan.shen on 2017/11/3.
*/
public class UserInfo {
private Integer id;
private String userName;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}其实就是一个pojo方法
2.4 我们配置一下mapper方法,并编写sql语句
最能体现mybatis便捷性的地方就是这里!我们可以在之前自动建立的mybatis文件夹中建立一个mapper文件夹,用来放我们要写的mapper文件
内容如下:
<?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="UserInfoMapper">
<resultMap id="UserInfoMap" type="HelloSpringMvc.model.UserInfo">
<result column="id" property="id" jdbcType="BIGINT" />
<result column="user_name" property="userName" jdbcType="VARCHAR" />
<result column="id" property="id" jdbcType="VARCHAR" />
</resultMap>
<select id="selectUserByID" resultMap="UserInfoMap">
select * from tbl_user_info where id = '1'
</select>
</mapper>
重点是一定要将resultMap与type对应起来,最后,我们将此mapper在mybatis-config.xml进行一下声明,在mybatis-config.xml文件中加上以下代码
<mappers> <mapper resource="mybatis/mapper/UserInfo.xml"/> </mappers>
经过以上几个步骤,我们就可以进行一下测试了,写一个测试类,如下
import HelloSpringMvc.model.UserInfo;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
/**
* Created by yuhan.shen on 2017/11/3.
*/
public class TestUserInfo {
/**
* SqlSessionFactory是用来创建SqlSession的工厂,SqlSession会执行映射的语句,进行事物提交、回滚等。
* @return
*/
public SqlSessionFactory getSqlSessionFactory() {
Reader reader = null;
SqlSessionFactory sqlSessionFactory = null;
try {
reader = Resources.getResourceAsReader("mybatis/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Test
public void selectTest(){
SqlSession session = getSqlSessionFactory().openSession();
try {
UserInfo userInfo = (UserInfo) session .selectOne("UserInfoMapper.selectUserByID");
System.out.println(userInfo.getPassword());
} finally {
session.close();
}
}
}
执行Test单元测试,就能得到结果。
其实,我们可以将session相关方法封装起来,使得自己要写的持久层代码(dao)层进一步简化,这种方式比jdbc简单很多,最重要的是不用去拼装sql啊!
相关文章推荐
- [Spring3.x] 第 11 章 使用 Spring JDBC 访问数据库 & 第 12 章 整合其他 ORM 框架
- [Spring3.x] 第 11 章 使用 Spring JDBC 访问数据库 & 第 12 章 整合其他 ORM 框架
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- java基础-使用jdbc访问数据库
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- JSP中使用JDBC驱动访问MS SQL SERVER数据库的例子
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 使用JDBC访问数据库
- FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 使用jdbc访问数据库
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 关于在applet中使用JDBC访问数据库的一点总结
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 使用JDBC创建数据库访问程序
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务