文章目录
MyBatis
IDEA配置xml文件模板
Settings --> Editor --> File and Code Templates --> Unnamed --> name=mybatis-mapper / mybatis-config
- 建数据库表
DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE t_user(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(30),
`password` VARCHAR(12)
);
INSERT INTO t_user(`name`,`password`) VALUE('zhangsan',1234);
SELECT * FROM t_user;
- 添加依赖
<!--只有这个依赖才能保证在dao文件夹下的UserDAO.xml被加载到target/classes路径下-->
<build>
<!--资源插件:处理src/main/java目录中的xml文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
- mapper文件的配置
<mappers>
<!--第一种方式,resources="mapper文件的路径"-->
<mapper resource="com/jun/dao/UserDao.xml"/>
</mapper>
<!--第二种方式,使用package。name:包名,mapper文件所在的包名。
使用要求:mapper文件和dao接口在同一目录。mapper文件和dao接口名称完全一样。-->
<package name="com.jun.dao"/>
返回对象List集合
- 创建mybatis-config.xml配置文件
- 使用mapper的
resource
属性指定mapper文件的路径,从类路径开始的路径信息。从target/classes(类路径)开启。 - resource=“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>
<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"/>
<property name="username" value="root"/>
<property name="password" value="hrj"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserDAO.xml"/>
</mappers>
</configuration>
- 创建UserDAO接口和UserDAO.xml配置文件
namespace
:命名空间,配置接口的包名+类名(要求使用dao接口的全限定名称)- id就是接口的方法名;resultType:返回值类型(包名+类名),是SQL语句执行后得到ResultSet,遍历这个ResultSet得到java对象的类型。
- sqlSession.getMapper();使用的是MyBatis的动态代理机制,getMapper能获取dao接口对应的实现类对象。
<!--
//UserDAO接口:查询所有用户信息
public List<User> queryAllUsers();
-->
<mapper namespace="com.jun.dao.UserDAO">
<select id="queryAllUsers" resultType="com.jun.pojo.User">
select * from t_user;
</select>
</mapper>
resultType:告诉Mybatis,执行sql语句,把数据赋值给哪个类型的java对象。
- 测试程序
public void test01() throws Exception {
InputStream ins = Resources.getResourceAsStream("mybatis-config.xml"); //配置文件在类路径下
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);
//产生一个SqlSession会话对象连接MySql数据库
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建一个接口:接口的方法名与Mapper文件名要一致
//Mapper文件
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
List<User> userList = userDAO.queryAllUsers();
userList.forEach(user -> {
System.out.println(user);
});
}
重复代码提取:
- @Before 注解表示任何的单元测试@Test在执行之前都要执行@Before (import org.junit.Before;)
public class TestMybatis {
private SqlSessionFactory sqlSessionFactory;
//公共提取
@Before
public void beforeMybatis() throws Exception {
InputStream ins = Resources.getResourceAsStream("mybatis-config.xml"); //配置文件在类路径下
sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);
}
//方式二:
public class MyBatisUtils{
private static SqlSessionFactory sqlSessionFactory;
static{
InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);
}
//获取SqlSession的方法
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if(sqlSessionFactory != null){
sqlSession=sqlSessionFactory.openSession();//非自动提交事务
}
return sqlSession;
}
}
返回单个对象
- UserMapper.xml文件
public User queryUserById(Integer id);
parameterType:形参的类型(自定义JavaBean必须加:包名+类名),可以省略不写
#{}是Mybatis的占位符,相当于jdbc的?
<select id="queryUserById" parameterType="Integer" resultType="com.jun.pojo.User">
select `id`,`name`,`password` from t_user where id = #{id}
</select>
- UserMapper接口,增加功能
openSession():无参数/参数为false,获取的是非自动提交事务的SqlSession对象
public interface UserMapper {
//查询所有用户信息
public List<User> queryAllUsers();
//根据用户ID查询一个用户信息
public User queryUserById(Integer id);
}
public void test2() {
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
更改用户信息
- UserMapper接口:public void updateUser(User user);
<mapper>
<update id="updateUser">
update t_user set `name` = #{name}, `password` = #{password} where id = #{id}
</update>
</mapper>
插入记录并返回主键
insert标签配置insert的sql语句:id配置唯一标识;
- parameterType配置方法的参数 类型(它是可选的,一般情况下,一个参数,且是JavaBean的时候。建议写上,提高可写性)
- useGeneratedKeys=“true”: 开启获取自增主键的策略
- keyColumn: 指定数据库主键的列名
- keyProperty: 指定对应的主键属性, ps(获取到主键值后, 将这个值封装给javaBean的哪个属性)
<!-- public int addUser(User user);-->
<insert id="addUser" parameterType="com.jun.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into t_user(name,password) values (#{name},#{password})
</insert>
扩展:
- selectKey: 配置查询主键的sql语句
- keyProperty:查出的主键值封装给javaBean的哪个属性
- order:
- BEFORE:当前sql在插入sql之前运行;AFTER:当前sql在插入sql之后运行
扩展二:
<insert id="addUser" parameterType="com.jun.pojo.User">
<!--返回主键ID-->
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into t_user()values()
</insert>
- MyBatis默认不是自动提交事务的,所以在insert、update、delete后要手工提交事务。
public void test5() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("root");
user.setPassword("huawei");
int count = mapper.addUser(user);
System.out.println("count = " + count);
sqlSession.commit();
sqlSession.close();
}
返回对象Map集合
UserMapper接口中的方法
//查询所有用户集合,保存到Map中。@MapKey中的参数是:User对象中的//private Integer id;
@MapKey("id")
public Map<Integer,User> queryUsersForMap();
<mapper>
<select id="queryUsersForMap