1、将上面案例中的UserMapper接口改名为 UserDao;
2、将UserMapper.xml中的namespace改为为UserDao的路径 .
3、再次测试
结论:
配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
需求:根据id查询用户
1、在UserMapper中添加对应方法
public interface UserMapper {
// 查询全部用户
List<User> getUserList();
// 根据ID查询用户
User getUserById(int id);
}
2、在UserMapper.xml中添加Select语句
<select id="getUserById" resultType="com.fan.pojo.User">
select * from mybatis.user where id = #{id}
select>
3、测试类中测试
@Test
public void getUserById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
我们一般使用insert标签进行插入操作,它的配置和select标签差不多!
需求:给数据库增加一个用户
1、在UserMapper接口中增加对应的方法
// insert一个用户
int addUser(User user);
2、在UserMapper.xml中添加insert语句
<insert id="addUser" parameterType="com.fan.pojo.User">
insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
insert>
3、测试
// 增删改需要提交事务
@Test
public void addUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.addUser(new User(5, "哈哈", "123333"));
if (res > 0) {
System.out.println("插入成功!");
}
// 提交事务
sqlSession.commit();
sqlSession.close();
}
注意点:增、删、改操作需要提交事务!
我们一般使用update标签进行更新操作,它的配置和select标签差不多!
需求:修改用户的信息
1、同理:编写接口方法
// 修改用户
int updateUser(User user);
2、编写对应的配置文件的SQL
<update id="updateUser" parameterType="com.fan.pojo.User">
update mybatis.user set name = #{name}, pwd = #{pwd} where id = #{id};
update>
3、测试
@Test
public void updateUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4, "呵呵", "123123"));
sqlSession.commit();
sqlSession.close();
}
我们一般使用delete标签进行删除操作,它的配置和select标签差不多!
需求:根据id删除一个用户
1、同理:编写接口方法
// 删除一个用户
int deleteUser(int id);
2、编写对应的配置文件SQL
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
delete>
3、测试
@Test
public void deleteUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
小结
模糊查询like语句该怎么写?
第1种:在Java代码中添加sql通配符。
@Test
public void getUserLike() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("%李%");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
<select id="getUserLike" resultType="com.fan.pojo.User">
select * from mybatis.user where name like #{value}
select>
第2种:在sql语句中拼接通配符,会引起sql注入
string wildcardname = “smi”;
list names = mapper.selectlike(wildcardname);
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
我们可以阅读 mybaits-config.xml 上面的 dtd 的头文件!
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
transactionManager>
<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>
配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
子元素节点:environment
type="[UNPOOLED|POOLED|JNDI]")
<transactionManager type="[ JDBC | MANAGED ]"/>
我们可以通过properties属性来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。【db.properties】
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
在核心配置文件中映入
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="pwd" value="11111"/>
properties>
<typeAliases>
<typeAlias type="com.fan.pojo.User" alias="User"/>
typeAliases>
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
扫描实体类的包,它的默认别名就为这个类的 类名,首字母小写!
<typeAliases>
<package name="com.fan.pojo"/>
typeAliases>
在实体类比较少的时候,使用第一种方式。
如果实体类十分多,建议使用第二种。
第一种可以DIY别名,第二种则·不行·,如果非要改,需要在实体上增加注解
@Alias("user")
public class User {
}
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
MapperRegistry:注册绑定我们的Mapper文件
方式一: 【推荐使用】
<mappers>
<mapper resource="com/fan/dao/UserMapper.xml"/>
mappers>
方式二:使用class文件绑定注册
<mappers>
<mapper class="com.fan.dao.UserMapper"/>
mappers>
注意点:
方式三:使用扫描包进行注入绑定
<mappers>
<package name="com.fan.dao"/>
mappers>
注意点:
生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
SqlSessionFactory:
SqlSession
数据库中的字段
public class User {
private int id;
private String name;
private String password;
}
测试出现问题
解决方法:
<select id="getUserById" resultType="com.fan.pojo.User">
select id,name,pwd as password from mybatis.user where id = #{id}
结果集映射
id name pwd
id name password
<resultMap id="UserMap" type="User">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
resultMap>
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id = #{id}
select>
resultMap
元素是 MyBatis 中最重要最强大的元素ResultMap
最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。