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;
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>
<mappers>
<mapper resource="com/jun/dao/UserDao.xml"/>
mapper>
<package name="com.jun.dao"/>
resource属性指定mapper文件的路径,从类路径开始的路径信息。从target/classes(类路径)开启。
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>
namespace:命名空间,配置接口的包名+类名(要求使用dao接口的全限定名称)- id就是接口的方法名;resultType:返回值类型(包名+类名),是SQL语句执行后得到ResultSet,遍历这个ResultSet得到java对象的类型。
- sqlSession.getMapper();使用的是MyBatis的动态代理机制,getMapper能获取dao接口对应的实现类对象。
<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;
}
}
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>
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();
}
}
}
<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的哪个属性)
<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">
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
selectKey>
insert into t_user()values()
insert>
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 =