工具及软件
编辑器:intellij IDEA
项目基础:使用maven构建demo项目(maven构建项目,可以节省导jar包的繁琐,由于采用依赖注入的方式,基本不会出现漏jar包导致项目出错的情况)
项目结构(备注:使用log4j作为日志输出管理)
pom.xml
<dependencies>
<!-- 引入junit,作为测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 引入mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- 引入log4j日志驱动 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
Mybatis的核心配置文件sqlMapConfig.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文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 开启log4j日志,注意顺序,必须在前面,且在properties后面,否则会报错 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 赋别名,注意顺序必须在前面,且在settings后面,否则会报错 -->
<typeAliases>
<typeAlias type="cn.vision.entity.User" alias="User"/>
</typeAliases>
<!-- 配置开发环境,可以配置多个,在具体用时再做切换 -->
<environments default="test">
<environment id="test">
<transactionManager type="JDBC"></transactionManager> <!-- 事务管理类型:JDBC、MANAGED -->
<dataSource type="POOLED"> <!-- 数据源类型:POOLED、UNPOOLED、JNDI -->
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 mapper -->
<mappers>
<!-- 路径用 斜线(/) 分割,而不是用 点(.) -->
<mapper resource="cn/vision/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
jdbc配置文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=0
jdbc.maxActive=20
jdbc.maxIdle=20
jdbc.minIdle=1
jdbc.maxWait=60000
log4j日志文件配置属性
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service] %d -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.R.File=../logs/service.log
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug
数据库
CREATE TABLE `mybatis` (
`Id` varchar(255) NOT NULL DEFAULT '',
`userId` varchar(255) NOT NULL DEFAULT '',
`userName` varchar(255) NOT NULL DEFAULT '',
`sex` varchar(8) NOT NULL DEFAULT '',
`age` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `mybatis` VALUES ('123456','user123456','测试3','男',11),('3d993a1d-b6de-403a-b104-bf4d86643ac1','ad123456','测试','男',11),('bc80e443-ca53-4ef1-adbd-312e282f2d06','ad123456','测试2','男',11);
基本准备工作完成下面进行测试文件编写
Entity
package cn.vision.entity;
public class User {
String id;
String userId;
String userName;
String sex;
int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
mapper---------简单mybatis动态sql语句查询操作
<?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="cn.vision/mapper.UserMapper"> <!-- 命名空间,名字可以随意起,只要不冲突即可 -->
<!-- 对象映射,可以不写 -->
<!-- 查询功能,resultType 设置返回值类型 -->
<select id="findAll" resultType="User"> <!-- 书写 SQL 语句 -->
SELECT * FROM mybatis
<where>
<if test="userName != null">
userName = #{userName}
</if>
<if test="userId != null">
AND userId = #{userId}
</if>
</where>
</select>
</mapper>
test------------使用junit单元测试进行
package cn.vision.test;
import cn.vision.entity.User;
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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class testMybatis {
SqlSession sqlSession;
@Before
public void init()throws IOException{
String resource = "sqlMapConfig.xml"; //定位核心配置文件
//官方示例获取resource,需抛出异常
InputStream inputStream = Resources.getResourceAsStream(resource);
//通过类属性获得resource,无需抛出异常
//InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 创建 SqlSessionFactory
sqlSession = sqlSessionFactory.openSession(); //获取到 SqlSession
}
@Test
public void ceshi() throws IOException{
/**
* 1、获得 SqlSessionFactory
* 2、获得 SqlSession
* 3、调用在 mapper 文件中配置的 SQL 语句
*/
String resource = "sqlMapConfig.xml"; // 定位核心配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 创建 SqlSessionFactory
SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取到 SqlSession
// 调用 mapper 中的方法:命名空间 + id
User user = new User();
user.setUserId("user123456");
List<User> personList = sqlSession.selectList("cn.vision/mapper.UserMapper.findAll");
// List<User> personList = sqlSession.selectList("cn.vision/mapper.UserMapper.findAll",user);
for (User p : personList){
System.out.println("name: "+p.getUserName());
}
}
}
成功查询到数据则为
两个问题
1、为什么使用junit单元测试?
使用单元测试可以更好、更简洁的测试每一个模块/方法的执行结果。如果不使用junit的话,很可能你为了某一个模块的测试结果而运行整个项目,从时间和效率角度来讲,熟练使用一个便捷的测试工具会给开发带来质的变化
2、mybatis和hibernate区别是什么?
嗯、简单来说hibernate更封闭和笨重、安全性更高适合大企业开发项目
mybatis更开放、量级更轻,适用于快速开发项目
hibernate的sql语句都能通过hql统一解决不同数据库的兼容性问题,sql语句完全封装,一般情况下不能定制更高效率的sql语句
mybatis需要根据不同的数据库编写不同的sql语句,但mybatis可以为不同的需求编写更高效率的sql语句
此章只涉及到mybatis的基础配置,并未实际应用与web项目,所以并未配置web.xml
内容仅为作者的个人学习路上的笔记,和个人见解,概括不全或有误之处,可留言或私信修改
---------------------------------2018/05/05-----------------------------------------