官网:mybatis – MyBatis 3 | 简介
先做实例如下:
一:数据库建表(自己有的话可以不用创建)
CREATE TABLE USER(
id INT(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(30) DEFAULT NULL,
pwd VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=UTF8;
INSERT INTO USER(id,NAME,pwd)VALUES
(1,'张子谦','123456'),
(2,'张子涵','123456'),
(3,'张飞','12345678')
二:导入依赖需要三个依赖:
<dependency>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.2version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
三:编写核心配置文件mybatis.xml
xml version="1.0" encoding="UTF-8" ?>
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=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
environments>
//每一个Mapper.xml文件都需要在mybatis核心配置文件中注册
<mappers>
<mapper resource="dao/UserMapper.xml"/>
mappers>
configuration>
自己的数据库名记得要更改。
四:编写mybatis工具类(获取slsessionFactory对象以及获取配置文件的资源)
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;
public class Mybatis {
private static SqlSessionFactory sqlSessionFactory;
static {
try {//使用mybatis获取SQLSessionFactory对象
//获取配置文件的资源
String resource = "mybatis.xml";
//通过流和Resources这个类加载资源
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e){
e.printStackTrace();
}
}
//既然有了sqlsessionfactory,顾名思义,我们就可以从中获取sqlsession的实例了,sqlsession完全包含了面向数据库执行SQL,命令所需要的所有方法
public static SqlSession getsqlsession(){
return sqlSessionFactory.openSession();
}
}
五:编写实体类
package com.zhang.pojo;
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
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 + '\'' +
'}';
}
}
六:dao接口类,(这里写这个类是为了操作数据库的)
package com.zhang.dao;
import com.zhang.pojo.User;
import java.util.List;
public interface UserDao {
//获取全部用户
List<User> getUserlist();
//查询一个用户
User getuserid(int id);
//插入一个用户
int adduser(User user);
//修改用户
int updateuser(User user);
//删除一个用户
int deluser(int id);
}
}
七:接口类的Mapper.xml文件(原本应该是接口的实现类,用Mapper配置文件来代替)
xml version="1.0" encoding="UTF-8" ?>
mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
这里的命名空间namespace=绑定一个对应的dao/Mapper接口
<mapper namespace="com.zhang.dao.UserDao">
//id相当于上面接口里面的方法名,返回类型要写全限定名
//resultType:SQL语句执行后的返回值,parametertype:参数类型,
<select id="getUserlist" resultType="com.zhang.pojo.User">
select * from mybatis.user
select>
<select id="getuserid" parameterType="int" resultType="com.zhang.pojo.User">
select * from mybatis.user where id=#{id}
select>
<insert id="adduser" parameterType="com.zhang.pojo.User">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})
insert>
<update id="updateuser" parameterType="com.zhang.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
update>
<delete id="deluser" parameterType="int">
delete from mybatis.user where id=#{id};
delete>
mapper>
八:测试
public class UserDaoTest {
@Test
public void test(){
//第一步,获取sqlsession对象
SqlSession sqlSession= MybatilsUtils.getsqlsession();
//执行SQL
UserDao userDao=sqlSession.getMapper(UserDao.class);
List<User> userlist = userDao.getUserlist();
for(User user :userlist){
System.out.println(user);
}
//关闭sql
sqlSession.close();
}
@Test
public void getuserid(){
SqlSession sqlSession=MybatilsUtils.getsqlsession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user=mapper.getuserid(1);
System.out.println(user);
sqlSession.close();
}
//插入数据,增删改需要提交时事务
@Test
public void adduser(){
SqlSession sqlSession=MybatilsUtils.getsqlsession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
int res=mapper.adduser(new User(5,"张云","12457"));
if(res>0){
System.out.println("插入成功");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
//修改数据,增删改需要提交时事务
@Test
public void updateuser(){
SqlSession sqlSession=MybatilsUtils.getsqlsession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
int res=mapper.updateuser(new User(5,"张呵呵","12457"));
//提交事务
sqlSession.commit();
sqlSession.close();
}
//删除用户
@Test
public void deluser(){
SqlSession sqlSession=MybatilsUtils.getsqlsession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
mapper.deluser(5);
sqlSession.commit();
sqlSession.close();
}
}
注意:增删改需要提交事务!
如果配置文件无法生效,在pom文件中加入这一段话即可。放在依赖后面。是关于资源过滤的。
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
resource>
resources>
build>
小结:除了数据库建表之外,一共大概七步。
一:pom文件,导入依赖
二:mybatis-config.xml配置文件,数据库信息
三:工具类:MybatisUtils
四:实体类 user
五:接口UserDao
六:Usermapper.xml
七:测试
可能出现的错误:
标签匹配错误
resource绑定的mapper,需要使用路径,就是“ / ”,
程序配置文件必须符合规范
nullpointerException:没有注册到资源
输出的xml文件中存在中文乱码问题
maven资源没有导出错误,加一段build代码即可,上面有
聊聊mybatis:
一:它是一款优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取及获取结果集。可以使用简单的xml文件或者注解大方式配置和映射原生类型。
二:三种映射的区别:
resource
适用类路径下,直接加载mybatis对应的映射文件,用/
进行分割,对于文件名称和文件位置没有强制限制条件,比较灵活,不容易出错
class:
仅适用于类路径下,接口文件与映射文件在同一路径下
,且接口名与映射文件名相同
,并且映射文件命名为接口全类名的情况,使用.
分割,有智能提示,限制条件较多,容易出错
package:
适用于类路径下,接口文件与映射文件在同一路径下
,且接口名与映射文件名相同
,并且映射文件命名为接口全类名的情况,即简化了class
parameterType:指定输入参数类型,mybatis获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
parameterType写在前面 resultType写在后面
三:如果需要连接数据库的配置文件在核心文件中配置即可。
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
------
<configuration>
<properties resource="db.properties">
properties>
<typeAliases>
<typeAlias type="com.zhang.pojo.User" alias="User"/>
typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/zhang/dao/UserMapper.xml"/>
mappers>
configuration>
四:万能Map
假如数据库中的表或者字段过多,我们使用Map
int addUser2(map
insert into mybatis.user (id,pwd)values(#{id},#{pwd}
测试:
map.put("id",24)
map.put("pwd",3435)
mapper.adduser2(map)
关于模糊查询:
五:解决属性名和和字段不一致的问题:使用结果集映射
<resultMap id="UserMap" type="User">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
resultMap>
<select id="getuserid" resultMap="UserMap">
select * from mybatis.user where id=#{id}
select>
知识点先到这里,后续的再补充。