最近做项目用到了mybatis,抽空学习了下,这里总结一下吧。
在这一章,我们要用mybatis实现对一个单表进行增删改查。
环境配置
1. 引入必要jar包
新建一个Maven工程,在pom.xml里面加入mybatis和mysql数据库连接的依赖包
(也可自己去官网下载最新的jar包,然后手动导入项目)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
2. 创建数据库中的表以及项目中的entity
创建user
表:
CREATE TABLE `user` (
`username` varchar(255) CHARACTER SET utf8 NOT NULL,
`userpass` varchar(255) DEFAULT NULL,
`orgid` varchar(255) DEFAULT NULL,
`fullname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`username`)
)
创建user
实体类:
public class User {
private String username;
private String userpass;
private String orgid;
private String fullname;
public User() {
super();
}
public User(String username, String userpass, String orgid, String fullname) {
super();
this.username = username;
this.userpass = userpass;
this.orgid = orgid;
this.fullname = fullname;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String getOrgid() {
return orgid;
}
public void setOrgid(String orgid) {
this.orgid = orgid;
}
public String getFullname() {
return fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
}
3. 创建mybatis相关配置文件
- mybatis的配置文件:
在这里面配置别名,数据库的连接,mapper文件的位置等等
<?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>
<!--设置别名,方便mapper.xml文件中使用-->
<typeAliases>
<typeAlias alias="User" type="test.wsz.mybatis.entity.User" />
</typeAliases>
<!--配置数据库连接-->
<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://127.0.0.1:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!--数据库中实体的配置文件位置-->
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
- user实体对应的mapper文件
代码中可以根据namespace.id
运行指定的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">
<!--namespace命名空间可以任意命名,但不推荐。当命名空间与定义的配置类路径相等时,可用作配置类的补充(后面会补充)-->
<mapper namespace="test.wsz.mybatis.dao.UserDao">
<!--查,resultType为返回的类型,select查询的结果会根据列名(或别名)依次填充到类的同名字段中-->
<select id="getUserByID" parameterType="String" resultType="User">
select * from user where username = #{username}
</select>
<select id="getUserList" resultType="User">
select * from user;
</select>
<!--增,parameterType为插入的类型,#{xx}中对应类型里面的字段-->
<insert id="insertUser" parameterType="User">
insert into user
values(#{username},#{userpass},#{org},#{orgname},#{fullname})
</insert>
<!--改-->
<update id="updateUser" parameterType="User">
update user set
userpass=#{userpass},org=#{org},orgname=#{orgname},fullname=#{fullname}
where username = #{username}
</update>
<!--删-->
<delete id="deleteUser" parameterType="String">
delete from user where username
= #{id}
</delete>
</mapper>
基于xml的增删改查
public class Main {
//一个线程中建议只有一个
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static{
try {
reader=Resources.getResourceAsReader("config/mybatis-config.xml");
//读取mybatis-config.xml配置文件,生成sqlSessionFactory
sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public static void main(String[] args) {
//一个方法或请求中建议只有一个
SqlSession session=getSqlSessionFactory().openSession();
//查
User user=session.selectOne("test.wsz.mybatis.dao.UserDao.getUserByID","hahaha");
System.out.println(user.getUsername());
}
}
基于配置类的增删改查
上面的增删改查的方法固然简单,但总感觉不太方便,需要手动写好执行sql的路径,而且返回类型也没有指定,容易出错。
这里再推出一种更好的方式:没有mapper.xml文件,通过Java类进行配置:
public interface UserMapper{
@Select("select * from user where username= #{id}")
public User getUserByID(String id);
}
我们可以把UserMapper
当作一个mapper文件,让mybatis读进去,然后调用它的getUserByID
方法,传指定的形参,返回指定的类。
//将配置类加入mybatis的mapper中
getSqlSessionFactory().getConfiguration().addMapper(UserMapper.class);
//从mapper中获取配置类
UserMapper up=session.getMapper(UserMapper.class);
//进行查询
User u=up.getUserByID("hahaha");
System.out.println(u.getUsername());
这样就完全摆脱了xml文件的配置,看上去好像很美好,但是,如果我们要进行许多复杂操作(如映射,级联查询),会发现单纯的mapper类会很不方便。
这里再推出一种更好的方式:结合mapper.xml文件,通过Java类进行配置。
我们将xml文件的命名空间namespace
定义为配置类的路径,xml中sql的id名对应配置类中的方法
<!--namespace命名空间可以任意命名,但不推荐。当命名空间与定义的配置类路径相等时,可用作配置类的补充-->
<mapper namespace="test.wsz.mybatis.dao.UserMapper">
<!--查-->
<select id="getUserList" resultType="User">
select * from user;
</select>
<!--增-->
<insert id="insertUser" parameterType="User">
insert into user
values(#{username},#{userpass},#{orgid},#{fullname})
</insert>
<!--改-->
<update id="updateUser" parameterType="User">
update user set
userpass=#{userpass},orgid=#{orgid},fullname=#{fullname}
where username = #{username}
</update>
<!--删-->
<delete id="deleteUser" parameterType="String">
delete from user where username
= #{id}
</delete>
</mapper>
修改配置类:
public interface UserMapper{
public List<User> getUserList();
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(String userId);
}
进行测试:
//根据XML和配置类,增删改查
UserMapper userMapper=session.getMapper(UserMapper.class);
//查
List<User> users=userMapper.getUserList();
for (User user : users) {
System.out.println(user.getUsername());
}
//增
User user1=new User("wsz2", "123", "", "wsz");
userMapper.insertUser(user1);
session.commit();
//改
User user=new User("wsz2", "123", "", "sss");
userMapper.updateUser(user);
session.commit();
//删
userMapper.deleteUser("wsz2");
session.commit();