MyBatis学习记录(一) 初始MyBatis
最近想学习一下java web相关知识,于是就随便找了一个最近比较流行的一个持久层框架来学习,在实验楼学习的,感觉那个网站还是不错的,虽然很多课程需要会员,有在线的学习环境,但是我不想用,我还是比较喜欢本地练习。
什么是MyBatis呢?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
我对java也是刚刚入门的级别,所以里面的一些词语还是不太懂的,比如这个xml,我实验之后,给我的感觉它是一个配置文件,有点类似于json文件,然后POJO 我也不太清楚是什么东西。暂时先照葫芦画瓢把这个东西用起来。
准备条件
既然是根数据库有关的,那么肯定要装有数据库呀,我这里就是用的MySql,登录进去mysql -uroot -p
这里的-u 是说用户名,后面接的是用户名,然后-p表示需要密码,然后输入密码就可以登录到数据库啦。
然后新建一个mybatis测试用的数据库
create database mybatis;
然后新建一个表
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
sex varchar(10),
address varchar(20));
ok了,数据库的准备环境已经好了
然后就是MyBatis的环境了,首先下载MyBatis的包,去github下载就可以了,然后还需要一个连接mysql的java驱动包,去mysql的官网下载mysql-connector就可以了,接下来用你的ide,我比较喜欢idea,因为不喜欢eclipse的代码提示功能,创建一个web project,然后把这两个包加上一个mybatis目录lib里面的log4j-1.2.17.jar包 复制到web的lib(没有的话自己创建)目录下,然后再Project Structure 里面modules 的dependencis里面加入这个路径就行了。
然后基础的包都准备完毕。
然后就开始mybatis的配置了,在src目录下新建一个mybatis.cfg.xml文件,往里面填写
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.shiyanlou.mybatis.model" />
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- type="JDBC" 代表直接使用 JDBC 的提交和回滚设置 -->
<transactionManager type="JDBC" />
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- 数据库连接池,由 Mybatis 管理,数据库名是 mybatis,MySQL 用户名 root,密码为空 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="13198547" />
</dataSource>
</environment>
</environments>
<mappers>
<package name="com/shiyanlou/mybatis/mapper" />
</mappers>
</configuration>
这个配置文件我也是复制教程上的,我想如果以后自己要写一个项目的话,没有这个东西怎么办呀,先不管这么多,看看这个文件里面干了什么。
其实注释已经写的很清楚了,这里的JDBC我也不是太清楚到底是什么东西,大概也是用于控制数据库的东西。
这里面有个东西值得我们注意,就是dataSource这个里面的东西,可以看到里面写到了连接数据库的用户名和密码,用的时候注意改。
然后这里还有两个没有注释的就是 typeAliases 和 mappers 等会说。
配置完成之后,我们需要建立一个java类,和我们数据库中的表格来一个完全一致的对应关心,就是类的属性和表格的字段最好一样。
package com.shiyanlou.mybatis.model;
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private String address;
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
然后需要写一个你想要有哪些方法来操作数据库的一个接口,这里就是一个创建记录的方法,更新记录的方法,删除记录的方法,查询记录(根据id和所有)的方法,一共有五个方法,所以接口这么写:
package com.shiyanlou.mybatis.mapper;
import com.shiyanlou.mybatis.model.User;
import java.util.List;
public interface UserMapper {
/*
* 新增用户
* @param user
* @return
* @throws Exception*/
public int insertUser(User user) throws Exception;
public int updateUser(User user) throws Exception;
/*
* 删除用户
* @param id
* @return
* @throws Exception*/
public int deleteUser(Integer id) throws Exception;
/*
* 根据id查询用户
* @param id
* @return
* @throws Exception*/
public User selectUserById(Integer id) throws Exception;
/*
* 查询所有用户
* @return
* @throws Exception*/
public List<User> selectAllUser() throws Exception;
}
注意看最开头的package哦,它是这个接口所在的包,之后会用到。
然后接口完成之后,我们需要一个映射配置文件,在这个接口文件的包下,建立一个xml配置文件,用来配置具体的sql语句的实现(包括参数,返回类型)。
如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shiyanlou.mybatis.mapper.UserMapper">
<!-- 自定义返回结果集 -->
<resultMap id="userMap" type="User">
<id property="id" column="id" javaType="int"></id>
<result property="username" column="username" javaType="String"></result>
<result property="password" column="password" javaType="String"></result>
<result property="sex" column="sex" javaType="String"></result>
<result property="address" column="address" javaType="String"></result>
</resultMap>
<!-- 定义 SQL 语句,其中 id 需要和接口中的方法名一致 -->
<!-- useGeneratedKeys:实现自动生成主键 -->
<!-- keyProperty: 唯一标记一个属性 -->
<!-- parameterType 指明查询时使用的参数类型,resultType 指明查询返回的结果集类型 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into user (username,password,sex,address) values
(#{username},#{password},#{sex},#{address})
</insert>
<update id="updateUser" parameterType="User">
update user set
address=#{address} where
id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user where
id=#{id}
</delete>
<!-- 如未为 Java Bean 起类别名,resultType="com.shiyanlou.mybatis.model.User" -->
<!-- 使用resultType时,一定要保证,你属性名与字段名相同;如果不相同,就使用resultMap -->
<select id="selectUserById" parameterType="int" resultType="User">
select * from user where id=#{id}
</select>
<select id="selectAllUser" resultMap="userMap">
select * from user
</select>
</mapper>
我们看到那个一开始mapper 有个namespace 它的值就是接口文件的位置,这个配置文件非常关键(个人感觉),其中开头配置了一个自定义的返回结果类型,就是userMap,在selectAllUser中用到了这个类型,目前还没有看懂为什么要用到resultMap而不继续用resultType,然后这个配置文件继续定义了各种数据库操作的sql语句,可以看到这个里面的updateUser其实是只更新了address,有缺陷,可以完善一下。这个东西弄好了以后,我们要在mybatis的配置文件中设置一下,也就是之前我说以后说的那个部分,在mybatis.cfg.xml中添加:
<mappers>
<!-- 通过 mapper 接口包加载整个包的映射文件 -->
<package name="com/shiyanlou/mybatis/mapper" />
</mappers>
以及为我们的javabean起一个别名,在文件中添加
<typeAliases>
<package name="com.shiyanlou.mybatis.model" />
</typeAliases>
正是因为我们添加这个东西,所以我们在写那个UserMapper.xml配置文件的时候,就可以直接用User这个类,而不需要写完整的包路径。
然后我们添加一个记录日志,在src目录下新建一个mybatis的目录文件log4j.properties,然后添加内容:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# 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
我们再写一个测试文件,用户测试我们的之前写的所有东西是否正确。
我们创建一个UserTest类来进行测试。
package com.shiyanlou.mybatis.test;
import com.shiyanlou.mybatis.mapper.UserMapper;
import com.shiyanlou.mybatis.model.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private static SqlSessionFactory sqlSessionFactory;
public static void main(String[] args) {
// mybatis 配置文件路径
String resource = "mybatis.cfg.xml";
//得到配置流文件
InputStream inputStream = null;
try{
inputStream = Resources.getResourceAsStream(resource);
}catch (IOException e){
e.printStackTrace();
}
//创建会话工厂,传入MyBatis 的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//insertUser();
updateUser();
//selectUserById();
//selectAllUser();
//deleteUser();
}
// 新增用户
private static void insertUser(){
// 通过工厂得到SqlSession
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUsername("John");
user.setPassword("123456");
user.setSex("male");
user.setAddress("beijing");
try {
mapper.insertUser(user);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
session.close();
}
// 更新用户
private static void updateUser(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = null;
try {
user = mapper.selectUserById(1);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
user.setUsername("MiaoMiao");
try{
mapper.updateUser(user);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
session.close();
}
// 根据id删除用户
private static void deleteUser(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
try {
mapper.deleteUser(3);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
session.close();
}
// 根据id查找用户
private static void selectUserById(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
try{
User user = mapper.selectUserById(1);
session.commit();
System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
}catch (Exception e){
e.printStackTrace();
session.rollback();
}
session.close();
}
private static void selectAllUser(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
try {
List<User> userList = mapper.selectAllUser();
session.commit();
for (User user : userList){
System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
}
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
session.close();
}
}
同样注意包的名字,这个文件就比较好懂,里面配置了mybatis的配置文件,然后就可以根据这个东西创建一个SqlSessionFactory 来创建SqlSession了,然后就是基本的操作了。
最后我们就是一个一个方法进行测试就可以了。