JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
和自定义MyBatis同样的测试代码
package com.itheima;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class TestCustomFrame2 {
@Test
public void test(){
//获取配置文件的输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = builder.build(is);
//获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List list = sqlSession.selectList("com.itheima.dao.UserDao.findAll");
//遍历结果集
for (Object o : list) {
System.out.println(o);
}
//关闭资源
sqlSession.close();
}
}
根据id查询
parameterType="参数类型"
在mybatis中,引入变量#{}
<select id="findById" resultType="com.itheima.domain.User" parameterType="java.lang.Integer">
select * from user where id = #{id}
select>
/*
根据id查询用户
*/
@Test
public void testFindById(){
//获取输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//生成SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//
List<User> userList = sqlSession.selectList("userMapper.findById",1);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
只查询到了一条数据,使用selectList就显得有点浪费,所以,有一个方法selectOne():
selectList
永远返回list集合,适合查询多个对象selectOne
返回一个对象,适合查询单个对象@Test
public void testFindById(){
//获取输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//生成SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//
// List userList = sqlSession.selectList("userMapper.findById",1);
// for (User user : userList) {
// System.out.println(user);
// }
/*
selectList永远返回list集合,适合查询多个对象
selectOne 返回一个对象,适合查询单个对象
*/
User user = sqlSession.selectOne("userMapper.findById", 1);
System.out.println(user);
sqlSession.close();
}
注意:
<insert id="save" parameterType="com.itheima.domain.User">
insert into user values(null,#{username},#{password},#{sex},#{address})
insert>
@Test
public void testSave(){
//获取输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//生成SqlSession对象
//获取的sqlSession不能自动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("田七");
user.setPassword("123");
user.setSex("男");
user.setAddress("安徽芜湖");
//执行sql语句
sqlSession.insert("userMapper.save",user);
//提交
sqlSession.commit();
//释放资源
sqlSession.close();
}
补充:日志
关于log4j.properties,有两条重要内容
1、
log4j.rootCategory=debug, CONSOLE, LOGFILE, info
其中的debug属性,如果没有debug,则运行时控制台不会输出日志。
2、
log4j.appender.LOGFILE.File=d:/axis.log
路径为日志输出的文件,文件里储存日志
<update id="update" parameterType="com.itheima.domain.User">
update user set username = #{username}, password = #{password}, sex = #{sex}, address=#{address}
where id = #{id}
update>
@Test
public void testUpdate(){
//获取输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//生成SqlSession对象
//获取的sqlSession不能自动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(8);
user.setUsername("王八2");
user.setPassword("1234562");
user.setSex("女2");
user.setAddress("江苏盐城2");
//执行sql语句
sqlSession.update("userMapper.update",user);
//提交
sqlSession.commit();
//释放资源
sqlSession.close();
}
<delete id="del" parameterType="java.lang.Integer">
delete from user where id=#{id}
delete>
@Test
public void testDel(){
//获取输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//生成SqlSession对象
//获取的sqlSession不能自动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
sqlSession.delete("userMapper.del",6);
//提交
sqlSession.commit();
//释放资源
sqlSession.close();
}
%a%
username like #{username}
a
username like "%"#{username}"%"
username like "%${value}%"
注意:
${}
和#{}
的区别:
${}
:直接拼接,不会转换类型,不能防注入
#{}
:转换类型后拼接,相当于占位符?,可以防注入
<select id="findByUsername" parameterType="java.lang.String" resultType="com.itheima.domain.User">
select * from user where username like "%${value}%"
select>
@Test
public void testFindByUsername(){
//获取输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//生成SqlSession对象
//获取的sqlSession不能自动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询操作
List<User> userList = sqlSession.selectList("userMapper.findByUsername","八");
for (User user : userList) {
System.out.println(user);
}
//提交
sqlSession.commit();
//释放资源
sqlSession.close();
}
#{}
可以进行类型的转换
在数据表user中添加一列datetime类型的birthday
但pojo中使用的却是String类型
private String birthday;
<insert id="save" parameterType="com.itheima.domain.User">
insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})
insert>
进行添加数据操作
user.setBirthday("1999-12-30");
可以看到日志文件中,进行了转换
userMapper.save - ==> Parameters: 新二(String), 123(String), 女(String), 北京(String), 1999-12-30(String)