MyBatis
MyBatis架构图
MyBatis初级入门案例-增删改查
在src下创建sqlMapConfig.xml和db.properties配置文件
sqlMapConfig.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>
<properties resource="db.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 注意我这里用db.properties引入可以正常运行 但是把url的数据放到value里就不能正常运行了 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
jdbc.username=login
jdbc.password=123
创建com.sikiedu.bean包并创建User.class
package com.sikiedu.bean;
import java.util.Date;
public class User {
/* CREATE TABLE `user` (
`u_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`u_username` varchar(64) NOT NULL COMMENT '用户名',
`u_password` varchar(64) DEFAULT NULL COMMENT '用户密码',
`u_sex` varchar(16) DEFAULT NULL COMMENT '用户性别',
`u_createTime` datetime DEFAULT NULL COMMENT '用户创建时间',
`u_cid` int(11) DEFAULT NULL COMMENT '用户国家id',
PRIMARY KEY (`u_id`),
KEY `FK_user_cid` (`u_cid`),
CONSTRAINT `FK_user_cid` FOREIGN KEY (`u_cid`) REFERENCES `country` (`c_Id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; */
//这里字段和数据库表里的字段完全对应的 可以使用resultType来自动映射
private Integer u_id;
private String u_username;
private String u_password;
private String u_sex;
private Date u_createTime;
private Integer u_cid;
/* 这里为 get和set方法 以及toString 有参构造器 和无参构造器*/
}
创建com.sikiedu.test包并创建HelloMyBatis.java测试类
package com.sikiedu.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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 org.junit.jupiter.api.Test;
import com.sikiedu.bean.User;
public class HelloMyBatis {
@Test
//入门程序 通过id查询用户
public void Test() throws IOException {
String resource="sqlMapConfig.xml";
//读取配置文件
InputStream in=Resources.getResourceAsStream(resource);
//需要sqlSessionFactoryBuilder
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//创建sqlSessionFactory
SqlSessionFactory ssf = ssfb.build(in);
//生产一个sqlSession
SqlSession session = ssf.openSession();
//操作数据库
//查找用户 第一个参数为要操作的sql语句 第二个为sql语句的参数
// User user=session.selectOne("UserMapper.selectUserById", 1);
//模糊查询用户
/* List<User> list=session.selectList("UserMapper.selectUserByName", "王");
for (User u : list) {
System.out.println(u);
}*/
//添加用户
/* User user=new User();
user.setU_username("雪风");
user.setU_password("123");
user.setU_sex("0");
user.setU_createTime(new Date());
user.setU_cid(1);
session.insert("UserMapper.insertUser", user);
session.commit();
*/
//更新用户
/* User user=new User();
user.setU_id(13);
user.setU_username("天津风");
session.insert("UserMapper.updateUser", user);
session.commit();*/
//删除用户
session.delete("UserMapper.deleteUserById", 13);
session.commit();
}
}
创建mapper文件,并在此文件下创建配置文件UserMapper.xml
<?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="UserMapper">
<select id="selectUserById" parameterType="Integer" resultType="com.sikiedu.bean.User">
select * from user where u_id =#{id}
</select>
<!-- #{} 占位符 尽量选用#{}来解决问题 -->
<!-- mybatis ${}用与字符拼接 -->
<select id="selectUserByName" parameterType="String" resultType="com.sikiedu.bean.User">
<!-- select * from user where u_username like '%${value}%' 字符串拼接 -->
select * from user where u_username like "%"#{name}"%"
</select>
<insert id="insertUser" parameterType="com.sikiedu.bean.User">
insert into user values(null,#{u_username},#{u_password},#{u_sex},#{u_createTime},#{u_cid})
</insert>
<update id="updateUser" parameterType="com.sikiedu.bean.User">
update user set u_username =#{u_username} where u_id=#{u_id}
</update>
<delete id="deleteUserById" parameterType="Integer">
delete from user where u_id=#{id}
</delete>
</mapper>
使用MyBatis开发Dao层
创建com.sikiedu.dao,并创建接口UserDao.java和实现类UserDaoImpl.java
UserDao.java
package com.sikiedu.dao;
import com.sikiedu.bean.User;
public interface UserDao {
//根据id 查询用户
public User getUserById(Integer id);
}
UserDaoImpl.java
package com.sikiedu.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.sikiedu.bean.User;
public class UserDaoImpl implements UserDao {
//sqlSession工厂
private SqlSessionFactory ssf;
//通过构造器给ssf赋值
public UserDaoImpl(SqlSessionFactory ssf) {
super();
this.ssf = ssf;
}
@Override
public User getUserById(Integer id){
//生产一个sqlSession
SqlSession session = ssf.openSession();
//操作数据库
return session.selectOne("UserMapper.selectUserById", id);
}
}
在com.sikiedu.test包中创建UserDaoTest.java测试类
UserDaoTest.java
package com.sikiedu.test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import com.sikiedu.bean.User;
import com.sikiedu.dao.UserDao;
import com.sikiedu.dao.UserDaoImpl;
public class UserDaoTest {
private static SqlSessionFactory ssf;
static {
String resource="sqlMapConfig.xml";
InputStream in;
try {
in = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
ssf=ssfb.build(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void DaoTest() {
UserDao dao=new UserDaoImpl(ssf);
User user = dao.getUserById(1);
System.out.println(user);
}
}
Mapper动态代理
在src下创建com.sikiedu.mapper包,包下创建接口UserMapper.java
UserMapper.java
package com.sikiedu.mapper;
import java.util.List;
import com.sikiedu.bean.User;
public interface UserMapper {
//mapper动态代理开发的四大原则
//1.接口方法名需要与mapper.xml的要调用的sql语句的id一致
//2.接口的形参类型需要与mapper.xml的parameterType一致
//3.接口的返回值需要与mapper.xml的resultType一致
//4.mapper.xml中的namespace要与接口的全包名一致
//5.注意 mapper动态代理开发中,根据返回值类型来自动选择selectOne或者selectList
//通过id查询用户
public User selectUserById(Integer id);
//通过用户名模糊查询 获取用户列表
public List<User> selectUserByName(String name);
//添加用户 注意添加更新 删除 操作要提交事务
public void insertUser(User user);
//更新用户
public void updateUser(User user);
//删除用户
public void deleteUserById(Integer id);
}
在测试包里添加测试类MapperTest.java
MapperTest.java
package com.sikiedu.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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 org.junit.jupiter.api.Test;
import com.sikiedu.bean.User;
import com.sikiedu.mapper.UserMapper;
public class MapperTest {
@Test
public void Test1() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
}
@Test
public void Test2() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.selectUserByName("王");
for (User u : list) {
System.out.println(u);
}
}
@Test
public void Test3() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user=new User();
user.setU_username("天津风");
user.setU_password("123");
user.setU_sex("0");
user.setU_createTime(new Date());
user.setU_cid(1);
mapper.insertUser(user);
session.commit();//事务提交
}
@Test
public void Test4() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user=new User();
user.setU_id(16);
user.setU_username("岛风");
mapper.updateUser(user);
session.commit();//事务提交
}
@Test
public void Test5() throws IOException {
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession session = ssf.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUserById(16);
session.commit();//事务提交
}
}
sqlMapConfig-typeAliases别名配置
在sqlMapConfig.xml中配置别名
sqlMapConfig.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>
<!-- 读取配置文件 -->
<properties resource="db.properties" />
<typeAliases>
<!-- 使用别名<typeAlias type="com.sikiedu.bean.User" alias="user"/> -->
<!-- 使用package包的形式配置别名
包的形式会扫描主包及子包下的所有文件
以对象名为别名,大小写不限,推荐使用小写 -->
<package name="com.sikiedu.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 注意我这里用db.properties引入可以正常运行 但是把url的数据放到value里就不能正常运行了 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
在UserMapper.xml中使用别名
<?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.sikiedu.mapper.UserMapper">
<select id="selectUserById" parameterType="Integer" resultType="user">
select * from user where u_id =#{id}
</select>
<!-- #{} 占位符 尽量选用#{}来解决问题 -->
<!-- mybatis ${}用与字符拼接 -->
<select id="selectUserByName" parameterType="String" resultType="user">
<!-- select * from user where u_username like '%${value}%' 字符串拼接 -->
select * from user where u_username like "%"#{name}"%"
</select>
<insert id="insertUser" parameterType="user">
insert into user values(null,#{u_username},#{u_password},#{u_sex},#{u_createTime},#{u_cid})
</insert>
<update id="updateUser" parameterType="user">
update user set u_username =#{u_username} where u_id=#{u_id}
</update>
<delete id="deleteUserById" parameterType="Integer">
delete from user where u_id=#{id}
</delete>
</mapper>
在sqlMapConfig.xml配置映射器的位置的四种方式
<!-- 配置映射器的位置 -->
<mappers>
<!-- 相对路径 mapper文件夹在src下 在mapper文件夹下有UserMapper.xml-->
<!-- <mapper resource="mapper/UserMapper.xml" /> -->
<!-- 绝对路径 -->
<!-- <mapper url="file:\\\F:\eclipse—workspace\ssm_mybatis\src\mapper\UserMapper.xml"/> -->
<!-- 使用接口的方式 要求UserMapper.xml必须和 UserMapper.java接口必须位于同一个com.sikiedu.mapper包内,且文件名一致-->
<!-- <mapper class="com.sikiedu.mapper.UserMapper"/> -->
<!--package形式 推荐使用 mapper位于哪个包就用扫描哪个包 -->
<package name="com.sikiedu.mapper"/>
</mappers>