最近在学习使用MyBatis这个工具包来进行数据库开发,发现黑马程序员的一个资源分享网站做的特别好,视频课程讲的清楚又免费!链接地址备忘
http://yun.itheima.com/course/41.html
,推荐看着学习。
在学习中,其中很重要的一点就是如何配置MyBatis便于访问数据库。我将其中的MyBatis基础知识配置部分全部整理了一下,如果不想看理论讲解直接讲使用的话,按着这个步骤足够了。
如图是MyBatis的配置文件相关的目录结构,并列明了配置的具体步骤,像具体创建完SqlMapConfig.xml之后可能随着项目需求的变化跟着改变配置。
备注添加:图中log4j,properties文件的目录位置是错的,应该放在src根目录下,不然容易警告找不到log。
以下分别按照配置步骤逐个说明:
Step1:添加引用jar包。
需要添加MyBatis包的lib里所有的jar,如图
以及
mybatis-3.2.7.jar包本身,我自己使用的是3.2.7版本,从GitHub上下载的。
添加jar包的方法:
菜单Project->Properties->Java Build Path->Libraries->Add Exterrnal JARS,如图:
Step2:添加配置SqlMapConfig.xml文件
src跟文件夹下新建了config文件夹,及SqlMapConfig.xml,具体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
>
<!-- <settings></settings> -->
<!-- 自定义别名 -->
<
typeAliases
>
<!-- 单个别名定义 -->
<!-- <typeAlias type="com.itheima.mybatis.po.User" alias="user"/> -->
<!-- 批量别名定义(推荐) -->
<!-- package:指定包名称来为该包下的
po
类声明别名,默认的别名就是类名(首字母大小写都可) -->
<
package
name
=
"com.itheima.mybatis.po"
/>
</
typeAliases
>
<!-- 配置
mybatis
的环境信息,与spring整合,该信息由spring来管理 -->
<
environments
default
=
"development"
>
<
environment
id
=
"development"
>
<!-- 配置JDBC事务控制,由
mybatis
进行管理 -->
<
transactionManager
type
=
"JDBC"
></
transactionManager
>
<!-- 配置数据源,采用
mybatis
连接池 -->
<
dataSource
type
=
"POOLED"
>
<
property
name
=
"driver"
value
=
"com.mysql.jdbc.Driver"
/>
<
property
name
=
"url"
value
=
"jdbc:mysql://localhost:3306/my_db_test"
/>
<
property
name
=
"username"
value
=
"root"
/>
<
property
name
=
"password"
value
=
"123456"
/>
</
dataSource
>
</
environment
>
</
environments
>
<!-- 加载映射文件,2018-4-14yanru修改 -->
<
mappers
>
<
mapper
resource
=
"config/sqlmap/UserMapper.xml"
/>
<!-- <mapper resource="
mapper
/UserMapper.xml" /> -->
<!-- 批量加载映射文件 -->
<
package
name
=
"com.itheima.mybatis.mapper"
/>
</
mappers
>
</
configuration
>
其中注意的是,
my_db_test
指的是我本机数据库的名称。以及UserMapper.xml是我所使用的测试加载Mapper文件,具体的SQL语句就会配在其中。
以下为创建和初始化表信息:
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(10) NOT NULL DEFAULT '1',
`name` varchar(100) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`age`) values (1,'哈哈',2),(2,'张三',1),(3,'李四',2),(4,'王五',1),(5,'啥名字',2),(6,'赵六',1),(7,'赵六',2);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
Step3:创建名为log4j.properties的文件:
具体配置文件内容如下,唯一注意的就是log级别,默认开发者模式用DEBUG选项,等项目发布以后再改为INFO用户级别。备注,log4j这个文件最好放在src根目录下不然会出现如图的找不到log文件的报错导致log4j的一些调试log无法正常输出:(我也是查询了
https://www.cnblogs.com/huxinga/p/6868074.html
这个链接地址的解决方案才好的
)
如下是配置文件具体内容:
# Global logging configuration,DEBUG is development environment,INFO is user environment
log4j.rootLogger=
DEBUG,
stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=
TRACE
# Console output...
log4j.appender.stdout=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=
%5p
[%t]
-
%m%n
Step4:创建跟表结构一致的数据结构:
如下我创建了User.java类,类名任意,只要类成员结构跟数据库表对得上就行。其中,我还故意测试一下,比如本来作为表主键的id(int类型)我在数据结构类中故意修改为了String类型,结果也能“碰巧测试通过”,不会严格编译或运行报错,但是我们都知道类型不一致这写法太不安全了,所以原则上数据类的成员类型必须和数据库保持一致、或值域一致。
package
cn.mytest.mybatis.po;
/**
*
@version
2018
-
4
-
14 17:12:24
*
@author
DELL
*/
public
class
User
{
//属性名要和数据库表的字段对应
private
int
id
;
private
String
name
;
private
int
age
;
public
int
getId() {
return
id
;
}
public
void
setId(
int
id
) {
this
.
id
=
id
;
}
public
String getName() {
return
name
;
}
public
void
setName(String
name
) {
this
.
name
=
name
;
}
public
int
getAge() {
return
age
;
}
public
void
setAge(
int
age
) {
this
.
age
=
age
;
}
}
Step5:添加并为user表配置相应的SQL语句XML UserMapper.xml:
如下具体是UserMapper.xml的配置内容,其中我只配了一个SQL表达式"
findUserById
"用于查询用户信息:
<?
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"
>
<!--
namespace
命名空间,作用就是对
sql
进行分类花管理,理解
sql
隔离
注意:使用
mapper
代理方法开发,
namespace
有特殊重要的作用
-->
<
mapper
namespace
=
"test"
>
<!-- 在映射文件中配置很多
sql
语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过select执行数据库查询,以下为精确查询
id:标识 映射文件中的
sql
将
sql
语句封装到mappedStatement对象中,所以将id成为statement的id
①parameterType:指定输入参数的类型,这里指定
int
型
②#{}表示一个占位符
③#{id}:其中的id表示接收输入的参数,参数名称就是id,如果参数类型是简单类型,#{}中的参数名可以任意,可以是value或其他名称
④resultType:指定
sql
输出结果的所映射的java对象雷西兴,select指定resultType表示将单条记录映射成的java对象。
-->
<
select
id
=
"findUserById"
parameterType
=
"int"
resultType
=
"cn.mytest.mybatis.po.User"
>
SELECT * FROM USER WHERE id=#{value}
</
select
>
</
mapper
>
Step6:创建工作类测试与数据库的交互:
最后我创建了一个名为MyFirstBatis.java的工作类用来访问数据库:
package cn.mytest.mybatis.first;
import org.junit.Test;
import cn.mytest.mybatis.po.User;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* <p>Description:MyBatis入门程序,用于处理对数据库的增删改查</p>
* @author DELL
*
*/
public class MyBatisFirst {
//根据id查询用户信息,得到一条结果记录
@Test
public void findUserByIdTest()
{
//MyBatis配置文件
String resource ="config/SqlMapConfig.xml";
//step1:得到配置文件流
java.io.InputStream inputStream = null;
try {
//具体.getResourceAsStream中相对路径的格式为src基础资源目录为根目录,最好将其他要加载的文件也放在src文件夹下
inputStream = Resources.getResourceAsStream(resource);
System.out.println("success get resource="+resource);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Resources.getResourceAsStream获取路径="+resource+"的资源失败!");
e.printStackTrace();
}
//step2:创建会话工厂
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
//step3:通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//step4:通过SQLSession操作数据库
//第一个参数,映射文件中statement的id,等于namespace+"."+statement的id
//第二个参数:指定和映射文件中所匹配的parameterType类型的参数
//sqlSession.selectOne结果与映射文件中所匹配的resultType类型的对象
User user= sqlSession.selectOne("test.findUserById",3);
System.out.println(user);
System.out.println("sqlSession res output getId="+user.getId());
System.out.println("sqlSession res output getName="+user.getName());
System.out.println("sqlSession res output getAge="+user.getAge());
//释放资源
sqlSession.close();
}
}
最后运行效果,成功查询数据库!如图