[数据库 05] Mybatis 入门
Mybatis入门
1. Mybatis使用
把SQL写入xml文件,降低sql和程序的耦合
最大的变化: 之前写UserDao
接口之后写实现类UserDaoImp
, 现在写UserMapper.xml
配置文件
1. maven项目创建,添加依赖 mybatis
例子中,(创建的数据库名为mybatis,创建的表名为user)
2. 创建工具类
通过xml文件读入返回最后的SqlSession,类似于JDBC中的connection
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//固定写法,通过配置文件读入,从工厂建造得到工厂类
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();//从工厂类中获得sqlSession类(类似于得到数据库的连接connection类)
}
}
3. 写mybatis-config.xml配置文件
配置文件中,修改四个变量为数据库连接,<mappers>
标签保留
<?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?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/roy/dao/UserMapper.xml"/>
</mappers>
</configuration>
4. 写实体类pojo.User
5. 写UserDao接口(之后改为UserMapper)
6. 写UserMapper.xml(相当于之前的UserDaoImp)
<?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.roy.dao.UserDao">//相当于继承的接口
<select id="getUserList" resultType="com.roy.pojo.User">
// id是接口中的方法, result是返回的实体类对象(这里不管返回的是map还是list,写泛型里的类型,这里是实体类)
select * from mybatis.user //需要执行的select语句
</select>
</mapper>
把mapper
添加到mybatis-config.xml
配置文件中,配置文件添加:
<mappers>
<mapper resource="com/roy/dao/UserMapper.xml"/>
// 这里配置到UserMapper.xml的路径上,中间用/分开
</mappers>
7. test测试
测试需要先获得SqlSession对象,通过对象得到结果,并遍历
@Test
public void test(){
SqlSession sqlSession = null;
try {
sqlSession = MybatisUtils.getSqlSession();// 从工具类获得数据库连接
// 通过对接口的反射,获得接口的实现类,再new出一个实例对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 通过实例对象,调用方法,获得返回值
List<User> userList = mapper.getUserList();
// 遍历得到结果
for (User user : userList) {
System.out.println(user);
}
}finally {
// 关闭数据库连接
sqlSession.close();
}
}
8. 注意点:
-
写的
UserMapper.xml
文件在java文件夹下,maven项目的pom.xml
配置文件中必须过滤java文件夹下的xml文件,保证顺利编译//maven的pom.xml配置 <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build>
-
在
mybatis-config.xml
文件中添加写好的UserMapping.xml
资源路径<mappers> <mapper resource="com/roy/dao/UserMapper.xml"/> </mappers>
-
提升变量作用域时,记得删除提升前的变量类型声明
2. CRUD
UserMapper.java:
public interface UserMapper {
List<User> getUserList();
User getUserById(int id);
int addUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
UserMapper.xml 实现UserMapper接口
<?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.roy.dao.UserMapper">
<select id="getUserList" resultType="com.roy.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.roy.pojo.User">
select * from mybatis.user where id = #{id}
</select>
<!-- 1. 插入语句,要写insert标签,不能写select标签-->
<!-- 2. insert标签没有返回值, 不用写resultset属性-->
<!-- 3. insert的value中添加对象的属性,可以直接写属性(前提是类型是实体类),不用对象.get值-->
<!-- 4. 增删改必须提交事务才可以执行成功,否则回滚 在测试中需要添加sqlSession.commit();-->
<insert id="addUser" parameterType="com.roy.pojo.User">
insert into mybatis.user(`id`, `name`, `pwd`) values (#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.roy.pojo.User">
update mybatis.user set `name`=#{name}, `pwd`=#{pwd} where `id`=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete mybatis.user where id = #{id}
</delete>
</mapper>
1. select 查询
实现UserDao接口的xml文件:
写select标签,id为接口定义的方法名称, parameterType为传入的参数类型, resultType为返回值类型 如果是list,为list泛型的类型
<select id="getUserById" parameterType="int" resultType="com.roy.pojo.User">
select * from mybatis.user where id = #{id}
</select>
测试类:
@Test
public void getUserById(){
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtils.getSqlSession();//获得数据库连接
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 通过反射获得接口类,实例化一个对象
User userById = userMapper.getUserById(4);//调用函数并返回
System.out.println(userById);
}finally {
sqlSession.close();
}
}
Mybatis中,增删改的事务必须提交!!!!!
2. insert 插入
<!-- 1. 插入语句,要写insert标签,不能写select标签-->
<!-- 2. insert标签没有返回值, 不用写resultset属性-->
<!-- 3. insert的value中添加对象的属性,可以直接写属性(前提是类型是实体类),不用对象.get值-->
<!-- 4. 增删改必须提交事务才可以执行成功,否则回滚 在测试中需要添加sqlSession.commit();-->
<insert id="addUser" parameterType="com.roy.pojo.User">
insert into mybatis.user(`id`, `name`, `pwd`) values (#{id},#{name},#{pwd})
</insert>
测试类:
@Test
public void testOKInsert(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User insertUser = new User(4, "forth", "123");
mapper.addUser(insertUser);
sqlSession.commit();
sqlSession.close();
}
3. update 更新
<update id="updateUser" parameterType="com.roy.pojo.User">
update mybatis.user set `name`=#{name}, `pwd`=#{pwd} where `id`=#{id}
</update>
测试类:
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4, "afterUpdate", "999"));
sqlSession.commit();
sqlSession.close();
}
4. delete 删除
<delete id="deleteUser" parameterType="int">
delete mybatis.user where id = #{id}
</delete>
测试类:
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
3. Map 和 模糊查询
1. Map使用
当一个数据库属性很多时,插入语句中的字段往往需要一一对应,此时可以使用map
优点:xml文件中的value值不需要和数据库数据库中的一一对应,和map的key值对应就ok
- UserMapper.java 接口:
int addUser2(Map<String, Object> map);
- UserMapper.xml 接口实现:
<insert id="addUser2" parameterType="map">
insert into mybatis.user(`id`, `name`, `pwd`) values (#{key1_Userid},#{key2_UserName},#{key3_password})
</insert>
- 测试类:
@Test
public void testaddUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("key1_Userid", 5);
map.put("key2_UserName", "keyvalue");
map.put("key3_password", "mapPassword");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
UserMapper.xml中传递参数:
- 如果只有一个参数,parameterType可以不写!!!,例如根据id查询的方法
- 如果参数是实体类,sql语句中的取值必须和属性对应
- 如果参数是map,sql语句中的取值为map的key值
2. 模糊查询
模糊查询的实现,在测试类中传入参数:
当测试类中,调用UserMapper.xml中的方法:
List<User> userList = mapper.getUserLike("李%");//会去通配所有姓李的人
或者在.xml中定义:(id,定义传入参数是String,eg传入"1"
时,可以使用,如果pT为int则不行)
<select id="getUserById" parameterType="String" resultType="com.roy.pojo.User">
select * from mybatis.user where id like "%"#{id} // 在sql语句中写上%来实现模糊查询
</select>