Mybatis入门案例
抽取生成sqlsessionfactory的方法 测试API中的注解,在执行@Test之前 先执行
实现代码:
public class TestMybatis2 {
SqlSessionFactory sqlSessionFactory;
@Test
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource="mybatis/mybatis-config.xml";
InputStream inputstream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
}
@Test
public void testMybatis01(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
List<DemoUser> list = mapper.findAll();
System.out.println(list);
}
为什么不提取sqlSession???
@Test
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource="mybatis/mybatis-config.xml";
InputStream inputstream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
}
@Test/*查询name为王昭君的用户*/
public void testMybatis02(){
/*保证每个线程都能获取一次链接*/
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
String name="王昭君";
// 如果不能把凭证结果唯一 使用集合!
List<DemoUser> one = mapper.findOne(name);
System.out.println(one);
sqlSession.close();
}
注意:如果不能把凭证结果唯一 使用集合!
以下映射文件对应三种方式的mapper接口方法
List <DemoUser> findSed(DemoUser demoUser);
List<DemoUser> find1(Map<String, Object> map);
List<DemoUser> find2(@Param("sex") String sex, @Param("age") int age);
}
方式一
@Test
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource="mybatis/mybatis-config.xml";
InputStream inputstream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
}
@Test/*查询sex为女 age>18的数据*/
public void testMybatis03(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
/*1.方式1*/
DemoUser demoUser=new DemoUser(null,null,18,"女");
/*2.方式2*/
DemoUser demoUser1=new DemoUser();
demoUser1.setSex("女").setAge(18);
/*面向对象开发*/
List <DemoUser> de = mapper.findSed(demoUser);
System.out.println(de);
sqlSession.close();
}
sql /#{属性}
<select id="findSed" resultType="com.jt.pojo.DemoUser" >
select * from demo_user where sex=#{sex} and age >#{age}
</select>
方式2:
@Test/*方式2*/
public void testMybatis04(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
Map<String, Object> map=new HashMap<>();
map.put("sex", "女");
map.put("age", 18);
List<DemoUser> mapper1 = mapper.find1(map);
System.out.println(mapper1);
sqlSession.close();
}
映射文件
<select id="find1" resultType="com.jt.pojo.DemoUser" >
select * from demo_user where sex=#{sex} and age >#{age}
</select>
方式3:
@Test/*方式3*/
public void testMybatis05(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
String sex="女";
int age=18;
List<DemoUser> mapper2 = mapper.find2(sex, age);
System.out.println(mapper2);
sqlSession.close();
}
<select id="find2" resultType="com.jt.pojo.DemoUser" >
select * from demo_user where sex=#{sex} and age >#{age}
</select>
MyBatis遇到多值传参时,默认采用下标的方式取值,MyBatis只支持单值传参,多值的话需要封装成单值
封装策略:
1.封装为实体对象 可以通过/#{属性}格式直接获取属性值
2.更为常用的方式 Map集合 可以通过/#{属性}格式直接获取属性值
3.非要多值传参 使用注解 @Param("key")-----将多值封装成map集合
使用/#{} 有预编译的效果,防止sql攻击
mybatis默认给参数添加引号
使用字段为参数时,使用${},慎用,可能出现sql攻击问题
代码实现
Test层
@Test
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource="mybatis/mybatis-config.xml";
InputStream inputstream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
}
@Test/*以age order by升序排列*/
public void testMybatis06(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
String column="age";
List <DemoUser> list=mapper.order(column);
System.out.println(list);
sqlSession.close();
}
mapper映射文件
<select id="order" resultType="com.jt.pojo.DemoUser" >
select * from demo_user order by ${column}
</select>
mapper接口
List<DemoUser> order(String column);
关于事务的说明
mybatis中的更新事务默认开启,需要手动提交事务
//自动提交事务 aqlSessionFactoty.openSession(true)//
不提交无需回滚,因为默认不成功自动回滚
代码实现
@Test
public void testMybatis07(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser demoUser=new DemoUser(null,"康娜",8000,"女");
int h=mapper.insert1(demoUser);
System.out.println("影响行数"+h);
if(h>0){
sqlSession.commit();
}
sqlSession.close();
}
@Test
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource="mybatis/mybatis-config.xml";
InputStream inputstream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
}
int insert1(DemoUser demoUser);
<insert id="insert1">
insert into demo_user value (null,#{name},#{age},#{sex})
</insert>
代码实现
@Test/*删除name=康娜的数据*/
public void testMybatis09(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
String name="康娜";
int h=mapper.delete1(name);
if(h>0){
sqlSession.commit();
}
sqlSession.close();
}
<delete id="delete1">
delete from demo_user where name=#{name}
</delete>
int delete1(String name);
代码实现
@Test/*把id=1 的数据name改为“守善大师” age=5000*/
public void testMybatis08(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser demoUser=new DemoUser(1,"守善大师",500,null);
int h=mapper.update1(demoUser);
System.out.println("影响行数"+h);
if(h>0){
sqlSession.commit();
}
sqlSession.close();
}
<update id="update1">
update demo_user set age=#{age}, name=#{name} where id=#{id}
</update>
int update1(DemoUser demoUser);
xml文件中的转义字符
> 大于 < 小于
& &
<![CDATA[........................]]>
<!--根据age查询数据
xml文件中的转义字符
> 大于
< 小于
& &
如果sql中含有大量的转义字符 建议使用转义标签体
语法:<![CDATA[.....]]>
-->
<select id="findage" resultType="com.jt.pojo.DemoUser">
<![CDATA[select * from demo_user where age > #{minage} and age < #{maxage}]]>
</select>
/*批量删除id为227、228、229的数据
需要删除相同的多个数据 封装方法:
1.array
2.list
3.map
*/
@Test
public void test2(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
int [] ids={227,228,229};
mapper.deleteids(ids);
System.out.println("删除成功");
}
<delete id="deleteids">
delete from demo_user where id in(
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
void deleteids(int[] ids);
1.collection表示集合名称
数组→array List集合→list Map集合→map的key
2.item 为每次遍历的数据的形参变量
3.open 循环开始的标签
4.close 循环结束的标签
5.index 循环遍历的下标
6.separator 循环遍历的分割符
代码实现
@Test/*2.List 删除id 为182 194 196的数据*/
public void test3(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
List list=new ArrayList();
list.add(182);
list.add(194);
list.add(196);
mapper.deleteids2(list);
System.out.println("删除成功");
}
void deleteids2(List list);
<delete id="deleteids2">
delete from demo_user where id in(
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
</delete>
代码实现
@Test
/*3.map 有时业务需求导致需要使用map封装list */
public void test4(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
List list=new ArrayList();
list.add(182);
list.add(194);
list.add(196);
Map map=new HashMap();
map.put("ids",list);
mapper.deleteids3(map);
System.out.println("删除成功");
}
void deleteids3(Map map);
<delete id="deleteids3">
delete from demo_user where id in(
<foreach collection="ids" separator=",">
#{id}
</foreach>
)
</delete>
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_55740233/article/details/120448668
内容来源于网络,如有侵权,请联系作者删除!