第一个Mybatis程序
在这里不详细的列出mybatis基础知识和使用方法,仅仅用一个小案例展现一下mybatis的使用。作者使用创建简单项目的方式来进行展示,需要手动添加jar包。
1.创建数据表
首先创建一个数据表,这里创建了一个简单的用户表,字段名分别为id、name、psw。
CREATE DATABASE `mybatis`;
USE `mybatis`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`pwd`) values
(1,'张三','123456'),
(2,'李四','123456'),
(3,'王五','123456');
2.导入mybatis环境所需要的jar包
这是mybatis的核心包及mybatis依赖的的jar包
3.配置maybatis
在项目根目录下创建创建名为mybatis-config.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>
<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/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="用户名"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/dao/UserMapper.xml"/>
</mappers>
</configuration>
文件内容需要按数据库来修改,填入数据库的用户名和密码
因为mybatis需要log4j日志的依赖还需创建log4j.properties文件配置log4j
# Global logging configuration
log4j.rootLogger=ERROR,stdout
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# 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
4.CRUD
- 首先对应用户表创建实体类User.java
public class User {
private int id;
private String name;
private String pwd;
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public User() {
}
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 String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
- 编写mybatis工具类MybatisUtils.java
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybatis获取sqlSessionFactory对象
String resource="mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
- 编写DAO层userDao接口来编写增删改操作的方法
public interface UserDao {
//查询全部用户
List<User> getUserList();
//根据id查询用户
User getUserById(int id);
//插入一个用户
int addUser(User user);
//修改用户
int updateUser(User user);
//删除一个用户
int deleteUser(int id);
}
- 编写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="com.mybatis.dao.UserDao">
<select id="getUserList" resultType="com.mybatis.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" resultType="com.mybatis.pojo.User">
select * from mybatis.user where id=#{id}
</select>
<insert id="addUser" parameterType="com.mybatis.pojo.User">
insert into mybatis.user(id,name,pwd)values (#{id},#{name},#{pwd});
</insert>
<update id="updateUser" parameterType="com.mybatis.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id};
</update>
<delete id="deleteUser">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
进行增删改查操作的代码已预先写好,这里不详细列出使用方法
需要注意:
一定不要忘掉命名空间的书写,要不然会提示找不到mapper关联的异常
id名一定要严格按照接口中的方法名来书写
返回值类型resultType和参数类型parameterType为表内全部字段是一定要书写,对应参数为类的位置
- 编写测试类进行功能测试
public class UserDaoTest {
public static void main(String[] args) {
//获取sqlSession
SqlSession sqlSession= MybatisUtils.getSession();
//执行sql
UserDao userDao=sqlSession.getMapper(UserDao.class);
// List<User> userList=userDao.getUserList();
// for(User user : userList){
// System.out.println(user);
// }
// User user=userDao.getUserById(1);
// System.out.println(user);
// int i=userDao.addUser(new User(4,"王五","123456"));
if(i>0){
System.out.println("插入成功!");
}
sqlSession.commit();
// int i=userDao.updateUser(new User(4,"王五","888888"));
// if(i>0){
// System.out.println("修改成功!");
// }
// sqlSession.commit();
int i=userDao.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
由于没有导入junit包所以没有单元测试,整体写在了main方法中。
增删改操作切记不要忘了提交事务,不然数据无变化。
5.整体
整体结构如下
注意事项
- resource绑定mapper,需要使用路径!
- mapper中的id标签不要匹配错!
- 程序配置文件必须符合规范!